• Luogu P4137 Rmq Problem / mex


    区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决。

    不过主席树好像不是很好写哈,那我们写莫队

    考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数。

    然后些比较显然的性质:如果加入一个数时,答案只会增加;同样的删除一个数时,答案只会减小

    利用好这些性质我们就愉快地上莫队即可不过复杂度很迷,转移的时候只能近似(O(1))

    CODE

    #include<cstdio>
    #include<cctype>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int N=200005;
    struct data 
    {
    	int l,r,id;
    }q[N];
    int a[N],cnt[N],ans[N],n,m,size,blk[N],res,L,R;
    inline char tc(void)
    {
    	static char fl[100000],*A=fl,*B=fl;
    	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
    	x=0; char ch; while (!isdigit(ch=tc()));
    	while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
    }
    inline void write(int x)
    {
    	if (x>9) write(x/10);
    	putchar(x%10+'0');
    }
    inline bool cmp(data a,data b)
    {
    	return blk[a.l]<blk[b.l]||(blk[a.l]==blk[b.l]&&(blk[a.l]&1?a.r<b.r:a.r>b.r));
    }
    inline int min(int a,int b)
    {
    	return a<b?a:b;
    }
    inline void add(int col)
    {
    	++cnt[col]; if (res<col) return; while (cnt[res]) ++res;
    }
    inline void del(int col)
    {
    	if (!(--cnt[col])) res=min(res,col);
    }
    int main()
    {
    	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    	register int i; read(n); read(m); size=sqrt(n);
    	for (i=1;i<=n;++i) read(a[i]),a[i]=min(a[i],n+1),blk[i]=(i-1)/size+1;
    	for (i=1;i<=m;++i) read(q[i].l),read(q[i].r),q[i].id=i;
    	sort(q+1,q+m+1,cmp); L=q[1].l; R=q[1].r;
    	for (i=L;i<=R;++i) add(a[i]); ans[q[1].id]=res;
    	for (i=2;i<=m;++i)
    	{
    		while (L>q[i].l) add(a[--L]); while (L<q[i].l) del(a[L++]);
    		while (R<q[i].r) add(a[++R]); while (R>q[i].r) del(a[R--]);
    		ans[q[i].id]=res;
    	}
    	for (i=1;i<=m;++i) write(ans[i]),putchar('
    ');
    	return 0;
    }
    
  • 相关阅读:
    go语言从零学起(三) -- chat实现的思考
    go语言从零学起(二)--list循环删除元素(转载)
    go语言从零学起(一) -- 文档教程篇
    Spring框架事务支持模型的优势
    Thymeleaf
    社保到底是多交好,还是少交好?
    使用静态工厂方法而不是构造器
    EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf
    MySQL存储过程
    MySQL常用功能语句分类总结
  • 原文地址:https://www.cnblogs.com/cjjsb/p/9698936.html
Copyright © 2020-2023  润新知