题解的思路在讨论版都有,和出题人的思路是一样的,这里我就发一份用线段树过的题解(899ms)。
同时也希望大家多逛逛我的博客(https://www.cnblogs.com/Mmasker/ )。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
const int MAXN = 4e6+10;
const int T = 3e5+10;
const double EPS = 1e-12;
const ll mod = 1e9+7;
int Q;
ll a[MAXN<<2][6];
inline void Update(int l,int r,int rt,int p,int v,int t,int m,int x){
if(l==r&&l==p){
if(x==0)a[rt][x]=(a[rt][x]+1ll*m*v*v)%mod;
else if(x==1)a[rt][x]=(a[rt][x]+2ll*m*v*10)%mod;
else if(x==2)a[rt][x]=(a[rt][x]+2ll*m*v*10*t)%mod;
else if(x==3)a[rt][x]=(a[rt][x]+1ll*m*100)%mod;
else if(x==4)a[rt][x]=(a[rt][x]+2ll*t*m*100)%mod;
else a[rt][x]=(a[rt][x]+1ll*m*t*t*100)%mod;
return ;
}
int mid=(l+r)/2;
if(p<=mid)Update(ls,p,v,t,m,x);
else Update(rs,p,v,t,m,x);
a[rt][x]=(a[rt<<1][x]+a[rt<<1|1][x])%mod;
}
inline ll Query(int l,int r,int rt,int p,int x){
if(p>=r)return a[rt][x];
int mid=(l+r)/2;
ll ans=0;
if(p>mid)ans=(ans+Query(rs,p,x))%mod;
ans=(ans+Query(ls,p,x))%mod;
return ans;
}
int main()
{
scanf("%d",&Q);
while(Q--){
int op;
scanf("%d",&op);
if(op==1){
int v,t,m;
scanf("%d %d %d",&v,&t,&m);
int V=v+10*(T-t);
Update(1,4e6,1,V,v,t,m,0);
Update(1,4e6,1,V,v,t,m,1);
Update(1,4e6,1,V,v,t,m,2);
Update(1,4e6,1,V,v,t,m,3);
Update(1,4e6,1,V,v,t,m,4);
Update(1,4e6,1,V,v,t,m,5);
}
else{
int v,t;
scanf("%d %d",&v,&t);
int V=v+10*(T-t);
ll ans=0;
ans=(ans+Query(1,4e6,1,V,0))%mod;
ans=(ans+Query(1,4e6,1,V,1)*t)%mod;
ans=(ans-Query(1,4e6,1,V,2))%mod;
ans=(ans+Query(1,4e6,1,V,3)*t%mod*t%mod)%mod;
ans=(ans-Query(1,4e6,1,V,4)*t)%mod;
ans=(ans+Query(1,4e6,1,V,5))%mod;
printf("%lld\n",(ans+mod)%mod);
}
}
}

京公网安备 11010502036488号