Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
41680 LYLAKIOI 【BJ】T2 C++ 运行超时 80 4000 MS 23644 KB 4176 2026-05-27 15:18:30

Tests(16/20):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int maxn=1e5+10; int n,q,a[maxn],b[maxn],c[maxn],d[maxn],pre[maxn],nxt[maxn]; bitset<maxn>bs; vector<pi>Q[maxn]; vector<int>ins[maxn]; ll res[maxn]; vector<tuple<int,int,int> >ins2[maxn]; int Y[maxn]; struct tree{ int n,w[maxn],w2[maxn],w3[maxn],lz[maxn],ad[maxn]; int all; #define bel(x) ((x-1>>5)+1) void bd(int _n){ n=_n,all=0; up(i,1,n)w[i]=Y[i+1]-Y[i],ad[i]=w2[i]=w3[i]=0; up(i,1,bel(n))lz[i]=0; up(i,1,n)w2[bel(i)]+=w[i]; } void add(int l,int r){ if(bel(l)==bel(r)){ int u=bel(l); if(!lz[u])all-=w3[u]; up(i,l,r){if(!ad[i])w3[u]+=w[i];ad[i]++;} if(!lz[u])all+=w3[u]; return; } add(l,bel(l)<<5);add(((bel(r)-1)<<5)+1,r); up(i,bel(l)+1,bel(r)-1)if(!(lz[i]++))all+=w2[i]-w3[i]; } void sub(int l,int r){ if(bel(l)==bel(r)){ int u=bel(l); if(!lz[u])all-=w3[u]; up(i,l,r){ad[i]--;if(!ad[i])w3[u]-=w[i];} if(!lz[u])all+=w3[u]; return; } sub(l,bel(l)<<5);sub(((bel(r)-1)<<5)+1,r); up(i,bel(l)+1,bel(r)-1)if(!(--lz[i]))all+=w3[i]-w2[i]; } }t; typedef unsigned long long ull; mt19937_64 rnd(0); ull v[maxn]; unordered_map<ull,ll>ans; int X[maxn<<1],YY[maxn<<1]; int cx[maxn<<1],cy[maxn<<1]; int vx[maxn],vy[maxn]; int ctx[maxn]; bitset<maxn*2>bsx,bsy; int nd[maxn],top; ll force(){ ull h=0;up(i,1,top)h^=v[nd[i]]; if(ans.count(h))return ans[h]; bsx.reset(),bsy.reset(); up(i,1,top){int p=nd[i];bsx[a[p]]=bsx[b[p]]=bsy[c[p]]=bsy[d[p]]=1;} int u1=0;for(int i=bsx._Find_first();i<maxn*2;i=bsx._Find_next(i))vx[cx[i]=++u1]=i; int u2=0;for(int i=bsy._Find_first();i<maxn*2;i=bsy._Find_next(i))vy[cy[i]=++u2]=i; up(i,0,u1)ins2[i].clear(),ctx[i]=0; up(i,1,top){ int p=nd[i]; int A=cx[a[p]],B=cx[b[p]]; ctx[A]++,ctx[B]++; } up(i,0,u1)ins2[i].reserve(ctx[i]); up(i,1,top){ int p=nd[i]; int A=cx[a[p]],B=cx[b[p]],C=cy[c[p]],D=cy[d[p]]; ins2[A].eb(C,D,1),ins2[B].eb(C,D,-1); } up(i,1,u2)Y[i]=YY[vy[i]];t.bd(u2-1); ll res=0; up(i,1,u1-1){ for(auto [l,r,v]:ins2[i]) if(v==1)t.add(l,r-1);else t.sub(l,r-1); res+=(X[vx[i+1]]-X[vx[i]])*1ll*t.all; } return ans[h]=res; } void slv(){ read(),n=read(),q=read(); up(i,1,n)a[i]=read(),c[i]=read(),b[i]=read(),d[i]=read(),v[i]=rnd(); vector<int>v1,v2; up(i,1,n)v1.eb(a[i]),v1.eb(b[i]),v2.eb(c[i]),v2.eb(d[i]); sort(v1.begin(),v1.end()),sort(v2.begin(),v2.end()); up(i,0,2*n-1)X[i]=v1[i],YY[i]=v2[i]; up(i,1,n){ a[i]=lower_bound(v1.begin(),v1.end(),a[i])-v1.begin(); b[i]=lower_bound(v1.begin(),v1.end(),b[i])-v1.begin(); c[i]=lower_bound(v2.begin(),v2.end(),c[i])-v2.begin(); d[i]=lower_bound(v2.begin(),v2.end(),d[i])-v2.begin(); } up(i,1,n){ pre[i]=0,nxt[i]=n+1; down(j,i-1,1)if(a[j]<=a[i]&&b[j]>=b[i]&&c[j]<=c[i]&&d[j]>=d[i]){pre[i]=j;break;} up(j,i+1,n)if(a[j]<=a[i]&&b[j]>=b[i]&&c[j]<=c[i]&&d[j]>=d[i]){nxt[i]=j;break;} ins[pre[i]].eb(i); } up(i,1,q){ int l=read(),r=read(); Q[l].eb(r,i); } down(i,n,1){ bs[i]=1;for(int p:ins[i])bs[p]=0; for(auto [r,id]:Q[i]){ top=0; for(int u=i;u<=r;u=bs._Find_next(u)) if(nxt[u]>r)nd[++top]=u; res[id]=force(); } } up(i,1,q)printf("%lld\n",res[i]); } int main(){ slv(); return 0; }


测评信息: