RT,本人交了两份一模一样的代码,结果如下:
https://www.luogu.com.cn/record/115939069
https://www.luogu.com.cn/record/115940131
代码如下:
#include<bits/stdc++.h>
#define ll long long
#define INF 214748364719260817
using namespace std;
ll n,m,k;
struct ls
{
ll uid,z;
bool operator <(const ls&b)const
{
return z<b.z;
}
}y[100005];
ll a[100005],sum[100005],fa[100005],fs[100005],tot[320],ns,mk,mg[100005];
ll sn,ss;
ll l,r;
struct px
{
ll l,r,pm,uid;
bool operator <(const px&b)const
{
return ((fa[l]^fa[b.l])?fa[l]<fa[b.l]:((fa[l]&1)?r<b.r:r>b.r));
}
}q[100005];
void add(ll x)
{
if(!sum[a[x]]++)++ns;--tot[fs[sum[a[x]]-1]],++tot[fs[sum[a[x]]]],++mg[sum[a[x]]],--mg[sum[a[x]]-1];
}
void del(ll x)
{
if(!--sum[a[x]])--ns;--tot[fs[sum[a[x]]+1]],++tot[fs[sum[a[x]]]],++mg[sum[a[x]]],--mg[sum[a[x]]+1];
}
ll ans[100005];
ll query(ll kp)
{
if(kp>ns)return -1;
ll ls=0;
//cout<<kp<<' ';
for(ll i=1;;++i)
if(kp-tot[i]>0)
kp-=tot[i];
else
{
ls=i;
break;
}
//cout<<ls<<' '<<kp<<"??\n";
--ls;
for(ll i=1+ls*ss;;++i)
if(kp-mg[i]<=0)
return i;
else
kp-=mg[i];
}
int main()
{
//freopen("P3730.in","r",stdin);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;sn=sqrt(n);
for(ll i=1;i<=n;++i)
cin>>y[i].z,y[i].uid=i;
sort(y+1,y+1+n);
for(ll i=1;i<=n;++i)
{
if(y[i].z==y[i-1].z)
a[y[i].uid]=k;
else
a[y[i].uid]=++k;
fa[i]=(i-1)/sn+1;
}
ss=sqrt(n);
for(ll i=1;i<=n;++i)
fs[i]=(i-1)/ss+1;
for(ll i=1;i<=m;++i)
cin>>q[i].l>>q[i].r>>q[i].pm,q[i].uid=i;
sort(q+1,q+1+m);
for(ll i=1;i<=m;++i)
{
while(l<q[i].l)del(l++);
while(l>q[i].l)add(--l);
while(r>q[i].r)del(r--);
while(r<q[i].r)add(++r);
ans[q[i].uid]=query(q[i].pm);
}
//cout<<k;
for(ll i=1;i<=m;++i)
cout<<ans[i]<<'\n';
}
求助为何开了O2会WA 9个点