bzoj4941: [Ynoi2016]镜子里的昆虫

维护每个位置x的上一个相等的位置pv[x],可以把询问表示成l<=x<=r,pv[x]<l的形式,对一次修改,均摊改变O(1)个pv的取值,因此可以用平衡树预处理出pv的变化,用cdq分治处理查询。

#include<bits/stdc++.h>
char buf[3000007],*ptr=buf;
const int N=100007;
int _(){
    int x=0;
    while(*ptr<48)++ptr;
    while(*ptr>47)x=x*10+*ptr++-48;
    return x;
}
struct itv{
    int l;
    mutable int r,x;
    bool operator<(const itv&w)const{return l<w.l;}
};
typedef std::set<itv>::iterator IT;
std::set<itv>c,cs[N*2];
int n,m,v0[N],vs[N*2],vp=0;
int os[N][4],pw[N*2],pv[N];
struct P{
    int t,x,y,a;
    bool operator<(const P&w)const{return x<w.x;}
}ps[N*10],qs[N*2],pb[N*10];
int px[N],qx[N];
int pp=0,qp=0,now,ans[N];
int bit[N][2],tk=1,c0;
void inc(int w,int a){
    if(!w)c0+=a;
    else for(;w<=n;w+=w&-w){
        bit[w][0]!=tk?bit[w][0]=tk,bit[w][1]=0:0;
        bit[w][1]+=a;
    }
}
int sum(int w){
    int s=c0;
    for(;w;w-=w&-w){
        s+=(bit[w][0]==tk?bit[w][1]:0);
    }
    return s;
}
void clr(){
    ++tk,c0=0;
}
void msort(P*l,P*m,P*r){
    P*bp=pb,*p1=l,*p2=m;
    while(p1!=m&&p2!=r)*bp++=*(p1->x<p2->x?p1:p2)++;
    while(p1!=m)*bp++=*p1++;
    while(p2!=r)*bp++=*p2++;
    memcpy(l,pb,(r-l)*sizeof(P));
}
void calc(int L,int R,int lp,int rp,int lq,int rq){
    if(L==R){
        std::sort(ps+lp,ps+rp);
        std::sort(qs+lq,qs+rq);
        return;
    }
    int M=(L+R)>>1,mp=px[M],mq=qx[M];
    calc(L,M,lp,mp,lq,mq);
    calc(M+1,R,mp,rp,mq,rq);
    if(lp<mp&&mq<rq){
        clr();
        for(int i=mq,j=lp;i<rq;++i){
            for(;j<mp&&ps[j].x<=qs[i].x;++j)inc(ps[j].y,ps[j].a);
            int z;
            ans[qs[i].t]+=z=sum(qs[i].y)*qs[i].a;
        }
    }
    msort(ps+lp,ps+mp,ps+rp);
    msort(qs+lq,qs+mq,qs+rq);
}
void setpv(int w,int v){
    if(pv[w]==v)return;
    ps[pp++]=(P){now,w,pv[w],-1};
    pv[w]=v;
    ps[pp++]=(P){now,w,v,1};
}
int getpv(int w,int x){
    IT it=cs[w].lower_bound((itv){x});
    if(it==cs[w].begin())return 0;
    --it;
    return it->r>=x?x-1:it->r;
}
void setq(int l,int r){
    qs[qp++]=(P){now,r,l-1,1};
    qs[qp++]=(P){now,l-1,l-1,-1};
}
int xs[N],xp,cms[N],cp;
void modify(int l,int r,int x){
    IT it,it2,del;
    xp=cp=0;
    it=c.upper_bound((itv){r});--it;
    if(it->r>r){
        cs[it->x].insert((itv){r+1,it->r});
        cs[it->x].find(*it)->r=r;
        c.insert((itv){r+1,it->r,it->x});
        it->r=r;
    }
    it=c.upper_bound((itv){l});--it;
    if(it->l<l){
        cs[it->x].insert((itv){l,it->r});
        cs[it->x].find(*it)->r=l-1;
        c.insert((itv){l,it->r,it->x});
        it->r=l-1;
    }
    for(it=c.find((itv){l});it!=c.end();it2=it,++it,c.erase(it2)){
        xs[xp++]=it->l;
        if(it->l>r)break;
        cms[cp++]=it->x;
        cs[it->x].erase(*it);
    }
    c.insert((itv){l,r,x});
    cs[x].insert((itv){l,r});
    for(int i=0;i<xp;++i){
        int d=xs[i]-1;
        if(xs[i]==l)d=getpv(x,xs[i]);
        else if(xs[i]>r)d=getpv(it->x,xs[i]);
        setpv(xs[i],d);
    }
    cms[cp++]=x;
    for(int i=0;i<cp;++i){
        it=cs[cms[i]].upper_bound((itv){r});
        if(it!=cs[cms[i]].end()){
            setpv(it->l,getpv(cms[i],it->l));
        }
    }
}
int main(){
    fread(buf,1,sizeof(buf),stdin);
    n=_();m=_();
    for(int i=1;i<=n;++i)vs[vp++]=v0[i]=_();
    for(int i=1;i<=m;++i){
        os[i][0]=_();
        os[i][1]=_();
        os[i][2]=_();
        if(os[i][0]==1)vs[vp++]=os[i][3]=_();
    }
    std::sort(vs,vs+vp);
    vp=std::unique(vs,vs+vp)-vs;
    for(int i=1;i<=n;++i)v0[i]=std::lower_bound(vs,vs+vp,v0[i])-vs;
    for(int i=1;i<=m;++i)os[i][3]=std::lower_bound(vs,vs+vp,os[i][3])-vs;
    for(int i=1;i<=n;++i){
        cs[v0[i]].insert((itv){i,i});
        c.insert((itv){i,i,v0[i]});
        pv[i]=pw[v0[i]];
        ps[pp++]=(P){0,i,pv[i],1};
        pw[v0[i]]=i;
    }
    px[0]=pp,qx[0]=qp;
    for(int i=now=1;i<=m;++now,++i){
        if(os[i][0]==1)modify(os[i][1],os[i][2],os[i][3]);
        else setq(os[i][1],os[i][2]);
        px[i]=pp,qx[i]=qp;
    }
    calc(0,m,0,pp,0,qp);
    for(int i=1;i<=m;++i)if(os[i][0]==2)printf("%d\n",ans[i]);
    return 0;
}
时间: 2024-08-26 12:17:58

