社区讨论

求hack

P4168[Violet] 蒲公英参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mk2mo7yz
此快照首次捕获于
2026/01/06 21:31
上个月
此快照最后确认于
2026/01/10 10:50
上个月
查看原帖
求让我代码错误,能够调试的数据
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[40005],b[40005],sum[40005],num[40005],c[40005],f[205][205],cnt[40005][205];
map<int,int>p;
signed main()
{
//	freopen("P4168_1.in","r",stdin);
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	int n,q;
	cin>>n>>q;
	int l=sqrt(n),s=ceil(n*1.0/l);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	int tot=0;
	for(int i=1;i<=n;i++)
	{
		p[b[i]]=++tot;
		c[tot]=b[i];
		while(b[i]==b[i+1])
			i++;
	}
	for(int i=1;i<=s;i++)
	{
		for(int j=1;j<=tot;j++)
			cnt[j][i]=cnt[j][i-1];
		for(int j=(i-1)*l+1;j<=min(i*l,n);j++)
			cnt[p[a[j]]][i]++;
	}
	for(int i=1;i<=s;i++)
	{
		memset(sum,0,sizeof(sum));
		int k=(i-1)*l+1,maxx=-1e9,opt;
		for(int j=i;j<=s;j++)
		{
			for(;k<=min(j*l,n);k++)
			{
				sum[p[a[k]]]++;
				if(sum[p[a[k]]]>maxx)
				{
					maxx=sum[p[a[k]]];
					opt=p[a[k]];
				}
				if(sum[p[a[k]]]==maxx)
				{
					if(p[a[k]]<opt)
						opt=p[a[k]];
				}
			}
			f[i][j]=opt;
		}
	}
	memset(sum,0,sizeof(sum));
	while(q--)
	{
		int x,y,fl,fr,maxx=-1e9,opt=0;
		cin>>x>>y;
		if(x>y)
			swap(x,y);
		for(int i=1;i<=s;i++)
		{
			if((i-1)*l+1>=x)
			{
				fl=i;
				break;
			}
		}
		for(int i=s;i>=1;i--)
		{
			if(min(i*l,n)<=y)
			{
				fr=i;
				break;
			}
		}
		int cnt1=0,q=0;
		for(int i=x;i<=(fl-1)*l;i++)
		{
			num[++cnt1]=p[a[i]];
			sum[p[a[i]]]++;
		}
		for(int i=min(fr*l,n)+1;i<=y;i++)
		{
			num[++cnt1]=p[a[i]];
			sum[p[a[i]]]++;
		}
		sort(num+1,num+cnt1+1);
		for(int i=1;i<=cnt1;i++)
		{
			sum[num[i]]+=cnt[num[i]][fr]-cnt[num[i]][fl-1];
			while(num[i]==num[i+1])
				i++;
		}
		for(int i=1;i<=cnt1;i++)
		{
			if(sum[num[i]]>maxx)
			{
				maxx=sum[num[i]];
				opt=num[i];
			}
			sum[num[i]]=0;
		}
		if(cnt[f[fl][fr]][fr]-cnt[f[fl][fr]][fl-1]>maxx)
			cout<<c[f[fl][fr]]<<endl;
		else if(cnt[f[fl][fr]][fr]-cnt[f[fl][fr]][fl-1]==maxx)
			cout<<c[min(opt,f[fl][fr])]<<endl;
		else cout<<c[opt]<<endl;
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...