bzoj4941: [Ynoi2016]镜子里的昆虫
维护每个位置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]镜子里的昆虫的更多相关文章
- [Ynoi2016]镜中的昆虫
题目大意: 给定一个序列,有2个操作: 1. 区间覆盖.2. 区间数颜色. 解题思路: 珂朵莉树+树套树. 看到区间覆盖当然想到珂朵莉树然而这是Ynoi 所以我们得优化掉珂朵莉树那个暴力过程. 考虑对 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记1
<3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...
- XXOOJL
她的鞋子放在外面没拿进来很显眼,我们俩正抱在床上,刚做完什么也没穿,她也没擦.听到门外的脚步声.赶紧穿.她在我房间里没出声,但我父亲肯定看出来了.于是问我:母亲去哪了,然后他去找她. 太尴尬了,那晚我 ...
- 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
- 我为什么要进国企----HP大中华区总裁孙振耀退休感言
一.关于工作与生活 我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的.我见过的40岁附近的外企经理人大多 ...
- 转(HP大中华区总裁孙振耀退休感言)
开篇转发一篇好文,苦闷,消沉,寂寞,堕落的时候看看. 发现这篇文章是09年之前就有人转发到自己博客了.放到自己的地盘,容易记起有这么个心灵鸡汤. 一.关于工作与生活 我有个有趣的观察,外企公司多的 ...
- 一名IT从业者的英语口语能力成长路径
一名IT从业者的英语口语能力成长路径 来源: 微信公众号 发布时间: 2014-03-12 22:53 阅读: 6134 次 推荐: 24 原文链接 [收藏] 这篇文章是我最近十天口 ...
- mind nerverr later(转)
每个人都有感到失落迷惘的时候.人生用专制又霸道的方式运行着,每当我们心想一切尘埃落定.生活稳固的时候,生活总爱给我们惊喜,粉碎我们短暂的安逸,让我们不得不重新思考—_— “我走对路了吗?” “我能够赚 ...
- 【转】HP(惠普)大中华区总裁孙振耀退休感言
一.关于工作与生活我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的.我见过的40岁附近的外企经理人大多在 ...
随机推荐
- find 以及linux 和windows 文件互传
1. find 命令 查找文件或目录 同时也会用到的有 which whereis locate 经常也会遇到一些快捷键 ctrl + l e a w u k ...
- L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- (19)jQuery操作文本和属性
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>jq ...
- Go Example--函数多返回值
package main import "fmt" func main() { a,b := vals() fmt.Println(a) fmt.Println(b) } //函数 ...
- ios-密码加密
加密文件可到网上搜索MyMD5后下载 MyMD5.h文件 // // MyMD5.h // GoodLectures // // Created by yangshangqing on 11-10-1 ...
- 芯灵思SinA33开发板怎样安装虚拟机
芯灵思SinA33开发板怎样安装虚拟机 今天入手一块芯灵思的开发板,型号为SIN-A33,用的是全志的A33芯片,与其它开发板不同的是, 芯灵思开发板手册上用来搭建开发环境的linux系统是cento ...
- 小D课堂【SpringBoot】接口Http协议开发实战
---恢复内容开始--- ====================2.SpringBoot接口Http协议开发实战 ============================= 1.SpringBoot ...
- 常用C语言time时间函数
常见的时间函数有time( ).ctime( ).gmtime( ).localtime( ).mktime( ).asctime( ).difftime( ).gettimeofday( ).set ...
- DevExpress 中 设置 labelControl 的背景透明到图片的方法
labelControl 中的 backColor 可以设置为: TransParent 当设置为: Transparent 的时候,labelControl 的背景依然为 主form的背景颜色 ,研 ...
- mysql全备和增量备份以及恢复过程(percona工具)
实验环境 系统环境,内核版本和xtrabackup工具版本 [root@linux-node1 mysql]# cat /etc/redhat-release CentOS Linux release ...