bzoj4941: [Ynoi2016]镜子里的昆虫的相关文章

[Ynoi2016]镜中的昆虫

https://www.luogu.org/problemnew/show/P4690 题解 区间不用种类的数的个数. 这个问题可以转化为对每个点维护一个\(pre\),询问\(l \sim r\)中,有多少个位置是在\(0\sim l-1\)之间的. 这个问题可以用二维偏序做. 然后对于区间赋值的操作,可以证明,如果我们找到所有有变化的位置并且把它改掉,它的总更改次数为\(O(n+m)\)级别的. 那具体实现可以用\(set\)维护区间,注意新加入一个区间时其他区间可能是被这个区间包含,包含这

妙莲千里寻师拜访记【转】

妙莲千里寻师拜访记 一提笔,妙莲就热泪盈眶…妙莲自从今年5月开始和师傅(了空居士蔡衍颛)学习,有太多的收获和体会,这次又前往东莞中堂亲自体验师傅强大功力加持,境界不断提升.之前是否前往中堂也犹豫过,一是工作很忙要请假,二是第一次出远门感觉很害怕,但我想到师傅的一句话,他最大的特点就是不怕困难.想起师傅当年去见他的师傅,八十几个小时的船加十几个小时的车,而我们今天去见师傅坐的是动车.高铁.飞机,都特别快,所以依然决定要到东莞中堂拜见师傅,结果到了东莞中堂以后,真的很不想回去,可以说流连忘返,依依不

喧嚣中的寂静绽放

其实,最初并没有很懂这部小说改版的电影.印象最深的便是逼仄的深巷里,一个美丽的女人坐在她的小摊铺后,街巷深深,昏暗的街道里她的脸有柔和的光照着,她安静的吐着烟圈,任人来人往,繁华熙攘,她兀自售着她的鸭脖.啤酒泛起泡沫,夜晚扬起声浪,她置身其中,却好像遗世独立. 她和那个爱慕她的男人,是怎么看都不搭的.她年轻,皮肤光泽,轻轻一扬嘴角,眼里眉梢都是笑意,漾开华彩,绽放着的成熟风韵,是再昏暗的街市都遮掩不了的.而他,半秃的头发,形容甚至有几分猥琐,是已有家室的男人.纵使他坚持着买你的鸭脖,纵使他对你慷

mind nerverr later(转)

每个人都有感到失落迷惘的时候.人生用专制又霸道的方式运行着,每当我们心想一切尘埃落定.生活稳固的时候,生活总爱给我们惊喜,粉碎我们短暂的安逸,让我们不得不重新思考—_— “我走对路了吗?” “我能够赚更多钱.爬到更高的位置吗?” “这是上天为我准备的吗?”这些体会,谁有少过呢?在 31 岁以前,我的工作是客服人员,而卑微如仆的工作条件,逐渐啃食我的梦想与灵魂.尽管我不太知道自己要什么,但我知道这样下去不是办法,我的人生需要改变.然后,我行动了. 我在 31 岁提出离职,这是我 31 年人生里,最

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

[转载]无我的智慧 第一章 镜中修行

标签: 转载   原文地址:无我的智慧         第一章 镜中修行作者:心既是莲师 第一章 镜中修行(1) 作者:吉噶·康楚仁波切       出版社:陕西师范大学出版社 超越自我重要感进而看到真正的自己需要很大的勇气,但这就是我们的道路.所有佛法的重点,都是要减低自我重要感,如此实相才有机会显现:而这个过程必须由自我省思开始.     当我们照镜子时,最不希望镜中出现的是一个平凡人,我们希望看到一个很特别的人:不论有没有意识到这一点,我们就是不想看到一个面临许多阻碍.问题,甚至有点神经质

【转】崂山道士

作品原文/崂山道士[<聊斋志异>篇目] 编辑 崂山道士图册 邑有王生,行七,故家子.少慕道,闻劳山多仙人,负笈往游.登一顶,有观宇,甚幽.一道士坐蒲团上,素发垂领,而神观爽迈.叩而与语,理甚玄妙.请师之.道士曰:"恐娇惰不能作苦."答言:"能之."其门人甚众,薄暮毕集.王俱与稽首,遂留观中.凌晨,道士呼王去,授以斧,使随众采樵.王谨受教.过月余,手足重茧,不堪其苦,阴有归志.一夕归,见二人与师共酌,日已暮,尚无灯烛.师乃剪纸如镜,黏壁间.俄顷,月明辉室,

【VR】Leap Motion 官网文档 HandModel(手部模型)

前言: 本系列译文是为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的Leap Motion官方文档中英对照翻译. 本篇为第六篇 <HandModel(手部模型)> ,该类主要用于连接控制器和手部模型,以及处理手臂.肘部.手掌.手指的位置和角度等信息. Handmodel is the base class for all the other hand scripts. If you are creating your own hands and need a custo

蓝的成长记——追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

***********************************************声明***********************************************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39860137 *******