[Ynoi2016]镜中的昆虫

https://www.luogu.org/problemnew/show/P4690

题解

区间不用种类的数的个数。

这个问题可以转化为对每个点维护一个\(pre\),询问\(l \sim r\)中,有多少个位置是在\(0\sim l-1\)之间的。

这个问题可以用二维偏序做。

然后对于区间赋值的操作,可以证明,如果我们找到所有有变化的位置并且把它改掉,它的总更改次数为\(O(n+m)\)级别的。

那具体实现可以用\(set\)维护区间,注意新加入一个区间时其他区间可能是被这个区间包含,包含这个区间,和这个区间有交,讨论比较麻烦。。

代码

#include<bits/stdc++.h>
#define N 100009
#define ls tr[cnt].l
#define rs tr[cnt].r
using namespace std;
typedef long long ll;
int a[N],n,m,pre[N],now[N<<1],b[N<<1],rot[N];
inline ll rd(){
  ll x=0;char c=getchar();bool f=0;
  while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
  while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
  return f?-x:x;
}
struct node{
  int opt,l,r,x;
}c[N];
struct setnode{
  int l,r,col;
  inline bool operator <(const setnode &b)const{
    return l<b.l;
  }
};
set<setnode>s,col[N<<1];
struct seg{
  struct ment{
    int l,r,val;
  }tr[N*200];
  int tott;
  inline void upd(int &cnt,int l,int r,int x,int y){
    if(!cnt)cnt=++tott;
    tr[cnt].val+=y;
    if(l==r)return;
    int mid=(l+r)>>1;
    if(mid>=x)upd(ls,l,mid,x,y);
    else upd(rs,mid+1,r,x,y);
  }
  inline int query(int cnt,int l,int r,int R){
    if(r<=R)return tr[cnt].val;
    int mid=(l+r)>>1,ans=0;
    if(mid<R)ans+=query(rs,mid+1,r,R);
    ans+=query(ls,l,mid,R);
    return ans;
  }
}T;
struct BIT{
  inline void add(int x,int y,int z){
    while(x<=n)T.upd(rot[x],0,n,y,z),x+=x&-x;
  }
  inline int query(int x,int num){
    int ans=0;
    while(x)ans+=T.query(rot[x],0,n,num),x-=x&-x;
    return ans;
  }
  inline int calc(int l,int r){
   // cout<<query(r,l-1)<<" ";
    return query(r,l-1)-l+1;
  }
}bit;
inline void gg(int x,int y){
  if(pre[x]==y)return;
  bit.add(x,pre[x],-1);
  pre[x]=y;
  bit.add(x,pre[x],1);
}
int main(){
  n=rd();m=rd();
  for(int i=1;i<=n;++i)a[i]=rd(),b[++b[0]]=a[i];
  for(int i=1;i<=m;++i){
    c[i].opt=rd();
    c[i].l=rd();
    c[i].r=rd();
    if(c[i].opt==1)c[i].x=rd(),b[++b[0]]=c[i].x;
  }
  sort(b+1,b+b[0]+1);
  b[0]=unique(b+1,b+b[0]+1)-b-1;
  for(int i=1;i<=n;++i){
    a[i]=lower_bound(b+1,b+b[0]+1,a[i])-b;
    pre[i]=now[a[i]];
    now[a[i]]=i;
    s.insert(setnode{i,i,a[i]});col[a[i]].insert(setnode{i,i,a[i]});
    bit.add(i,pre[i],1);
  }
  for(int i=1;i<=m;++i){
    if(c[i].opt==1){
       int l=c[i].l,r=c[i].r,x=c[i].x;
       x=lower_bound(b+1,b+b[0]+1,x)-b;
       int tg=0,tg2=0;
       set<setnode>::iterator it;
       while(1){
         it=s.lower_bound(setnode{l,r,x});
         if(it==s.end())break;
         if(it->l>r)break;
         if(it->r<=r){
            int lss=it->l,rss=it->r,co=it->col;
            if(lss>l)gg(lss,lss-1);
            s.erase(it);col[co].erase(setnode{lss,rss,co});
            it=col[co].lower_bound(setnode{rss,rss,co});
            if(it!=col[co].end()){
              int xx=it->l;
              if(it!=col[co].begin()){
                --it;
                gg(xx,it->r);
              }
              else gg(xx,0);
            }
         }
         else{
            int lss=it->l,rss=it->r,co=it->col;
            if(lss>l)gg(lss,lss-1);
            s.erase(it);col[co].erase(setnode{lss,rss,co});
            tg=r+1;tg2=co;
            s.insert(setnode{r+1,rss,co});col[co].insert(setnode{r+1,rss,co});
            break;
         }
       }
       it=s.lower_bound(setnode{l,r,x});
       if(it!=s.begin()){
         --it;
         if(it->r>r){
             int lss=it->l,rss=it->r,co=it->col;
             s.erase(it);col[co].erase(setnode{lss,rss,co});
             gg(r+1,l-1);
             s.insert(setnode{lss,l-1,co});s.insert(setnode{r+1,rss,co});
             col[co].insert(setnode{lss,l-1,co});col[co].insert(setnode{r+1,rss,co});
         }
         else  if(it->r>=l){
          int lss=it->l,rss=it->r,co=it->col;
          s.erase(it);col[co].erase(setnode{lss,rss,co});
          it=col[co].lower_bound(setnode{rss,rss,co});
          if(it!=col[co].end()){
            gg(it->l,l-1);
          }
          s.insert(setnode{lss,l-1,co});col[co].insert(setnode{lss,l-1,co});
         }
       }
       s.insert(setnode{l,r,x});col[x].insert(setnode{l,r,x});
       if(tg){
          it=col[tg2].lower_bound(setnode{r+1,r+1,tg2});
          if(it!=col[tg2].begin()){
              it--;
              gg(tg,it->r);
          }
          else gg(tg,0);
       }
       it=col[x].lower_bound(setnode{l,r,x});
       if(it!=col[x].begin()){
        --it;
        gg(l,it->r);
        it++;
       }
       else gg(l,0);
       it++;
       if(it!=col[x].end()){
        gg(it->l,r);
       }
    }
    else{
     printf("%d\n",bit.calc(c[i].l,c[i].r));
    }
  }
  return 0;
}

