做这个题唯一收获的是一个巨大的bug
此代码自带巨大bug
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<map> #include<algorithm> #include<iostream> #define T 9822222 #define lowbit(x) (x&(-x)) using namespace std; int sc() { int i=0;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i; } int tr[T][2],a[500003],root[500003],size[T]; int n,m,cnt,mx,q; void insert(int lx,int &x,int l,int r,int v) { if(!x)x=++cnt; size[x]=size[lx]+1; if(l==r)return; int mid=l+r>>1; if(v<=mid) { tr[x][1]=tr[lx][1]; insert(tr[lx][0],tr[x][0],l,mid,v); } else { tr[x][0]=tr[lx][0]; insert(tr[lx][1],tr[x][1],mid+1,r,v); } } int query(int x,int y,int l,int r,int v) { if(l==r)return l; int lx=tr[x][0],rx=tr[x][1]; int ly=tr[y][0],ry=tr[y][1]; int mid=l+r>>1; if(size[ly]-size[lx]>v) return query(lx,ly,l,mid,v); if(size[ry]-size[rx]>v) return query(rx,ry,mid+1,r,v); return 0; } int main() { n=sc();mx=n;m=sc(); for(int i=1;i<=n;i++) { a[i]=sc(); insert(root[i-1],root[i],1,mx,a[i]); } for(int i=1;i<=m;i++) { int l=sc(),r=sc(); int x=query(root[l-1],root[r],1,mx,(r-l+1)/2); printf("%d\n",x); } return 0; }
其实就是k大值查询的一个小变形
yy了一下bug的原因
数组开小了 导致取地址的时候把m的地址给取了然后数就变了
然后就跪了 只需要把数组开大一点即可
建议1000W 开个980W跪了
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<map> #include<algorithm> #include<iostream> #define T 10000005 #define lowbit(x) (x&(-x)) using namespace std; int sc() { int i=0;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i; } int tr[T][2],a[500003],root[500003],size[T]; int n,m,cnt,mx,q; void insert(int lx,int &x,int l,int r,int v) { if(!x)x=++cnt; size[x]=size[lx]+1; if(l==r)return; int mid=l+r>>1; if(v<=mid) { tr[x][1]=tr[lx][1]; insert(tr[lx][0],tr[x][0],l,mid,v); } else { tr[x][0]=tr[lx][0]; insert(tr[lx][1],tr[x][1],mid+1,r,v); } } int query(int x,int y,int l,int r,int v) { if(l==r)return l; int lx=tr[x][0],rx=tr[x][1]; int ly=tr[y][0],ry=tr[y][1]; int mid=l+r>>1; if(size[ly]-size[lx]>v) return query(lx,ly,l,mid,v); if(size[ry]-size[rx]>v) return query(rx,ry,mid+1,r,v); return 0; } int main() { n=sc();mx=n;m=sc(); for(int i=1;i<=n;i++) { a[i]=sc(); insert(root[i-1],root[i],1,mx,a[i]); } for(int i=1;i<=m;i++) { int l=sc(),r=sc(); int x=query(root[l-1],root[r],1,mx,(r-l+1)/2); printf("%d\n",x); } return 0; }