社区讨论
求Hack
P7554 [COCI 2020/2021 #6] Index参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjoe82s
- 此快照首次捕获于
- 2025/11/04 05:52 4 个月前
- 此快照最后确认于
- 2025/11/04 05:52 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define PII pair<int,int>
#define ft first
#define sd second
using namespace std;
const int N=200005;
int n,m;
int a[N];
int t,block;
int pos[N];
struct node{
int i,l,r;
} q[N];
bool cmp(node a,node b){
if(pos[a.l]!=pos[b.l]) return a.l<b.l;
return a.r<b.r;
}
int sum[N];
int ANS=0,last=0;
int ans[N];
void add(int x){
sum[a[x]]++;
if(a[x]>=ANS) last++;
while(last-sum[ANS]>=ANS+1){
last-=sum[ANS];
ANS++;
}
// cout<<ANS<<'\n';
}
void erase(int x){
sum[a[x]]--;
if(a[x]>=ANS) last--;
while(last<ANS){
ANS--;
last+=sum[ANS];
}
}
signed main(){
cin>>n>>m;
block=sqrt(n);
t=n/block;
if(n%block) t++;
for(int i=1;i<=n;i++){
cin>>a[i];
pos[i]=(i-1)/block+1;
}
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].i=i;
}
// cout<<'\n';
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
// cout<<q[i].l<<' '<<q[i].r<<'\n';
while(l<q[i].l) erase(l++);
while(r>q[i].r) erase(r--);
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
ans[q[i].i]=ANS;
}
for(int i=1;i<=m;i++) cout<<ans[i]<<'\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...