https://scut.online/problem.php?id=77
其实是一个单点更新问题,
重要的减小复杂度的就是要知道一个节点最多被用64次就为0了, 还有就是 如果遇到sum【rt】=0;就直接返回0;
自己再敲得时候还是遇到了些问题,,,自己对于ql,qr又没有非常清楚地没有错误。。结果查错差了挺久的
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
const int mod=1000000007;
const int maxn=1e5+5;
ll a[maxn];
int n,m;
ll sum[maxn*4];
void up(int rt){
sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=a[l];return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
up(rt);
}
void update(int ql,int qr,int l,int r,int rt){
if(sum[rt]==0)return;
if(ql<=l&&r<=qr){
if(l==r){
sum[rt]>>=1;
return;
}
}
int mid=(l+r)>>1;
if(ql<=mid)update(ql,qr,l,mid,rt<<1);//这个地方居然写l<=mid了。
if(mid<qr)update(ql,qr,mid+1,r,rt<<1|1);
/*
for(int i=1;i<=2*n;++i)
cout<<sum[i]<<' ';cout<<endl;
*/
up(rt);
}
ll query(int ql,int qr,int l,int r,int rt){
if(sum[rt]==0)return 0;
if(ql<=l&&r<=qr){
return sum[rt]%mod;
}
ll ret=0;
int mid=(l+r)>>1;
if(ql<=mid)ret+=query(ql,qr,l,mid,rt<<1);
if(mid<qr)ret+=query(ql,qr,mid+1,r,rt<<1|1);
return ret%mod;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
build(1,n,1);
for(int i=1;i<=m;++i){
char c[5];
scanf("%s",&c);
if(c[0]=='U'){
int l,r;
scanf("%d%d",&l,&r);
update(l,r,1,n,1);
/*
for(int i=1;i<=n;++i){
cout<<a[i]<<' ';
}cout<<endl;
for(int i=1;i<=2*n;++i)
cout<<sum[i]<<' ';
cout<<endl;
*/
}
else{
int l,r;
scanf("%d%d",&l,&r);
/*
for(int i=1;i<=n;++i){
cout<<a[i]<<' ';
}cout<<endl;
for(int i=1;i<=2*n;++i)
cout<<sum[i]<<' ';
cout<<endl;
*/
cout<<query(l,r,1,n,1)<<'\n';
}
}
}
}
501

被折叠的 条评论
为什么被折叠?



