CF1000F One Occurrence

CF1000F One Occurrence

给定一个序列,询问区间内出现次数为 1 的数,输出任意一个。

很容易想到莫队,然后可以用一个 \(unordered_set\) 来维护,但是跑不过,于是我们可以考虑用一个栈来维护,也就是可以直接放到栈里,然后添加直接加,删除的话我们每次进去的时候会记录位置,直接把当前栈顶移动过去即可(似乎叫做懒惰删除?)。

很卡,毕竟不是正解。

\(update:\) 可以直接值域分块,然后每次 \(O(1)\) 添加 \(O(\sqrt{n})\) 查询即可。

代码:

#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template <typename T>
inline void read(T &x){
	x=0;char ch=getchar();bool f=false;
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=5e5+5;
#define ll long long
int n,m,k;
int bl[N];
int a[N],cnt[N],Ans[N],stk[N],top,pos[N];
struct Query{int l,r,id;}Q[N];
int Now,Num;
inline void Add(int x,bool f){
	int y=a[x];
	cnt[y]++;
	if(cnt[y]==1){
		stk[++top]=y; 
		pos[y]=top; 
	}
	else if(cnt[y]==2){
		stk[pos[y]]=stk[top];
		pos[stk[top]]=pos[y]; 
		stk[top--]=pos[y]=0; 
	}
	return ;
}
inline void Del(int x,bool f){
	int y=a[x];
	cnt[y]--;
	if(cnt[y]==1){
		stk[++top]=y;
		pos[y]=top;
	}
	else if(!cnt[y]){
		stk[pos[y]]=stk[top];
		pos[stk[top]]=pos[y];
		stk[top--]=pos[y]=0;
	}
	return ;
}
inline bool Cmp(Query x,Query y){return bl[x.l]^bl[y.l]?bl[x.l]<bl[y.l]:bl[x.l]&1?x.r<y.r:x.r>y.r;}
int main(){
	read(n);
	for(int i=1;i<=n;i++) read(a[i]);
	read(m);
	const int t=sqrt(m);
	for(int i=1;i<=m;i++) read(Q[i].l),read(Q[i].r),Q[i].id=i;
	for(int i=1;i<=n;i++) bl[i]=(i-1)/t+1;
	sort(Q+1,Q+m+1,Cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		while(l>Q[i].l) Add(--l,false);
		while(r<Q[i].r) Add(++r,true);
		while(l<Q[i].l) Del(l++,false);
		while(r>Q[i].r) Del(r--,true);
		Ans[Q[i].id]=stk[top];
	}
	if(m<=10){
		for(int i=1;i<=m;i++) write(Ans[i]),putchar('\n');
		return 0;
	}
	#pragma unroll 10
	for(int i=1;i<=m;i++) write(Ans[i]),putchar('\n');
	
	return 0;
} 
posted @ 2021-04-20 23:39  __Anchor  阅读(39)  评论(0编辑  收藏  举报