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岁附近的外企经理人大多在 ...
随机推荐
- P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)
题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...
- MyBatis 遍历数组放入in中
必须要遍历出数组的值放入in中 如果直接将"'2','3','4','5','6','7','8'" 字符串放入in中,只会查出 inv_operate_type的值为2的数据,因 ...
- kafka安装和部署
阅读目录 一.环境配置 二.操作过程 Kafka介绍 安装及部署 回到顶部 一.环境配置 操作系统:Cent OS 7 Kafka版本:0.9.0.0 Kafka官网下载:请点击 JDK版本:1.7. ...
- 由testcase数据之分析
一.获取data来源 1.利用openpyxl从excel表格获取数据,相较于xlrd,openpyxl可以将表格里的样式也传递过来的优势 xlrd ----------------- ht ...
- json/pickle模块(序列化)
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes 为什么要序列化? 你打游戏过程中,打累了,停下来,关掉游戏.想 ...
- 《DSP using MATLAB》Problem 6.22
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- day11hadoop高可用和Hive
PS:视频一直就是在演示 高可用(比较偏运维一点) PS:Active是对外提供服务的,standBy是从属备用的:但是他们是怎样保证同步的数据的呢?一个运行中zookeeper上的第三方那个工具 ...
- Terraform 自定义provider 开发
内容来自官方文档,主要是进行学习自定义provider 开发的流程 开发说明 我们需要开发的有provider 以及resource 对于resource 我们需要进行crud 的处理,同时还需要进行 ...
- 通过LoadGenerator将Linux作为负载机进行压力测试
前提说明: 测试架构:controller部署在windows操作系统下(windows下安装loadrunner的过程,可以去网上搜下,这里不做解释),loadgenerator部署在linux下. ...
- char/unsigned char/int/short 存储范围
Type Storage size Value range char 1 byte -128 to 127 or 0 to 255 unsigned char 1 byte 0 to 255 sign ...