关于O2
查看原帖
关于O2
443649
NATO楼主2023/7/17 09:21

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 99个点

2023/7/17 09:21
加载中...