有个小问题(非查错)
查看原帖
有个小问题(非查错)
227824
JK_LOVER楼主2020/8/8 22:02
#include<bits/stdc++.h>
using namespace std;
int read(){int x;scanf("%d",&x);return x;}
const int N = 5e5+100,inf = 3e5+10;
int ans = 0,c[N],val[N],pos[N],n,m;
struct Q{int l,r,id,Ans;}q[N];
void add(int x){
	if(val[x]>inf) return;
	c[val[x]]++;
//	int tt=0;
	 while(c[ans])
	 {
//	 	tt++;
//	 	cout<<ans<<" "<<val[x]<<endl;
//	 	if(tt==1) assert(ans==val[x]);
	 	ans++;
	 } 
}
void del(int x){
	if(val[x]>inf) return;
	c[val[x]]--;
	if(!c[val[x]] && ans>val[x]) ans=val[x]; 
}
bool cmp_work(Q a,Q b){
	if(pos[a.l] == pos[b.l]) {
		if(pos[a.l]&1) return a.r < b.r;
		else return a.r > b.r;
	}
	return a.l < b.l;
}
bool cmp_id(Q a,Q b){
	return a.id < b.id;
}
int main(){
	freopen("P4137_4.in","r",stdin);
	freopen("check.out","w",stdout);
	n = read();m = read();
	for(int i = 1;i <= n;i++) val[i] = read();
	int block = sqrt(n);
	for(int i = 1;i <= n;i++) {
		pos[i] = i/block + 1;
	}
	for(int i = 1;i <= m;i++){
		q[i].l = read();q[i].r = read();
		q[i].id = i;	
	}
	sort(q+1,q+1+m,cmp_work);
	for(int l = 1,r = 0,i = 1;i <= m;i++)
	{
		while(l > q[i].l) l--,add(l);
		while(l < q[i].l) del(l),l++;
		while(r > q[i].r) del(r),r--;
		while(r < q[i].r) r++,add(r);
		q[i].Ans = ans;
	}
	sort(q+1,q+1+m,cmp_id);
	for(int i = 1;i <= m;i++){
		printf("%d\n",q[i].Ans);
	}
	return 0;
}
2020/8/8 22:02
加载中...