[bzoj2453]维护队列

原创 2016年05月30日 19:07:08

题目大意

需要兹瓷修改,区间询问不同种类数。

带修改莫队

裸上呀!

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=10000+10,maxd=1000000+10,c=25;
int belong[maxn],a[maxn],b[maxn][3],ans[maxn],cnt[maxd];
struct dong{
    int l,r,x,id;
} ask[maxn];
int i,j,k,t,n,m,l,r,x,top,tot,now;
bool cmp(dong a,dong b){
    return belong[a.l]<belong[b.l]||belong[a.l]==belong[b.l]&&belong[a.r]<belong[b.r]||belong[a.l]==belong[b.l]&&belong[a.r]==belong[b.r]&&a.x<b.x;
}
void in(int x){
    cnt[x]++;
    if (cnt[x]==1) now++;
}
void out(int x){
    cnt[x]--;
    if (cnt[x]==0) now--;
}
void change(int j,int x,int y){
    a[j]=y;
    if (l<=j&&j<=r){
        out(x);
        in(y);
    }
}
char get(){
    char ch=getchar();
    while (ch!='Q'&&ch!='R') ch=getchar();
    return ch;
}
int main(){
    scanf("%d%d",&n,&m);
    fo(i,1,n) scanf("%d",&a[i]),belong[i]=(i-1)/c+1;
    fo(i,1,m)
        if (get()=='Q'){
            ++top;
            scanf("%d%d",&ask[top].l,&ask[top].r);
            ask[top].x=tot;
            ask[top].id=top;
        }
        else{
            scanf("%d%d",&j,&k);
            b[++tot][0]=j;
            b[tot][1]=a[j];
            a[j]=b[tot][2]=k;
        }
    sort(ask+1,ask+top+1,cmp);
    l=1;r=0;x=tot;
    fo(i,1,top){
        while (x<ask[i].x){
            x++;
            change(b[x][0],b[x][1],b[x][2]);
        }
        while (x>ask[i].x){
            change(b[x][0],b[x][2],b[x][1]);
            x--;
        }
        while (l<ask[i].l){
            out(a[l]);
            l++;
        }
        while (l>ask[i].l){
            l--;
            in(a[l]);
        }
        while (r<ask[i].r){
            r++;
            in(a[r]);
        }
        while (r>ask[i].r){
            out(a[r]);
            r--;
        }
        ans[ask[i].id]=now;
    }
    fo(i,1,top) printf("%d\n",ans[i]);
}
版权声明:本文是蒟蒻写出来的,神犇转载也要说一声哦! 举报

相关文章推荐

spoj 1811 LCS (后缀自动机 SAM)

http://www.spoj.com/problems/LCS/ 题意:求两个字符串A,B的最长公共子串。字符串长度不超过250000。   思路:这应该算是后缀自动机的经典应用了吧,我们先构...

支(zi)持(ci)修改的莫队算法

Preface相信大家对O(n32)\mathrm O(n^{\frac{3}{2}})离线解决序列问题莫队算法都不陌生,在这里我要介绍一下能够兹瓷修改操作的莫队算法。Algorithm分块大小SS为...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

莫队算法

这名字···这个算法是由之前的国家队队长莫涛巨神(Orz….%%%64^{64})发明的,所以尊称莫队算法。啊?莫队算法是什么?我不会!事实上,莫队算法这种东西,应该叫做——一个优雅的暴力(引自Ala...

[NOI2017]I'm Coming!

加油吧

莫队算法讲解(含树上莫队)

莫队算法莫队算法是一种离线算法,通常不能有修改 操作。 其通过对询问操作的执行顺序进行更改,然后使用最暴力的方法,可以达到很好的复杂度。首先,如果要用莫队算法,则必须满足已知ans[ll,rr]可以...

离线专题学习

hdu 4288 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4288 这题是往一个升序的集合里面加数字或者是减数字,然后求集合里面的一个值∑1...

Learning Linux(4): Suggestions

Unix is run in a specific platform.  It's not very convenient. Compared with Unix, we ordinary dev...

SSDUT集训题

 很喜欢两句话,一句是kuangbin菊苣的,一句是不认识的菊苣的blog里的,以此激励自己 人一我百,人十我万!追逐青春的梦想,怀着自信的心,永不放弃! 没有人能阻止我前进的步伐,除了我自...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)