社区讨论
wa#21求条
P13984数列分块入门 9参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj0uskqf
- 此快照首次捕获于
- 2025/12/11 11:03 3 个月前
- 此快照最后确认于
- 2025/12/13 15:40 3 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[300005],v[300005],mps,bl[300005],m,zs[5005][5005],cnt[300005];
map<int,int> mp;
vector<int> in[300005];
int fqy(int l,int r,int x){
return upper_bound(in[x].begin(),in[x].end(),r)-lower_bound(in[x].begin(),in[x].end(),l);
}
signed main(){
v[0]=4e18;
cin>>n;
m=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
bl[i]=(i-1)/m+1;
if(mp[a[i]]==0){
mp[a[i]]=++mps;
v[mps]=a[i];
}
a[i]=mp[a[i]];
in[a[i]].push_back(i);
}
for(int i=1;i<=m;i++){
memset(cnt,0,sizeof cnt);
int ans=0,maxn=0;
for(int j=(i-1)*m+1;j<=n;j++){
cnt[a[j]]++;
if(maxn<cnt[a[j]]||(maxn==cnt[a[j]]&&v[a[j]]<v[ans])){
ans=a[j];
maxn=cnt[a[j]];
}
zs[i][bl[j]]=ans;
}
}
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
int ans=zs[bl[l]+1][bl[r]-1];
int fans=fqy(l,r,ans);
for(int j=l;j<=min(bl[l]*m,r);j++){
int fj=fqy(l,r,a[j]);
if(fj>fans||(fj==fans&&v[a[j]]<v[ans])||ans==0){
fans=fj;
ans=a[j];
}
}
if(bl[l]!=bl[r]){
for(int j=(bl[r]-1)*m+1;j<=r;j++){
int fj=fqy(l,r,a[j]);
if(fj>fans||(fj==fans&&v[a[j]]<v[ans])||ans==0){
fans=fj;
ans=a[j];
}
}
}
cout<<v[ans]<<'\n';
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...