• 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('
    ');
    		return 0;
    	}
    	#pragma unroll 10
    	for(int i=1;i<=m;i++) write(Ans[i]),putchar('
    ');
    	
    	return 0;
    } 
    
  • 相关阅读:
    node.js 建立live-server
    Django 反向解析
    Boost智能指针——weak_ptr
    boost::intrusive_ptr原理介绍
    shared_ptr 的使用及注意事项
    小感
    JQ对页面中某个DIV的大小变化进行监听
    使用java Apache poi 根据word模板生成word报表
    字节byte自适应转换为B、KB、MB、GB、TB
    jq实现 元素显示后 点击页面的任何位置除元素本身外 隐藏元素
  • 原文地址:https://www.cnblogs.com/Akmaey/p/14683434.html
Copyright © 2020-2023  润新知