需 氧 程 序
查看原帖
需 氧 程 序
184271
l55584楼主2022/8/15 18:23

RT

加O2过了,不加连WA带T

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=17e4+5;
int cnt;
int n;
inline char gc()
{
	static char BB[100000],*S=BB,*T=BB;
	return S==T&&(T=(S=BB)+fread(BB,1,100000,stdin),S==T)?EOF:*S++;
}
int read() {
	int x=0;
	char ch=gc();
	while(ch<'0'||ch>'9') ch=gc();
	while(ch<='9'&&ch>='0') {
		x=x*10+ch-48;
		ch=gc();
	}
	return x;
}
struct node
{
	int a,b,c;
	int cnt;
	int q;
};node a[N<<2];
bool cmp1(node x,node y)
{
	if(x.a!=y.a) return x.a<y.a;
	if(x.b!=y.b) return x.b<y.b;
	if(x.c!=y.c) return x.c<y.c;
	return x.q<y.q;
}
bool cmp2(node x,node y)
{
	if(x.b!=y.b) return x.b<y.b;
}
struct tree
{
	int tr[2000001];
	int lowbit(int t){return t&(-t);}
	void add(int loc,int val){while(loc<=n){tr[loc]+=val;loc+=lowbit(loc);}}
	int query(int loc){int ret=0;while(loc){ret+=tr[loc];loc-=lowbit(loc);}return ret;}
}T;
int ret[N<<2],top;
void cdq(int l=1,int r=cnt)
{
	if(l==r) return;
	int mid=(l+r)>>1;
	cdq(l,mid),cdq(mid+1,r);
	sort(a+l,a+mid+1,cmp2);sort(a+mid+1,a+1+r,cmp2);
	int j=l;
	for(int i=mid+1;i<=r;++i)
	{
		while(a[i].b>=a[j].b&&j<=mid){
			T.add(a[j].c,a[j].cnt);
			j++;
		}
		ret[a[i].q]+=T.query(a[i].c);
	}
	for(int i=l;i<j;++i) 
	T.add(a[i].c,-a[i].cnt);
}
void init()
{
	read();n=read()+1;
	int opt,x,y,x2,y2,num;
	int time=0;
	while(1)
	{
		time++;
		opt=read();
		if(opt==3) break;
		if(opt==1)
		{
			x=read()+1;y=read()+1;num=read();
			a[++cnt]=node{time,x,y,num,0};
		}
		if(opt==2)
		{
			x=read()+1;y=read()+1;x2=read()+1;y2=read()+1;
			a[++cnt]=node{time,x2,y2,0,++top};
			a[++cnt]=node{time,x-1,y-1,0,++top};
			a[++cnt]=node{time,x-1,y2,0,++top};
			a[++cnt]=node{time,x2,y-1,0,++top};
		}
	}
}
int main()
{
//	freopen("in.in","r",stdin);
	init();
	sort(a+1,a+1+cnt,cmp1);
	cdq();
	for(int i=1;i<=top;i+=4)
	{
		cout<<ret[i]+ret[i+1]-ret[i+2]-ret[i+3]<<"\n";
	}
	return 0;
}

求解惑

2022/8/15 18:23
加载中...