敌兵布阵
#include <cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=55555;
int sum[maxn<<2];
void pushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){//l,r是区间大小
if(l==r){
printf("hello\n");
scanf("%d",&sum[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushUp(rt);
}
void update(int p,int add,int l,int r,int rt){
if(l==r){
sum[rt]+=add;
return;
}
int m=(l+r)>>1;
if(p<=m)update(p,add,lson);
else update(p,add,rson);
pushUp(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m=(l+r)>>1;
int ret=0;
if(L<=m)ret+=query(L,R,lson);
if(R>m)ret+=query(L,R,rson);
return ret;
}
int main(){
int n;
scanf("%d",&n);
build(1,n,1);
char op[10];
while(scanf("%s",op)){
if(op[0]=='E')break;
int a,b;
scanf("%d%d",&a,&b);
if(op[0]=='Q')printf("%d\n",query(a,b,1,n,1));
else if(op[0]=='S')update(a,-b,1,n,1);
else update(a,b,1,n,1);
}
return 0;
}
lazy操作
#include <cstdio>
#include <algorithm>
uaing namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
const int maxn=111111;
LL add[maxn<<2];
LL sum[maxn<<2];
void pushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushDown(int rt,int m){
if(add[rt]){
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
sum[rt<<1]+=add[rt]*(m-(m>>1));
sum[rt<<1|1]+=add[rt]*(m>>1);
add[rt]=0;
}
}
void build(int l,int r,int rt){//l,r,rt是区间信息
add[rt]=0;
if(l==r){
scanf("%lld",&sum[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushUp(rt);
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
add[rt]+=c;
sum[rt]+=(LL)c*(r-l+1);
return ;
}
pushDown(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m)update(L,R,c,lson);
if(R>m)update(L,R,c,rson);
pushUp(rt);
}
LL query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
pushDown(rt,r-l+1);
int m=(l+r)>>1;
LL ret=0;
if(L<=m)ret+=query(L,R,lson);
if(R>m)ret+=query(L,R,rson);
return ret;
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
build(1,n,1);
while(q--){
char op[2];
int a,b,c;
scanf("%s",op);
if(op[0]=='Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",query(a,b,1,n,1));
}else{
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,1,n,1);
}
}
return 0;
}
离散化
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=11111; bool hash[maxn]; int li[maxn],ri[maxn]; int X[maxn*3]; int col[maxn<<4]; int cnt; void pushDown(int rt){ if(col[rt]!=-1){ col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; } } void update(int L,int R,int c,int l,int r,int rt){ //update(l,r,i,0,m-1,1); if(L<=l&&r<=R){ col[rt]=c; return ; } pushDown(rt); int m=(l+r)>>1; if(L<=m)update(L,R,c,lson); if(m<R)update(L,R,c,rson); } void query(int l,int r,int rt){ if(col[rt]!=-1){ if(!hash[col[rt]])cnt++; hash[col[rt]]=true; return; } if(l==r)return; int m=(l+r)>>1; query(lson); query(rson); } int Bin(int key,int n,int X[]){ int l=0,r=n-1; while(l<=r){ int m=(l+r)>>1; if(X[m]==key)return m; if(X[m]<key)l=m+1; else r=m-1; } return -1; } int main(){ //freopen("./in.txt","r",stdin); int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); int i,nn=0; for(i=0;i<n;i++){ scanf("%d%d",&li[i],&ri[i]); X[nn++]=--li[i]; X[nn++]=ri[i]; } sort(X,X+nn); int m=1; for(i=1;i<nn;i++){ if(X[i]!=X[i-1])X[m++]=X[i]; } memset(col,-1,sizeof(col)); for(i=0;i<n;i++){ int l=Bin(li[i],m,X); int r=Bin(ri[i],m,X); //printf("%d %d\n",l,r); update(l,r-1,i,0,m-1,1); } cnt=0; memset(hash,false,sizeof(hash)); query(0,m-1,1); printf("%d\n",cnt); } return 0; }