做这个题唯一收获的是一个巨大的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;
}