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岁附近的外企经理人大多在 ...
随机推荐
- Gym .102021 .German Collegiate Programming Contest (GCPC 18) (寒假gym自训第三场)
B .Battle Royale 题意:给你两个点A,B,以及一个圆S,保证两个点在圆外,且其连线与圆相交,求两点间最短距离. 思路:显然是要分别与圆相切,然后在圆弧想走,直到相交. 那么ans=与圆 ...
- background-position 的设置
不应该按移动端的实际宽度或高度设置,应该按切出来图片的宽度设置,比如精灵图中有两个图片,各宽500px,那position应该设置为500px 0:而不是250px 0
- sed 等相关的复习
sed相打印两行之间的内容: sed -n '/111/,/aad/p' fuxi.txt grep -n ".*" fuxi.txt sed -n '2,9'p fuxi.txt ...
- CTEX(LaTeX) 编译 中文
CTEX 中文编码&编译问题 #win10 tex 文档为 GBK 编码 https://zhidao.baidu.com/question/93645685.html \documentcl ...
- 【shell编程】之基础知识-语法
一.shell变量 1.定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要), 如: your_name="runoob.com" 注意,变量名和等号之间不能有空格 ...
- redis源码之压缩列表ziplist
压缩列表ziplist1.简介连续,无序的数据结构.压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构. 2.组成 属性 类型 长 ...
- hive 分隔符替换
Hive建表的时候虽然可以指定字段分隔符,不过用insert overwrite local directory这种方式导出文件时,字段的分割符会被默认置为\001,一般都需要将字段分隔符转换为其它字 ...
- software download
Develop Sourceinsight 3.50.0066 http://pan.baidu.com 这个版本支持输入文件名的一部分来查找文件,而不像3.50.0029必须输入完整的文件名 VFP ...
- Hiveserver2 OOM问题解法
数据平台做一些计算需要通过hive jdbc方式连到hiveserver2执行job,但是hiveserver 正常运行一段时间后,总是会报如下OOM: 1 2 3 4 5 6 7 8 9 10 ...
- 【转存】Vue组件选项props
原帖地址 前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 ...