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

#include<bits/stdc++.h>
char buf[],*ptr=buf;
const int N=;
int _(){
int x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
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*];
int n,m,v0[N],vs[N*],vp=;
int os[N][],pw[N*],pv[N];
struct P{
int t,x,y,a;
bool operator<(const P&w)const{return x<w.x;}
}ps[N*],qs[N*],pb[N*];
int px[N],qx[N];
int pp=,qp=,now,ans[N];
int bit[N][],tk=,c0;
void inc(int w,int a){
if(!w)c0+=a;
else for(;w<=n;w+=w&-w){
bit[w][]!=tk?bit[w][]=tk,bit[w][]=:;
bit[w][]+=a;
}
}
int sum(int w){
int s=c0;
for(;w;w-=w&-w){
s+=(bit[w][]==tk?bit[w][]:);
}
return s;
}
void clr(){
++tk,c0=;
}
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)>>,mp=px[M],mq=qx[M];
calc(L,M,lp,mp,lq,mq);
calc(M+,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],-};
pv[w]=v;
ps[pp++]=(P){now,w,v,};
}
int getpv(int w,int x){
IT it=cs[w].lower_bound((itv){x});
if(it==cs[w].begin())return ;
--it;
return it->r>=x?x-:it->r;
}
void setq(int l,int r){
qs[qp++]=(P){now,r,l-,};
qs[qp++]=(P){now,l-,l-,-};
}
int xs[N],xp,cms[N],cp;
void modify(int l,int r,int x){
IT it,it2,del;
xp=cp=;
it=c.upper_bound((itv){r});--it;
if(it->r>r){
cs[it->x].insert((itv){r+,it->r});
cs[it->x].find(*it)->r=r;
c.insert((itv){r+,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-;
c.insert((itv){l,it->r,it->x});
it->r=l-;
}
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=;i<xp;++i){
int d=xs[i]-;
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=;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,,sizeof(buf),stdin);
n=_();m=_();
for(int i=;i<=n;++i)vs[vp++]=v0[i]=_();
for(int i=;i<=m;++i){
os[i][]=_();
os[i][]=_();
os[i][]=_();
if(os[i][]==)vs[vp++]=os[i][]=_();
}
std::sort(vs,vs+vp);
vp=std::unique(vs,vs+vp)-vs;
for(int i=;i<=n;++i)v0[i]=std::lower_bound(vs,vs+vp,v0[i])-vs;
for(int i=;i<=m;++i)os[i][]=std::lower_bound(vs,vs+vp,os[i][])-vs;
for(int i=;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){,i,pv[i],};
pw[v0[i]]=i;
}
px[]=pp,qx[]=qp;
for(int i=now=;i<=m;++now,++i){
if(os[i][]==)modify(os[i][],os[i][],os[i][]);
else setq(os[i][],os[i][]);
px[i]=pp,qx[i]=qp;
}
calc(,m,,pp,,qp);
for(int i=;i<=m;++i)if(os[i][]==)printf("%d\n",ans[i]);
return ;
}

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

  1. [Ynoi2016]镜中的昆虫

    题目大意: 给定一个序列,有2个操作: 1. 区间覆盖.2. 区间数颜色. 解题思路: 珂朵莉树+树套树. 看到区间覆盖当然想到珂朵莉树然而这是Ynoi 所以我们得优化掉珂朵莉树那个暴力过程. 考虑对 ...

  2. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  3. XXOOJL

    她的鞋子放在外面没拿进来很显眼,我们俩正抱在床上,刚做完什么也没穿,她也没擦.听到门外的脚步声.赶紧穿.她在我房间里没出声,但我父亲肯定看出来了.于是问我:母亲去哪了,然后他去找她. 太尴尬了,那晚我 ...

  4. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  5. 我为什么要进国企----HP大中华区总裁孙振耀退休感言

    一.关于工作与生活 我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的.我见过的40岁附近的外企经理人大多 ...

  6. 转(HP大中华区总裁孙振耀退休感言)

    开篇转发一篇好文,苦闷,消沉,寂寞,堕落的时候看看. 发现这篇文章是09年之前就有人转发到自己博客了.放到自己的地盘,容易记起有这么个心灵鸡汤.   一.关于工作与生活 我有个有趣的观察,外企公司多的 ...

  7. 一名IT从业者的英语口语能力成长路径

    一名IT从业者的英语口语能力成长路径 来源: 微信公众号  发布时间: 2014-03-12 22:53  阅读: 6134 次  推荐: 24   原文链接   [收藏]   这篇文章是我最近十天口 ...

  8. mind nerverr later(转)

    每个人都有感到失落迷惘的时候.人生用专制又霸道的方式运行着,每当我们心想一切尘埃落定.生活稳固的时候,生活总爱给我们惊喜,粉碎我们短暂的安逸,让我们不得不重新思考—_— “我走对路了吗?” “我能够赚 ...

  9. 【转】HP(惠普)大中华区总裁孙振耀退休感言

    一.关于工作与生活我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的.我见过的40岁附近的外企经理人大多在 ...

随机推荐

  1. day03用户交互、基本数据类型、运算符

    用户交互 在实际应用中,我们经常需要用户输入相应信息,根据用户输入信息进行反馈,此时我们需要input/output信息 python中提供了便捷的输入方法input()和print() 在pytho ...

  2. xdoj-1319 求树上任意一点的最大距离----利用树的直径

    1 #include <bits/stdc++.h> using namespace std; ; vector < vector <int> > g(N); in ...

  3. python-基础-文件

    一.文件操作 打开文件时,需要指定文件路径和以何等方式打开文件, 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 打开文件的模式有: r ,只读模式[默认模式 ...

  4. 重新生成ssh

    解决码云出现git@gitee.com: Permission denied (publickey). 很久之前好像改了ssh的一些配置,导致现在对git进行一些操作时,就会出现 当时就去百度,结果很 ...

  5. Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法

    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...

  6. expect脚本实例

    #!/usr/bin/expect //必须写这句,表明使用expect,有些系统可能没有自带,使用yum install expect -y 安装 spawn ssh 192.168.2.128 / ...

  7. php7 php-fpm 重启

    PHP7中php.ini.php-fpm和www.conf的配置 http://www.tuicool.com/articles/NjmQNj6 php-fpm 关闭:  kill -SIGINT ` ...

  8. react 子组件访问父组件的方法

    回调函数(推荐) 地址:https://ourcodeworld.com/articles/read/409/how-to-update-parent-state-from-child-compone ...

  9. openstack常见问题

    openstack通过kolla-ansible添加一个计算节点,并部署后,发现控制节点上无法发现新加的计算节点, 在控制节点的  nova_scheduler.nova_api容器上执行发现计算节点 ...

  10. Typescript学习总结之泛型

    泛型: 参数化的类型,一般用来限制结合的内容 class Student { constructor(public name: string) { } say() { console.log(this ...