题意:http://uoj.ac/problem/169

sol  :线段树..........蜜汁TLE了一个点,不管了.....

   代码抄snowMyDream的,orz...........

   线段树需要维护以下奇奇怪怪的一堆东西......

     区间最小值及其lazy标记

     区间严格次小值及其lazy标记

     最小值、严格次小值lazy标记的前缀和,历史最小值

   dalao的博客说了一堆势能之类的东西我也没看懂.......我是看代码才明白的QAQ

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #define inf 2147483647
  6. using namespace std;
  7. const int Mx=;
  8. int n,m,root,a[Mx],l[Mx],r[Mx];
  9. int tot,lson[Mx],rson[Mx],val[Mx],lazy[Mx],sum[Mx],Mnhis[Mx];
  10. int Val[Mx],Lazy[Mx],Sum[Mx];//次小值
  11.  
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
  16. while(ch>=''&&ch<='') { x=x*+ch-''; ch=getchar(); }
  17. return x*f;
  18. }
  19.  
  20. void pushup(int x)
  21. {
  22. int L=lson[x],R=rson[x];
  23. Mnhis[x]=min(Mnhis[L],Mnhis[R]);
  24. val[x]=min(val[L],val[R]);
  25. if(val[L]!=val[R])
  26. Val[x]=min(max(val[L],val[R]),min(Val[L],Val[R]));
  27. else
  28. Val[x]=min(Val[L],Val[R]);
  29. }
  30.  
  31. void build(int &x,int L,int R)
  32. {
  33. x=++tot,l[x]=L,r[x]=R;
  34. if(L==R)
  35. val[x]=a[L],Val[x]=inf,Mnhis[x]=val[x];
  36. else
  37. {
  38. int mid=(L+R)/;
  39. build(lson[x],L,mid);
  40. build(rson[x],mid+,R);
  41. pushup(x);
  42. }
  43. }
  44.  
  45. void Push(int x,int i,bool flag)
  46. {
  47. int la=lazy[i],La=Lazy[i],su=sum[i],Su=Sum[i];
  48. if(!flag) la=La,su=Su;
  49. Mnhis[x]=min(Mnhis[x],val[x]+su);
  50. val[x]+=la; if(Val[x]!=inf) Val[x]+=La;
  51. sum[x]=min(sum[x],lazy[x]+su),Sum[x]=min(Sum[x],Lazy[x]+Su);
  52. lazy[x]+=la,Lazy[x]+=La;
  53. }
  54.  
  55. void pushdown(int x)
  56. {
  57. if(!lazy[x]&&!Lazy[x]&&sum[x]>=&&Sum[x]>=) return ;
  58. int L=lson[x],R=rson[x];
  59. if(val[L]==val[R]) Push(L,x,),Push(R,x,);
  60. if(val[L]<val[R]) Push(L,x,),Push(R,x,);
  61. if(val[L]>val[R]) Push(L,x,),Push(R,x,);
  62. lazy[x]=Lazy[x]=sum[x]=Sum[x]=;
  63. }
  64.  
  65. void Add(int x,int ll,int rr,int c)
  66. {
  67. int L=l[x],R=r[x];
  68. if(L>rr||R<ll) return ;
  69. if(ll<=L&&rr>=R)
  70. {
  71. val[x]+=c; if(Val[x]!=inf) Val[x]+=c;
  72. lazy[x]+=c,Lazy[x]+=c;
  73. sum[x]=min(sum[x],lazy[x]),Sum[x]=min(Sum[x],Lazy[x]);
  74. Mnhis[x]=min(Mnhis[x],val[x]);
  75. }
  76. else
  77. {
  78. pushdown(x);
  79. Add(lson[x],ll,rr,c);
  80. Add(rson[x],ll,rr,c);
  81. pushup(x);
  82. }
  83. }
  84.  
  85. void Max(int x,int ll,int rr,int c)
  86. {
  87. int L=l[x],R=r[x];
  88. if(L>rr||R<ll) return ;
  89. if(ll<=L&&rr>=R&&Val[x]>c)
  90. {
  91. if(val[x]<c)
  92. {
  93. lazy[x]+=c-val[x];
  94. val[x]=c;
  95. }
  96. }
  97. else
  98. {
  99. pushdown(x);
  100. Max(lson[x],ll,rr,c);
  101. Max(rson[x],ll,rr,c);
  102. pushup(x);
  103. }
  104. }
  105.  
  106. int Query(int x,int ll,int rr,bool flag)
  107. {
  108. int L=l[x],R=r[x];
  109. if(L>rr||R<ll) return inf;
  110. if(ll<=L&&rr>=R)
  111. {
  112. if(flag) return Mnhis[x];
  113. else return val[x];
  114. }
  115. else
  116. {
  117. pushdown(x);
  118. int ans=min(Query(lson[x],ll,rr,flag),Query(rson[x],ll,rr,flag));
  119. pushup(x);
  120. return ans;
  121. }
  122. }
  123.  
  124. int main()
  125. {
  126. scanf("%d%d",&n,&m);
  127. for(int i=;i<=n;i++) a[i]=read();;
  128. build(root,,n);
  129. for(int i=,num,x,y,z;i<=m;i++)
  130. {
  131. scanf("%d%d%d",&num,&x,&y);
  132. if(num==) z=read(),Add(root,x,y,z);
  133. if(num==) z=read(),Max(root,x,y,z);
  134. if(num==) printf("%d\n",Query(root,x,y,));
  135. if(num==) printf("%d\n",Query(root,x,y,));
  136. }
  137. return ;
  138. }

