2维莫队为什么TLE 40?
查看原帖
2维莫队为什么TLE 40?
578029
ivyjiao楼主2024/12/15 20:26

感觉能用的卡常方法都用完了啊,大悲

#include<bits/stdc++.h>
using namespace std;
const int N=250001,M=501,Q=60001;
int n,m,b[N],ans[Q],p[M][M],cl,c[M],s[N],sum[M],ccl,cc[N],l,r,u,d;
struct node{
	int u,l,d,r,k,id;
}q[Q];
inline int read(){
	register int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48); 
		ch=getchar();
	}
	return x*f;
}
inline void build(){
	cl=n/pow(m,0.25)/3+1;
	ccl=n+1;
	for(register int i=1;i<=n;++i) c[i]=(i-1)/cl+1;
	for(register int i=1;i<=n*n;++i) cc[i]=(i-1)/ccl+1;
}
inline bool cmp(node x,node y){
    if(c[x.u]!=c[y.u]) return x.u<y.u;
    if(c[x.l]!=c[y.l]) return c[x.u]&1? x.l<y.l:x.l>y.l;
    if(c[x.r]!=c[y.r]) return c[x.l]&1? x.r<y.r:x.r>y.r;
    return c[x.r]&1? x.d<y.d:x.d>y.d;
}
inline int query(int x){
	register int i=1,cnt=0;
	for(;cnt+sum[i]<x&&i<=cc[n*n];++i) cnt+=sum[i];
	i=(i-1)*ccl+1;
	for(;cnt+s[i]<x&&i<=n*n;++i) cnt+=s[i];
	return b[i];
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	n=read();
    m=read();
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=n;++j){
			p[i][j]=read();
			b[++l]=p[i][j];
		}
	}
	sort(b+1,b+1+l);
	l=unique(b+1,b+1+l)-b-1;
	for(register int i=1;i<=n;++i) for(register int j=1;j<=n;++j) p[i][j]=lower_bound(b+1,b+1+l,p[i][j])-b;
	for(register int i=1;i<=m;++i){
        q[i].u=read();
        q[i].l=read();
        q[i].d=read();
        q[i].r=read();
        q[i].k=read();
        q[i].id=i;
    }
	sort(q+1,q+1+m,cmp);
	s[p[1][1]]++;
    sum[cc[p[1][1]]]++;
    l=1,r=1,u=1,d=1;
	for(register int i=1;i<=m;++i){
		for(;r<q[i].r;++r) for(register int i=u;i<=d;++i) ++s[p[i][r+1]],++sum[cc[p[i][r+1]]];
		for(;l>q[i].l;--l) for(register int i=u;i<=d;++i) ++s[p[i][l-1]],++sum[cc[p[i][l-1]]];
		for(;d<q[i].d;++d) for(register int i=l;i<=r;++i) ++s[p[d+1][i]],++sum[cc[p[d+1][i]]];
		for(;u>q[i].u;--u) for(register int i=l;i<=r;++i) ++s[p[u-1][i]],++sum[cc[p[u-1][i]]];
		for(;r>q[i].r;--r) for(register int i=u;i<=d;++i) --s[p[i][r]],--sum[cc[p[i][r]]];
		for(;l<q[i].l;++l) for(register int i=u;i<=d;++i) --s[p[i][l]],--sum[cc[p[i][l]]];
		for(;d>q[i].d;--d) for(register int i=l;i<=r;++i) --s[p[d][i]],--sum[cc[p[d][i]]];
		for(;u<q[i].u;++u) for(register int i=l;i<=r;++i) --s[p[u][i]],--sum[cc[p[u][i]]];
		ans[q[i].id]=query(q[i].k);
	}
	for(register int i=1;i<=m;++i) cout<<ans[i]<<'\n';
}
2024/12/15 20:26
加载中...