uoj169:元旦老人与数列
sol :线段树..........蜜汁TLE了一个点,不管了.....
代码抄snowMyDream的,orz...........
线段树需要维护以下奇奇怪怪的一堆东西......
区间最小值及其lazy标记
区间严格次小值及其lazy标记
最小值、严格次小值lazy标记的前缀和,历史最小值
dalao的博客说了一堆势能之类的东西我也没看懂.......我是看代码才明白的QAQ
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #define inf 2147483647
- using namespace std;
- const int Mx=;
- int n,m,root,a[Mx],l[Mx],r[Mx];
- int tot,lson[Mx],rson[Mx],val[Mx],lazy[Mx],sum[Mx],Mnhis[Mx];
- int Val[Mx],Lazy[Mx],Sum[Mx];//次小值
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
- while(ch>=''&&ch<='') { x=x*+ch-''; ch=getchar(); }
- return x*f;
- }
- void pushup(int x)
- {
- int L=lson[x],R=rson[x];
- Mnhis[x]=min(Mnhis[L],Mnhis[R]);
- val[x]=min(val[L],val[R]);
- if(val[L]!=val[R])
- Val[x]=min(max(val[L],val[R]),min(Val[L],Val[R]));
- else
- Val[x]=min(Val[L],Val[R]);
- }
- void build(int &x,int L,int R)
- {
- x=++tot,l[x]=L,r[x]=R;
- if(L==R)
- val[x]=a[L],Val[x]=inf,Mnhis[x]=val[x];
- else
- {
- int mid=(L+R)/;
- build(lson[x],L,mid);
- build(rson[x],mid+,R);
- pushup(x);
- }
- }
- void Push(int x,int i,bool flag)
- {
- int la=lazy[i],La=Lazy[i],su=sum[i],Su=Sum[i];
- if(!flag) la=La,su=Su;
- Mnhis[x]=min(Mnhis[x],val[x]+su);
- val[x]+=la; if(Val[x]!=inf) Val[x]+=La;
- sum[x]=min(sum[x],lazy[x]+su),Sum[x]=min(Sum[x],Lazy[x]+Su);
- lazy[x]+=la,Lazy[x]+=La;
- }
- void pushdown(int x)
- {
- if(!lazy[x]&&!Lazy[x]&&sum[x]>=&&Sum[x]>=) return ;
- int L=lson[x],R=rson[x];
- if(val[L]==val[R]) Push(L,x,),Push(R,x,);
- if(val[L]<val[R]) Push(L,x,),Push(R,x,);
- if(val[L]>val[R]) Push(L,x,),Push(R,x,);
- lazy[x]=Lazy[x]=sum[x]=Sum[x]=;
- }
- void Add(int x,int ll,int rr,int c)
- {
- int L=l[x],R=r[x];
- if(L>rr||R<ll) return ;
- if(ll<=L&&rr>=R)
- {
- val[x]+=c; if(Val[x]!=inf) Val[x]+=c;
- lazy[x]+=c,Lazy[x]+=c;
- sum[x]=min(sum[x],lazy[x]),Sum[x]=min(Sum[x],Lazy[x]);
- Mnhis[x]=min(Mnhis[x],val[x]);
- }
- else
- {
- pushdown(x);
- Add(lson[x],ll,rr,c);
- Add(rson[x],ll,rr,c);
- pushup(x);
- }
- }
- void Max(int x,int ll,int rr,int c)
- {
- int L=l[x],R=r[x];
- if(L>rr||R<ll) return ;
- if(ll<=L&&rr>=R&&Val[x]>c)
- {
- if(val[x]<c)
- {
- lazy[x]+=c-val[x];
- val[x]=c;
- }
- }
- else
- {
- pushdown(x);
- Max(lson[x],ll,rr,c);
- Max(rson[x],ll,rr,c);
- pushup(x);
- }
- }
- int Query(int x,int ll,int rr,bool flag)
- {
- int L=l[x],R=r[x];
- if(L>rr||R<ll) return inf;
- if(ll<=L&&rr>=R)
- {
- if(flag) return Mnhis[x];
- else return val[x];
- }
- else
- {
- pushdown(x);
- int ans=min(Query(lson[x],ll,rr,flag),Query(rson[x],ll,rr,flag));
- pushup(x);
- return ans;
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++) a[i]=read();;
- build(root,,n);
- for(int i=,num,x,y,z;i<=m;i++)
- {
- scanf("%d%d%d",&num,&x,&y);
- if(num==) z=read(),Add(root,x,y,z);
- if(num==) z=read(),Max(root,x,y,z);
- if(num==) printf("%d\n",Query(root,x,y,));
- if(num==) printf("%d\n",Query(root,x,y,));
- }
- return ;
- }
uoj169:元旦老人与数列的更多相关文章
- UOJ169. 【UR #11】元旦老人与数列
传送门 考虑用 \(segment~tree~beats\) 那一套理论,维护区间最小值 \(mn\) 和严格次小值 \(se\) 那么可以直接 \(mlog^2n\) 维护前三个操作 考虑维护历史最 ...
- 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)
传送门 线段树好题. 维护区间加,区间取最大值,维护区间最小值,历史区间最小值. 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史 ...
- 【UOJ#169】元旦老人与数列
论文题. 考虑到这题的维护和区间操作是反向的,也就是说无法像V那题快速的合并标记. 我们知道,一个区间的最小值和其他值是可以分开来维护的,因为如果一个区间被整体覆盖,那么最小值始终是最小值. 对于被覆 ...
- UR11 A.元旦老人与汉诺塔
题目:http://uoj.ac/contest/23/problem/167 如果我们拿个map来存状态的话.设当前状态是v,下一个状态是s.有f[i+1][s]+=f[i][v]. 初始f[0][ ...
- [UOJ #167]【UR #11】元旦老人与汉诺塔
题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$.$n,m\leqslant100$ 题解:首先可以知道的是,一个状态最多可以转移到其 ...
- 网路流 uoj 168 元旦老人与丛林
http://uoj.ac/problem/168 没想到是网络流 官方题解地址 http://jiry-2.blog.uoj.ac/blog/1115 subtask2告诉我们度数为012的点对答案 ...
- uoj167 元旦老人与汉诺塔(记忆化搜索)
QwQ太懒了,题目直接复制uoj的了 QwQ这个题可以说是十分玄学的一道题了 首先可以暴搜,就是\(dfs\)然后模拟每个过程是哪个柱子向哪个柱子移动 不多解释了,不过实现起来还是有一点点难度的 直接 ...
- 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)
传送门 线段树好题. 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值. 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,90" role="prese ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- Linux相关知识
1.设置代理 sudo vi /etc/apt/apt.conf Acquire::http::Proxy "http://proxy_address:8080/"; 2.生成 s ...
- Struts2之基于配置的字段校验
上一篇struts2之输入校验介绍了手动完成输入校验,也即依靠重写validate方法和validateXxx方法,指定请求某个方法时对传入的参数进行校验. 本篇介绍基于配置的字段校验.下面是登录的常 ...
- (转)为什么国外 MMORPG 中不采用自动寻路等功能?
不只是自动寻路,现在网游中的教学引导系统,辅助系统的功能强大程度,友好程度都可以说到了变态的程度,开发这些功能投入的资源甚至要超过游戏内容本身.究其原因,还是竞争越来越激烈,人心越来越浮躁,游戏商家为 ...
- #Python编程从入门到实践#第二章笔记
1.变量 (1)变量名只能包含字母.数字和下划线,不能包含空格 (2)不要将python关键字与函数名作为变量名 (3)简短有描述性,避免使用小写字母l和大写字母O (4)python 始终 ...
- #Python编程从入门到实践#第四章笔记
#Python编程从入门到实践#第四章笔记 操作列表 1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...
- lan口和wan口的配置
路由器的一排网线接口,分为 lan 和 wan .但不是谁生来就是lan口 或者 wan口 . 也没有谁规定就一个wan口 就只有一个. 网口就是网口, 决定它是 lan口 还是 wan口 ,是由我们 ...
- ZOJ3553 概率DP
Bloodsucker In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them ...
- P1338 末日的传说 逆序数对
题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...
- html_parser.py
coding=UTF-8 # HTML解释器 import re from bs4 import BeautifulSoup class htmlParser(): def parse(self, u ...
- 1082: [SCOI2005]栅栏
链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...