求助卡常&申请开大时限&申请缩小空间
查看原帖
求助卡常&申请开大时限&申请缩小空间
748694
yinianxingkong楼主2024/5/2 20:18

rt,理论能过正解应该是 O(n)O(n) 空间,但被卡常,目前没发现过的,O(nn)O(n\sqrt n) 分段可以过,这很不合理,建议缩小空间卡掉 O(n)O(n) 空间,实测可以开 256mb,然后开大时限,暂时不知道开大到多少,我的代码加上指令集卡评测机波动只能 460000 组询问。

然后帮帮孩子吧,真的卡不动了……

帮我卡常我什么都会做的 qwq

因为卡常码风十分奇怪。

// #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#include <immintrin.h>
#include <emmintrin.h>
#include<bits/stdc++.h>
//#define int long long
using namespace std;
namespace fast_IO {
#define IOSIZE 1000000
char ibuf[IOSIZE],obuf[IOSIZE],*p1=ibuf,*p2=ibuf,*p3=obuf;
#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin),p1==p2)?(EOF):(*p1++))
#define putchar(x) ((p3==obuf+IOSIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
#define isdigit(ch) (ch>47&&ch<58)
#define isspace(ch) (ch<33)
#endif
template<typename T>inline T read(){T s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*w;}template<typename T>inline bool read(T&s){s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*=w,1;}inline bool read(char&s){while(s=getchar(),isspace(s));return 1;}inline bool read(char*s){char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))*s++=ch,ch=getchar();*s='\000';return 1;}template<typename T>inline void print(T x){if(x<0)putchar(45),x=-x;if(x>9)print(x/10);putchar(x%10+48);}inline void print(char x){putchar(x);}inline void print(char*x){while(*x)putchar(*x++);}inline void print(const char*x){for(int i=0;x[i];i++)putchar(x[i]);}inline bool read(std::string&s){s="";char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))s+=ch,ch=getchar();return 1;}inline void print(std::string x){for(int i=0,n=x.size();i<n;i++)putchar(x[i]);}inline bool read(bool&b){char ch;while(ch=getchar(),isspace(ch));b=ch^48;return 1;}inline void print(bool b){putchar(b+48);}inline bool read(double&x){int a=0,b=0;char ch=getchar();bool f=0;while(ch<48||ch>57){if(ch==45)f=1;ch=getchar();}while(47<ch&&ch<58){a=(a<<1)+(a<<3)+(ch^48);ch=getchar();}if(ch!=46){x=f?-a:a;return 1;}ch=getchar();while(47<ch&&ch<58){b=(b<<1)+(b<<3)+(ch^48),ch=getchar();}x=b;while(x>1)x/=10;x=f?-a-x:a+x;return 1;}template<typename T,typename...T1>inline int read(T& a,T1&...other){return read(a)+read(other...);}template<typename T,typename...T1>inline void print(T a,T1...other){print(a),print(other...);}struct Fast_IO{~Fast_IO(){fwrite(obuf,p3-obuf,1,stdout);}}io;template<typename T>Fast_IO& operator>>(Fast_IO&io,T&b){return read(b),io;}template<typename T>Fast_IO& operator<<(Fast_IO&io,T b){return print(b),io;}
#define cout io
#define cin io
#define endl '\n'
}using namespace fast_IO;
namespace TYX_YNXK{
	#define il inline
	#define bl bool
	#define ll unsigned long long
	#define vd void
	#define N 500005
	#define INF 0x7fffffff
	#define pii pair<int,int>
	#define pb push_back
	#define MP make_pair
	#define fi first
	#define se second
	#define DEBUG cout<<"You are right,but you are wrong"<<'\n'
	#define END cout<<"You are right,but you are right now"<<'\n'
	const int B=1200,SQ1=45,SQ2=1505;
	int n,m,L[N],R[N],tbelong[N];
	struct naive{
		int x,y,z,id,a;ll b;
		bl operator<(const naive& b)const{return z!=b.z?z<b.z:id<b.id;}
	}p[N];
	int mpx[N],mpy[N];
	struct que{
		int x,y,z,w,id;
		bl operator<(const que& b)const{return z!=b.z?z<b.z:id<b.id;}
	}q[N],q1[N];
	ll ans[N],tmp[N];
	int vz[N],vx[N/B+5][SQ2],vy[N/B+5][SQ2],znxt[N],xnxt[N],ynxt[N];
	#define F1(i,x) for(register int i=1;i<Two_Way_Kuai_belong3[x];++i)
	#define F2(i,x) for(register int i=Two_Way_Kuai_L3[Two_Way_Kuai_belong3[x]];i<Two_Way_Kuai_belong2[x];++i)
	#define F3(i,x) for(register int i=Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]];i<=x;++i)
	#define F4(i,x) for(register int i=Two_Way_Kuai_belong3[n];i>Two_Way_Kuai_belong3[x];--i)
	#define F5(i,x) for(register int i=Two_Way_Kuai_R3[Two_Way_Kuai_belong3[x]];i>Two_Way_Kuai_belong2[x];--i)
	#define F6(i,x,n) for(register int i=belong[n];i>belong[x];--i)
	#define F7(i,x) for(register int i=Furina_R[belong[x]];i>=x;--i)
	#define be2 Two_Way_Kuai_belong2
	#define L2 Two_Way_Kuai_TL2
	#define R2 Two_Way_Kuai_TR2
	inline void Add(__m512i *b,register int l,register int r,ll k) {
		__m512i tmp = _mm512_set1_epi64(k);
		register int x = l>>3, y = r>>3;
		if(x == y) {
			for(register int i=l; i<=r; ++i)	b[i>>3][i&7] += k;
		} else {
			for(register int i=(y<<3); i<=r; ++i)	b[i>>3][i&7] += k;
			for(register int i=x+1; i<=y-1; ++i)	b[i] = _mm512_add_epi64(b[i], tmp);
			for(register int i=(x<<3)+7; i>=l; --i)	b[i>>3][i&7] += k;
		}
	}
	inline ll Query(__m512i *b, register int l, register int r) {
		__m512i tmp = _mm512_set1_epi64(0);
		ll res = 0;
		register int x = l>>3, y = r>>3;
		if(x == y) {
			for(register int i=l; i<=r; ++i)	res += b[i>>3][i&7];
		} else {
			for(register int i=(y<<3); i<=r; ++i)	res += b[i>>3][i&7];
			for(register int i=x+1; i<=y-1; ++i)	tmp = _mm512_add_epi64(b[i], tmp);
			for(register int i=(x<<3)+7; i>=l; --i)	res += b[i>>3][i&7];
			res += tmp[0] + tmp[1] + tmp[2] + tmp[3] + tmp[4] + tmp[5] + tmp[6] + tmp[7];
		}
		return res;
	}
	int Two_Way_Kuai_belong2[N],Two_Way_Kuai_belong3[N],Two_Way_Kuai_TL2[N],Two_Way_Kuai_TR2[N],Two_Way_Kuai_L3[N],Two_Way_Kuai_R3[N];
	ll Two_Way_Kuai_c5[N];
	__m512i Two_Way_Kuai_c1[SQ1][SQ1>>3],Two_Way_Kuai_c2[SQ2][SQ1>>3],Two_Way_Kuai_c3[SQ1][SQ2>>3],Two_Way_Kuai_c4[SQ2][SQ2>>3];
	vector<int> in[SQ2][SQ2];
	il vd Two_Way_Kuai_init(){
		for(register int i=1;i<=n;++i) Two_Way_Kuai_belong2[i]=((i-1)>>10)+1,Two_Way_Kuai_belong3[i]=((i-1)>>15)+1,R2[Two_Way_Kuai_belong2[i]]=i,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[i]]=Two_Way_Kuai_belong2[i];
		for(register int i=n;i>=1;--i) L2[Two_Way_Kuai_belong2[i]]=i,Two_Way_Kuai_L3[Two_Way_Kuai_belong3[i]]=Two_Way_Kuai_belong2[i];
		for(register int i=1;i<=n;++i) in[Two_Way_Kuai_belong2[i]][Two_Way_Kuai_belong2[mpx[i]]].pb(i);
	}
	il vd Two_Way_Kuai_clear(){
		for(register int i=1;i<=Two_Way_Kuai_belong3[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong3[n]>>3;++j) Two_Way_Kuai_c1[i][j]=_mm512_set1_epi64(0);
		for(register int i=1;i<=Two_Way_Kuai_belong2[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong3[n]>>3;++j) Two_Way_Kuai_c2[i][j]=_mm512_set1_epi64(0);
		for(register int i=1;i<=Two_Way_Kuai_belong3[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong2[n]>>3;++j) Two_Way_Kuai_c3[i][j]=_mm512_set1_epi64(0);
		for(register int i=1;i<=Two_Way_Kuai_belong2[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong2[n]>>3;++j) Two_Way_Kuai_c4[i][j]=_mm512_set1_epi64(0);
		for(register int i=1;i<=n;++i) Two_Way_Kuai_c5[i]=0;
	}
	il vd Two_Way_Kuai_update1(register int x,register int y,register int v){
		F1(i,x) Add(Two_Way_Kuai_c1[i],1,Two_Way_Kuai_belong3[y]-1,v);
		F2(i,x) Add(Two_Way_Kuai_c2[i],1,Two_Way_Kuai_belong3[y]-1,v);
		F1(i,x) Add(Two_Way_Kuai_c3[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1,v); 
		F2(i,x) Add(Two_Way_Kuai_c4[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1,v); 
		F3(i,x) if(mpx[i]<=y) Two_Way_Kuai_c5[i]+=v;
		F3(i,y) if(mpy[i]<Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]]) Two_Way_Kuai_c5[mpy[i]]+=v;
	}
	il ll Two_Way_Kuai_query1(register int x,register int y){
		register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
		return Two_Way_Kuai_c1[a][c>>3][c&7]+Two_Way_Kuai_c2[b][c>>3][c&7]+Two_Way_Kuai_c3[a][d>>3][d&7]+Two_Way_Kuai_c4[b][d>>3][d&7]+Two_Way_Kuai_c5[x];
	}
	il vd Two_Way_Kuai_update2(register int x,register int y,ll v){
		register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
		Two_Way_Kuai_c1[a][c>>3][c&7]+=v,Two_Way_Kuai_c2[b][c>>3][c&7]+=v,Two_Way_Kuai_c3[a][d>>3][d&7]+=v,Two_Way_Kuai_c4[b][d>>3][d&7]+=v,Two_Way_Kuai_c5[x]+=v;
	}
	il ll Two_Way_Kuai_query2(register int x,register int y){
		ll res=0;
		F1(i,x) res+=Query(Two_Way_Kuai_c1[i],1,Two_Way_Kuai_belong3[y]-1);
		F2(i,x) res+=Query(Two_Way_Kuai_c2[i],1,Two_Way_Kuai_belong3[y]-1);
		F1(i,x) res+=Query(Two_Way_Kuai_c3[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1); 
		F2(i,x) res+=Query(Two_Way_Kuai_c4[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1); 
		F3(i,x) if(mpx[i]<=y) res+=Two_Way_Kuai_c5[i];
		F3(i,y) if(mpy[i]<Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]]) res+=Two_Way_Kuai_c5[mpy[i]];
		return res;
	}
	il vd Two_Way_Kuai_update3(register int x,register int y,register int v){
		F4(i,x) Add(Two_Way_Kuai_c1[i],Two_Way_Kuai_belong3[y]+1,Two_Way_Kuai_belong3[n],v);
		F5(i,x) Add(Two_Way_Kuai_c2[i],Two_Way_Kuai_belong3[y]+1,Two_Way_Kuai_belong3[n],v);
		F4(i,x) Add(Two_Way_Kuai_c3[i],Two_Way_Kuai_belong2[y]+1,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[y]],v);
		F5(i,x) Add(Two_Way_Kuai_c4[i],Two_Way_Kuai_belong2[y]+1,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[y]],v);
		Two_Way_Kuai_c5[x]+=v;
	}
	il ll Two_Way_Kuai_query3(register int x,register int y){
		register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
		ll res=Two_Way_Kuai_c1[a][c>>3][c&7]+Two_Way_Kuai_c2[b][c>>3][c&7]+Two_Way_Kuai_c3[a][d>>3][d&7]+Two_Way_Kuai_c4[b][d>>3][d&7];
		for(vector<int>::iterator it=in[b][d].begin();it!=in[b][d].end();++it) if(*it<=x&&mpx[*it]<=y) res+=Two_Way_Kuai_c5[*it];
		return res;
	}
	int Furina_n,Furina_m;
	ll c1[SQ1][SQ1],c2[SQ2][SQ1],c3[SQ1][SQ2],c4[SQ2][SQ2];
	int belong[N],Furina_R[N];
	il vd init(){
		for(register int i=1;i<=n;++i) belong[i]=((i-1)>>5)+1,Furina_R[belong[i]]=i;
	}
	il vd clear(){
		for(register int i=1;i<=belong[Furina_n];++i) for(register int j=1;j<=belong[Furina_m];++j) c1[i][j]=0;
		for(register int i=1;i<=Furina_n;++i) for(register int j=1;j<=belong[Furina_m];++j) c2[i][j]=0;
		for(register int i=1;i<=belong[Furina_n];++i) for(register int j=1;j<=Furina_m;++j) c3[i][j]=0;
		for(register int i=1;i<=Furina_n;++i) for(register int j=1;j<=Furina_m;++j) c4[i][j]=0;
	}
	il vd update4(register int x,register int y,register int v){
		F6(i,x,Furina_n) F6(j,y,Furina_m) c1[i][j]+=v;
		F7(i,x) F6(j,y,Furina_m) c2[i][j]+=v;
		F6(i,x,Furina_n) F7(j,y) c3[i][j]+=v;
		F7(i,x) F7(j,y) c4[i][j]+=v;
	}
	il ll query4(register int x,register int y){
		if(!x||!y) return 0;
		register int a=belong[x],c=belong[y];
		return c1[a][c]+c2[x][c]+c3[a][y]+c4[x][y];
	}
	signed main(){
		cin>>n>>m;m=min(m,460000);
		for(register int i=1;i<=n;++i) cin>>p[i].x>>p[i].y>>p[i].z>>p[i].a,mpx[p[i].x]=p[i].y,mpy[p[i].y]=p[i].x,p[i].id=i;
		sort(p+1,p+1+n);
		for(register int i=1;i<=m;++i) cin>>q[i].x>>q[i].y>>q[i].z>>q[i].w,q[i].id=i,q1[i]=q[i];
		sort(q1+1,q1+1+m);
		Two_Way_Kuai_init();init();
		for(register int tim=1,Tim=(m-1)/B+1;tim<=Tim;++tim){
			L[tim]=(tim-1)*B+1,R[tim]=tim*B;if(tim==Tim) R[tim]=m;
			for(register int i=L[tim];i<=R[tim];++i) tbelong[i]=tim;
			if(tim!=1){
				for(register int i=1,pos=1;i<=m;++i){
					for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(p[pos].b) Two_Way_Kuai_update2(p[pos].x,p[pos].y,p[pos].b);
					if(L[tim]<=q1[i].id&&q1[i].id<=R[tim]) ans[q1[i].id]+=Two_Way_Kuai_query2(q1[i].x,q1[i].y);
				}
				Two_Way_Kuai_clear();
			}
			for(register int i=n,pos=m;i>=1;--i){
				for(;q1[pos].z>=p[i].z;--pos) if(pos&&L[tim]<=q1[pos].id&&q1[pos].id<=R[tim]&&q1[pos].w) Two_Way_Kuai_update1(q1[pos].x,q1[pos].y,q1[pos].w);
				p[i].b+=Two_Way_Kuai_query1(p[i].x,p[i].y)*p[i].a;
			}
			Two_Way_Kuai_clear();
		}
		for(register int i=1;i<=m;++i) znxt[i]=vz[q[i].z],vz[q[i].z]=i;
		for(register int i=1;i<=n;++i){
			Two_Way_Kuai_update3(p[i].x,p[i].y,p[i].a);
			for(register int it=vz[i];it;it=znxt[it]){
				register int I=it,tim=tbelong[I];
				for(register int j=L[tim];j<I;++j) if(q[j].z>q[I].z&&q[j].w) ans[I]+=Two_Way_Kuai_query3(min(q[j].x,q[I].x),min(q[j].y,q[I].y))*q[j].w;
				if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(q[j].z>=q[I].z) ans[j]+=Two_Way_Kuai_query3(min(q[j].x,q[I].x),min(q[j].y,q[I].y))*q[I].w;
			}
		}
		for(register int i=1;i<=m;++i) xnxt[i]=vx[(i-1)/B+1][be2[q[i].x]],ynxt[i]=vy[(i-1)/B+1][be2[q[i].y]],vx[(i-1)/B+1][be2[q[i].x]]=vy[(i-1)/B+1][be2[q[i].y]]=i;
		for(register int Be=1;Be<=be2[n];++Be){
			Furina_n=R2[Be]-L2[Be]+1,Furina_m=be2[n];
			clear();
			for(register int i=1,pos=1;i<=m;++i){
				if(be2[q1[i].x]<Be) continue;
				for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(be2[p[pos].x]==Be) update4(p[pos].x-L2[Be]+1,be2[p[pos].y],p[pos].a);
				register int I=q1[i].id,tim=tbelong[I];
				if(be2[q1[i].x]==Be){
					for(register int j=L[tim];j<I;++j) if(be2[q[j].x]>=Be&&q[j].w&&q[I].z<=q[j].z) ans[I]+=query4(min(q[I].x,q[j].x)-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[j].w;
					if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(be2[q[j].x]>=Be&&(q[I].z<q[j].z||(q[I].z==q[j].z&&be2[q[j].x]>Be))) ans[j]+=query4(min(q[I].x,q[j].x)-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[I].w;
				}else{
					for(register int it=vx[tim][Be];it;it=xnxt[it]){
						register int j=it;
						if(q[min(j,I)].w&&q[I].z<q[j].z) ans[max(j,I)]+=query4(q[j].x-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[min(j,I)].w;
					}
				}
			}
		}
		for(register int Be=1;Be<=be2[n];++Be){
			Furina_m=R2[Be]-L2[Be]+1,Furina_n=be2[n];
			clear();
			for(register int i=1,pos=1;i<=m;++i){
				if(be2[q1[i].y]<Be) continue;
				for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(be2[p[pos].y]==Be) update4(be2[p[pos].x],p[pos].y-L2[Be]+1,p[pos].a);
				register int I=q1[i].id,tim=tbelong[I];
				if(be2[q1[i].y]==Be){
					for(register int j=L[tim];j<I;++j) if(be2[q[j].y]>=Be&&q[j].w&&q[I].z<=q[j].z) ans[I]+=query4(be2[min(q[I].x,q[j].x)]-1,min(q[I].y,q[j].y)-L2[Be]+1)*q[j].w;
					if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(be2[q[j].y]>=Be&&(q[I].z<q[j].z||(q[I].z==q[j].z&&be2[q[j].y]>Be))) ans[j]+=query4(be2[min(q[I].x,q[j].x)]-1,min(q[I].y,q[j].y)-L2[Be]+1)*q[I].w;
				}else{
					for(register int it=vy[tim][Be];it;it=ynxt[it]){
						register int j=it;
						if(q[min(j,I)].w&&q[I].z<q[j].z) ans[max(j,I)]+=query4(be2[min(q[I].x,q[j].x)]-1,q[j].y-L2[Be]+1)*q[min(j,I)].w;
					}
				}
			}
		}
		for(register int i=1;i<=m;++i) cout<<ans[i]<<'\n';
		return 0;
	}
}
signed main(){
	TYX_YNXK::main();
	return 0;
}
2024/5/2 20:18
加载中...