uoj169:元旦老人与数列的更多相关文章

  1. UOJ169. 【UR #11】元旦老人与数列

    传送门 考虑用 \(segment~tree~beats\) 那一套理论,维护区间最小值 \(mn\) 和严格次小值 \(se\) 那么可以直接 \(mlog^2n\) 维护前三个操作 考虑维护历史最 ...

  2. 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)

    传送门 线段树好题. 维护区间加,区间取最大值,维护区间最小值,历史区间最小值. 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史 ...

  3. 【UOJ#169】元旦老人与数列

    论文题. 考虑到这题的维护和区间操作是反向的,也就是说无法像V那题快速的合并标记. 我们知道,一个区间的最小值和其他值是可以分开来维护的,因为如果一个区间被整体覆盖,那么最小值始终是最小值. 对于被覆 ...

  4. UR11 A.元旦老人与汉诺塔

    题目:http://uoj.ac/contest/23/problem/167 如果我们拿个map来存状态的话.设当前状态是v,下一个状态是s.有f[i+1][s]+=f[i][v]. 初始f[0][ ...

  5. [UOJ #167]【UR #11】元旦老人与汉诺塔

    题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$.$n,m\leqslant100$ 题解:首先可以知道的是,一个状态最多可以转移到其 ...

  6. 网路流 uoj 168 元旦老人与丛林

    http://uoj.ac/problem/168 没想到是网络流 官方题解地址 http://jiry-2.blog.uoj.ac/blog/1115 subtask2告诉我们度数为012的点对答案 ...

  7. uoj167 元旦老人与汉诺塔(记忆化搜索)

    QwQ太懒了,题目直接复制uoj的了 QwQ这个题可以说是十分玄学的一道题了 首先可以暴搜,就是\(dfs\)然后模拟每个过程是哪个柱子向哪个柱子移动 不多解释了,不过实现起来还是有一点点难度的 直接 ...

  8. 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)

    传送门 线段树好题. 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值. 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,90" role="prese ...

  9. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. Linux相关知识

    1.设置代理 sudo vi /etc/apt/apt.conf Acquire::http::Proxy "http://proxy_address:8080/"; 2.生成 s ...

  2. Struts2之基于配置的字段校验

    上一篇struts2之输入校验介绍了手动完成输入校验,也即依靠重写validate方法和validateXxx方法,指定请求某个方法时对传入的参数进行校验. 本篇介绍基于配置的字段校验.下面是登录的常 ...

  3. (转)为什么国外 MMORPG 中不采用自动寻路等功能?

    不只是自动寻路,现在网游中的教学引导系统,辅助系统的功能强大程度,友好程度都可以说到了变态的程度,开发这些功能投入的资源甚至要超过游戏内容本身.究其原因,还是竞争越来越激烈,人心越来越浮躁,游戏商家为 ...

  4. #Python编程从入门到实践#第二章笔记

      ​​​1.变量 (1)变量名只能包含字母.数字和下划线,不能包含空格 (2)不要将python关键字与函数名作为变量名 (3)简短有描述性,避免使用小写字母l和大写字母O (4)python 始终 ...

  5. #Python编程从入门到实践#第四章笔记

    #Python编程从入门到实践#第四章笔记   操作列表 ​​​1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...

  6. lan口和wan口的配置

    路由器的一排网线接口,分为 lan 和 wan .但不是谁生来就是lan口 或者 wan口 . 也没有谁规定就一个wan口 就只有一个. 网口就是网口, 决定它是 lan口 还是 wan口 ,是由我们 ...

  7. ZOJ3553 概率DP

    Bloodsucker In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them ...

  8. P1338 末日的传说 逆序数对

    题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...

  9. html_parser.py

    coding=UTF-8 # HTML解释器 import re from bs4 import BeautifulSoup class htmlParser(): def parse(self, u ...

  10. 1082: [SCOI2005]栅栏

    链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...