1251: 序列终结者

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 3778  Solved: 1583
[Submit][Status][Discuss]

Description

网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

Input

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

Output

对于每个第3种操作,给出正确的回答。

Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

Sample Output

2
【数据范围】
N<=50000,M<=100000。

复习一下splay序列操作
rev翻转标记,打标记的节点还没进行
tag增加标记,打标记的节点已经进行了
然后这个序列一开始全0
然后那个print是debug用的
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. #define lc t[x].ch[0]
  9. #define rc t[x].ch[1]
  10. #define pa t[x].fa
  11. const int N=1e5+,INF=1e9;
  12. inline int read(){
  13. char c=getchar();int x=,f=;
  14. while(c<''||c>''){if(c=='-')f=-; c=getchar();}
  15. while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
  16. return x*f;
  17. }
  18. int n,Q,op,l,r,v;
  19. struct node{
  20. int fa,ch[],size,rev,mx,v,tag;
  21. }t[N];
  22. int root;
  23. inline int wh(int x){return t[pa].ch[]==x;}
  24. inline void update(int x){
  25. t[x].size=t[lc].size+t[rc].size+;
  26. t[x].mx=max(t[x].v,max(t[lc].mx,t[rc].mx));
  27. }
  28. inline void pushDown(int x){
  29. if(t[x].rev){
  30. swap(lc,rc);
  31. if(lc) t[lc].rev^=;
  32. if(rc) t[rc].rev^=;
  33. t[x].rev=;
  34. }
  35. if(t[x].tag){
  36. int v=t[x].tag;
  37. if(lc) t[lc].tag+=v,t[lc].v+=v,t[lc].mx+=v;
  38. if(rc) t[rc].tag+=v,t[rc].v+=v,t[rc].mx+=v;
  39. t[x].tag=;
  40. }
  41. }
  42. int build(int l,int r,int f){//printf("build %d %d %d\n",l,r,f);
  43. if(l>r) return ;
  44. int x=(l+r)>>;
  45. lc=build(l,x-,x);rc=build(x+,r,x);
  46. t[x].fa=f;
  47. t[x].rev=t[x].tag=;t[x].v=t[x].mx=;
  48. update(x);
  49. return x;
  50. }
  51. inline void rotate(int x){
  52. int f=t[x].fa,g=t[f].fa,c=wh(x);
  53. if(g) t[g].ch[wh(f)]=x;t[x].fa=g;
  54. t[f].ch[c]=t[x].ch[c^];t[t[f].ch[c]].fa=f;
  55. t[x].ch[c^]=f;t[f].fa=x;
  56. update(f);update(x);
  57. }
  58. void splay(int x,int tar){
  59. for(;t[x].fa!=tar;rotate(x))
  60. if(t[pa].fa!=tar) rotate(wh(x)==wh(pa)?pa:x);
  61. if(tar==) root=x;
  62. }
  63.  
  64. inline int kth(int k){
  65. int ls=,x=root;
  66. while(x){
  67. pushDown(x);
  68. int _=ls+t[lc].size;
  69. if(_<k&&k<=_+) return x;
  70. if(k<=_) x=lc;
  71. else ls=_+,x=rc;
  72. }
  73. return -;
  74. }
  75. void add(int l,int r,int v){//printf("add %d %d %d\n",l,r,v);
  76. int p=kth(l);splay(p,);
  77. int x=kth(r+);splay(x,root);
  78. t[lc].tag+=v;t[lc].v+=v;t[lc].mx+=v;
  79. }
  80. void rev(int l,int r){
  81. int p=kth(l);splay(p,);
  82. int x=kth(r+);splay(x,root);
  83. t[lc].rev^=;
  84. }
  85. void getmax(int l,int r){
  86. int p=kth(l);splay(p,);
  87. int x=kth(r+);splay(x,root);
  88. printf("%d\n",t[lc].mx);
  89. }
  90.  
  91. void print(int x){
  92. if(x==) return;
  93. pushDown(x);
  94. if(lc) print(lc);
  95. if(x!=&&x!=n+) printf("%d ",t[x].v);
  96. if(rc) print(rc);
  97. }
  98. int main(){
  99. //freopen("in.txt","r",stdin);
  100. n=read();Q=read();
  101. t[].mx=-INF;
  102. root=build(,n+,);
  103. //for(int i=1;i<=n+2;i++) printf("hi %d %d %d\n",i,t[i].v,t[i].size);
  104. while(Q--){
  105. op=read();l=read();r=read();
  106. if(op==){v=read();add(l,r,v);}
  107. else if(op==) rev(l,r);
  108. else if(op==) getmax(l,r);
  109. //print(root);puts("");
  110. }
  111. }
 
 
 

BZOJ 1251: 序列终结者 [splay]的更多相关文章

  1. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  2. BZOJ 1251 序列终结者(Splay)

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...

  3. BZOJ 1251: 序列终结者

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3773  Solved: 1579 [Submit][Status][Dis ...

  4. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

  5. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  6. 1251. 序列终结者【平衡树-splay】

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  7. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

  8. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

    4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序列,要 ...

  9. [bzoj1251]序列终结者——splay

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

随机推荐

  1. .NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序

    在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...

  2. IIS7禁用单个静态文件的缓存配置方法

    IIS7中,想将一个经常修改的静态文件设置为不可缓存,在IIS配置界面里怎么也找不到... 一番google之后在stackoverflow里边发现了这样一段回答,最终解决了问题: just stum ...

  3. [摘录]第三部分 IBM文化(1)

    第二十章 论公司文化如果是在20世纪90年代初期,当一个人看见或者听到“IBM”时,他会联想到什么呢?或许是“大计算机”.“个人电脑”或者“ThinkPads”.但是,他们同时也必然会想到“大公司”. ...

  4. android使用PullToRefresh实现上拉加载和下拉刷新效果

    其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...

  5. 微服务(Microservices)—Martin Fowler【翻译】

    本文转载自:http://www.cnblogs.com/liuning8023/p/4493156.html -------------------------------------------- ...

  6. MessageBox.Show()的各种用法

    [函数] <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon); [函 ...

  7. JavaScript原型链分析

    Js之原型链    1.object 与 Object        1.object是类型,表示对象类型        2.Object是函数    2.js成员的访问规则        o.方法( ...

  8. C#——this关键字(1)

    //我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 在学习C#的时候,老师讲的示 ...

  9. 使用SignalR实现服务端消息推送

    概述 这篇文章参考的是Server Broadcast with SignalR 2这篇教程,很不错的一篇教程,如果有兴趣的话可以查看原文,今天记录下来作为一个学习笔记,这样今后翻阅会更方便一点. 这 ...

  10. C# 高效编程笔记2

    C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...