为什么输出0
查看原帖
为什么输出0
291604
王茗仟楼主2022/8/26 18:49
 #include<bits/stdc++.h>
#define il inline
#define re register
using namespace std;
il int read()
{
    re int x=0,f=1;re char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
    return x*f;
}
const int maxn=200099;
const int maxm=2000007;

struct node{
	int tim,x,y,val,id;	
}e[maxn];

int cnt,a[maxm],w;

void adds(int tim,int x,int y,int val,int id){
	e[cnt].tim=tim;
	e[cnt].x=x;
	e[cnt].y=y;
	e[cnt].val=val;
	e[cnt].id=id;
}

int lowbit(int x){
	return (x)&(-x);
}

il void add(int x,int v){
	while(x<=w){
		a[x]+=v;
		x+=lowbit(x);
	}
}

il int query(int x){
	int ans=0;
	while(x){
		ans+=a[x];
		x-=lowbit(x);
	}
	return ans;
}

bool cmp1(node a,node b){
	if(a.x==b.x) return a.y<b.y;
	else return a.x<b.y;
}

bool cmp(node a,node b){
	return a.tim<b.tim;
}



il void CDQ(int l,int r){
	if(l==r) return ;
	int mid=(l+r)>>1;
	CDQ(l,mid);
	CDQ(mid+1,r);
	sort(e+l,e+mid+1,cmp1);
	sort(e+mid+1,e+r+1,cmp1);
	int i=l,j=mid+1,k=l;
	for(;j<=r;j++){
		while(e[i].x<=e[j].x&&i<=mid){
			if(e[i].id==0){
				add(e[i].y,e[i].val);
			}
			++i;
		}
		if(e[j].id==1){
				e[j].val+=query(e[j].y);
			}
	}
	for(j=l;j<i;j++){
		if(e[j].id==0) add(e[j].y,-e[j].val);
	}
}



int main(){
	read(),w=read()+1;
	int opt=read();
	while(opt!=3){
		if(opt==1){
			int x=read()+1,y=read()+1,val=read();
			adds(++cnt,x,y,val,0);
		}
		else{
			int x1=read(),y1=read(),x2=read()+1,y2=read()+1;
			adds(++cnt,x1,y1,0,1);
			adds(++cnt,x2,y2,0,1);
			adds(++cnt,x2,y1,0,1);
			adds(++cnt,x1,y2,0,1);
		}
		opt=read();
	}
	CDQ(1,cnt);
	sort(e+1,e+cnt+1,cmp);
	for(re int i=1;i<=cnt;i++){
		if(e[i].id==1){
			cout<<e[i].val+e[i+1].val-e[i+2].val-e[i+3].val<<endl;
			i+=3;
		}
	}
	return 0;
}








为什么会输出0啊,救命救命

2022/8/26 18:49
加载中...