BZOJ3642 : [CEOI 2014] Cake
rank[i]表示第i美味的是哪块
left[i]表示在k左边美味度为i的是哪块
right[i]表示在k右边美味度为i的是哪块
用3棵线段树分别维护d序列的区间最大值、left序列的区间最大值、right序列的区间最小值
修改:
把第x块改成第y美味
把第y+1到第9美味的全部后移一位
然后把第x块美味度改成最大值+1
然后把第y-1到第1美味的美味度依次改成最大
查询:
设x到k这一段中美味度的最大值为y
求出k另一侧最靠近k的且美味度大于y的位置z
答案为|z-x|-1
时间复杂度为每次操作$O(\log n)$
一开始写了普通线段树被卡常数了TAT(最近怎么都被卡常数)
然后去学了zkw线段树后改成zkw线段树就过了,效果拔群,又快又短。
zkw线段树真是个好东西。
#include<cstdio>
const int N=250010,inf=~0U>>1;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline void Max(int&a,int b){if(a<b)a=b;}
inline void Min(int&a,int b){if(a>b)a=b;}
int n,m,t,q,k,i,x,y,rank[N],d[N],left[5250010],right[5250010],M1,M2,ta_v[530000],tl_v[16777220],tr_v[16777220],que[500010][3];
char ch;
inline void ta_change(int x,int y){for(ta_v[x+=M1]=y,x>>=1;x;x>>=1)ta_v[x]=max(ta_v[x<<1],ta_v[x<<1|1]);}
inline int ta_ask(int x,int y){
int t=-inf;
for(x+=M1-1,y+=M1+1;x^y^1;x>>=1,y>>=1){
if(~x&1)Max(t,ta_v[x^1]);
if(y&1)Max(t,ta_v[y^1]);
}
return t;
}
inline void tl_change(int x,int y){for(tl_v[x+=M2]=y,x>>=1;x;x>>=1)tl_v[x]=max(tl_v[x<<1],tl_v[x<<1|1]);}
inline int tl_ask(int x,int y){
int t=-inf;
for(x+=M2-1,y+=M2+1;x^y^1;x>>=1,y>>=1){
if(~x&1)Max(t,tl_v[x^1]);
if(y&1)Max(t,tl_v[y^1]);
}
return t;
}
inline void tr_change(int x,int y){for(tr_v[x+=M2]=y,x>>=1;x;x>>=1)tr_v[x]=min(tr_v[x<<1],tr_v[x<<1|1]);}
inline int tr_ask(int x,int y){
int t=inf;
for(x+=M2-1,y+=M2+1;x^y^1;x>>=1,y>>=1){
if(~x&1)Min(t,tr_v[x^1]);
if(y&1)Min(t,tr_v[y^1]);
}
return t;
}
inline void modify(int x,int y){//d[x]改成y
if(x<k)tl_change(d[x],0);
if(x>k)tr_change(d[x],n+1);
ta_change(x,d[x]=y);
if(x<k)tl_change(y,x);
if(x>k)tr_change(y,x);
}
inline void change(int x,int y){//把第x块蛋糕设置成第y美味
int i,j=0;
for(i=1;i<=10;i++)if(rank[i]==x)j=i;
for(i=j?j:10;i>y;i--)rank[i]=rank[i-1];
for(modify(rank[y]=x,++t),i=y-1;i;i--)modify(rank[i],++t);
}
inline int ask(int x){
if(x==k)return 0;
return x<k?tr_ask(ta_ask(x,k-1)+1,m)-x-1:x-tl_ask(ta_ask(k+1,x)+1,m)-1;
}
int main(){
read(n),read(k);
for(i=1;i<=n;i++)read(d[i]),rank[n-d[i]+1]=i;
read(q);
m=(t=n)+1;
for(i=1;i<=q;i++){
while(!(((ch=getchar())=='E')||(ch=='F')));
if(ch=='E')read(que[i][1]),read(que[i][2]),m+=que[i][2];else que[i][0]=1,read(que[i][1]);
}
for(i=1;i<=m;i++)right[i]=n+1;
for(i=1;i<k;i++)left[d[i]]=i;
for(i=k+1;i<=n;i++)right[d[i]]=i;
for(M1=1;M1<n+2;M1<<=1);
for(i=1;i<=n;i++)ta_v[i+M1]=d[i];
for(i=M1-1;i;i--)ta_v[i]=max(ta_v[i<<1],ta_v[i<<1|1]);
for(M2=1;M2<m+2;M2<<=1);
for(i=1;i<=m;i++)tl_v[i+M2]=left[i],tr_v[i+M2]=right[i];
for(i=M2-1;i;i--)tl_v[i]=max(tl_v[i<<1],tl_v[i<<1|1]),tr_v[i]=min(tr_v[i<<1],tr_v[i<<1|1]);
for(i=1;i<=q;i++)if(!que[i][0])change(que[i][1],que[i][2]);else printf("%d\n",ask(que[i][1]));
return 0;
}
BZOJ3642 : [CEOI 2014] Cake的更多相关文章
- CEOI 2014 wall (最短路)
描述:给定一个网格图,每个区间可能会有城市,求在边上建墙使无法从外边到达所有城市切所有城市必须联通 n,m<=400 首先对于30%的数据,n,m<=10我们可以考虑用数位dp来解决这个问 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- Web 前端攻防(2014版)
在百度 FEX 团队时写的.有次让我写点前端开发中注意的安全规范,结果写着写着就跑题了,写了一堆纯前端实现的攻击方式...当然还有防范措施. 文章就懒得粘过来了~ 直接贴个地址算了:) http:// ...
- 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...
随机推荐
- top对僵尸进程的处理
ps --forest ASCII art process tree 2 怎样来清除僵尸进程: 1.改写父进程,在子进程死后要为它收尸.具体做法是接管SIGCHLD信 ...
- 《linux备份与恢复之一》.tar.bz2与.tar.gz格式的文本压缩率比较
对于文本压缩,据说bzip的算法要优于gzip,从而拥有更好的压缩比.特地找了两个文件来做一下测试,以下为测试结果: (1)源文件为591MB, .tar.bz2文件为61MB(10.32%), ...
- Linux: xclip,pbcopy,xsel用法 terminal 复制粘帖 (mac , ubuntu)
ubuntu下的用户可以只用apt-get来安装: sudo apt-get install xclip echo "Hello, world" | xclip mac下使用pbc ...
- Web Components之Custom Elements
什么是Web Component? Web Components 包含了多种不同的技术.你可以把Web Components当做是用一系列的Web技术创建的.可重用的用户界面组件的统称.Web Com ...
- 【转】Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- iOS 利用constraint实现2个控件上下的空白是相等的
说的有点乱,先看个图把 其实这个constrant的目的就是控制两个方形的控件上方和下方的空白大小. 对于每一个方块来说,他们上方和下方的空白是相同的.这种“居中”的设计到处可见.一个控件想实现这种居 ...
- DP:Skiing(POJ 1088)
北大教你怎么滑雪 题目是中文的,要读懂题目其实不难 其实这道题挺经典的,我们这样想,他最终要找到一个最大值,这个时候我们就想到要用动态规划 那怎么用呢?我们同时这样想,由于滑雪的最高点我们不能立马找 ...
- hdu 1050 Moving Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 这道题目隔了很久才做出来的.一开始把判断走廊有重叠的算法都想错了.以为重叠只要满足,下一次mov ...
- UVALive 7270 Osu! Master (阅读理解题)
题目:传送门. 题意:阅读理解题,是一个osu的游戏,问得分.把题目翻译过来就是如果出现S或者BC后面跟的是1,ans就加1. #include <iostream> #include & ...
- 基于gitosis的Git云端服务器配置
(本文需要自己实践,由于时间关系,我仅仅是做了整理和快速的练习,至于笔记中的账号和ip域名都是我参考文章中的.如果读者有任何问题欢迎留言和发邮件到luoquantao@126.com) 硬件:云端阿里 ...