原文地址:https://www.cnblogs.com/ZH-comld/p/10932390.html

时间: 2024-08-30 03:07:49

[Ynoi2016]镜中的昆虫的相关文章

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

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

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+*p

帮用户解决以往消费中的例如信息不透明、使用不便捷、无法按照服务质量付费等痛点(转)

在所有还算得上成功的互联网公司中,大众点评一直是一个异类. 它既不会像其它公司那样像坠落凡间的天使,只需要短短几年的修复,迅速克隆一个“美国公司”,就立马可以腾云驾雾,再次回到天堂:也不像那些泯然众人的公司那样,似乎永远不在舆论的中心,但一直默默在赚钱,只是在某一个瞬间,纳斯达克的钟声将人们唤醒,“哦,原来它这么厉害”! O2O 2.0 的演变 7 月 22 日,久不露面的大众点评 CEO 张涛出现在了成立丽人事业部的发布会上,除了为其新拓展的丽人事业部站台之外,张涛对外纰漏了大众点评未来的发展

IT运维服务中的一些工作思路探索(二)

1.  重承诺.讲计划 (1)重承诺:对于用户的任何承诺,包括:服务的目标与级别要求.提供的资源或方案.应给予的回复等,运维人员都应在约定的时间内.按约定的要求予以提供或实现,严格履行承诺.确因特殊原因导致无法履行时,应提前和用户进行说明和解释,获得对方的谅解:并提出补救措施,以尽量接近当初的承诺. (2)讲计划:工作计划是整个运维工作的龙头,工作计划依据公司要求及对用户的承诺而制定,各项运维服务将围绕计划展开.决策管理系统的运维工作以主动服务为主,所有的主动服务类工作都可以提前策划.中烟信息的

楞严经白话——14.10.10

楞严经 大佛顶如来密因修证了义诸菩萨万行首 楞严经卷一 唐朝中天竺国(印度)沙门(出家人)般剌密谛 主译 乌苌国(北印度)沙门(出家人)弥伽释迦 译语 菩萨戒弟子 前正议大夫 同中书门下 平章事 清河县人 房融 执笔记录 (楞严经,原藏于龙宫,胜龙菩萨到龙宫说法,见龙藏中有此经,披阅之下,叹为希有,遂默诵而出,录呈印度国王,国王视其为国宝,严禁外流.般剌密 谛尊者,弘法愿深,两次冒险,思送中国以求宏扬,不幸皆为关卡查禁.尊者乃费数年时间,以蝇头小字书于腊纸之上,剖膊藏于肉中,方得过关航海而来,于

黄仲则《绮怀》十六首

楚楚腰肢  掌  上  轻,得人怜处    最分明. 千围步障  难藏艳,百合葳蕤不锁情. 朱鸟窗前眉欲语,紫姑乩畔目将成. 玉钩初放钗初堕,第一销魂是此声.  注: 1:绮怀:美丽情怀:风月情怀:浪漫情怀.绮,美丽的丝织品. 黄景仁客居寿州时,孤独无聊之际,回忆自己少年时期与表妹的初恋,写下这组诗,共十六首.他的表妹当时十五岁. 2:楚楚腰肢掌上轻:楚楚腰肢,<韩非子>:"楚灵王好细腰,而国中多饿人."楚楚,纤弱娇美. 掌上轻,〈〈飞燕外传〉〉载,赵飞燕,体轻,能为掌上舞

[转]填词

奠基 诗词读多了,难免自己也想拿笔试试.人,尤其可不做而做的事都有所为.想试试的所为可以有多种.一种是附庸风雅,用大白话说是,让人看看,"我也能作旧诗.填词,可见是造诣高,多才多艺."另一种由野狐禅走入正经,是确有"故国(读仄声)平居有所思"之类或"为伊消得(读仄声)人憔悴"之类的情怀,读别人的,借他人酒杯浇自己块垒,不直接,或吃不饱,于是只好自己拿笔.还有一种,胃口更大,有情怀,抒发了,还不满足,立志要写得多,写得好,以期追踪李.杜,步武秦.周

【转】崂山道士

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

程序员到项目经理:从内而外的提升

转自:http://www.cnblogs.com/watsonyin/archive/2012/09/10/2679528.html 目录 从程序员到项目经理(一):为什么要当项目经理 从程序员到项目经理(二):升职之辨 从程序员到项目经理(三):认识项目经理 从程序员到项目经理(四):外行可以领导内行吗 从程序员到项目经理(五):程序员加油站,不是人人都懂的学习要点 从程序员到项目经理(六):程序员加油站 — 懂电脑更要懂人脑 从程序员到项目经理(七):程序员加油站 — 完美主义也是一种错