社区讨论
求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 条回复,欢迎继续交流。
正在加载回复...