UOJ169. 【UR #11】元旦老人与数列
来源:互联网 发布:淘宝达人机构申请 编辑:程序博客网 时间:2024/04/29 12:08
UOJ169. 【UR #11】元旦老人与数列
线段树
UOJ传送点
((٩(//̀Д/́/)۶))这是我见过的最恶心的线段树,最开始还以为有什么巧妙的办法,所以这个
迷之元旦老人的背景就不管了,就是给你一个数列,4种操作:一段区间加个数,一段区间所有值与一个值取个max,区间查询最小值,因为B数组是单调递减的(与A数组取min),B区间的查询就是求A的历史最小值
暴力
后面的分数注定这是一道神题 \(▔^▔)/,其实写法很暴力,主要是复杂度的证明很麻烦,因为正解感觉很多都是暴力修改,好像过不了的样子。
题解
我们定义一个函数
线段树上就不只维护
vai :区间最小值lai :最小值的lazy 标记sai :最小值的lazy 标记的最小前缀和(为了维护历史最小值)vbi :区间严格次小值(没有就让它等于极大值INF )lbi :严格次小值的lazy 标记sbi :严格次小值的lazy 标记的最小前缀和hi :历史最大值
因为
既然是暴力,那么其中一次修改复杂度可能会达到
那个
这么霸气的线段树连初始化都要好好想一下(其实差不多,反正想一下就行,
代码调了好久,一开始没用堆行线段树,常数很大,比别人跑得慢,极限数据直接T了,我自己的随机数据直接8秒,然后没管这道题了,后来有调了很久,结果迷之AC,什么都没改,迷,( ̄ε  ̄),但是自己出的数据还是会超2S,可能是UOJ感觉这种线段树常数比较大,所以
#include <iostream>#include <cstdlib>#include <cstdio>#include <ctime>using namespace std;const int maxn = 1000000 + 13, INF = 0x7fffffff;int n, m, task, a, b, c, root, pos, da[maxn];int l[maxn], r[maxn], ls[maxn], rs[maxn], start;int va[maxn], vb[maxn], la[maxn], lb[maxn], sa[maxn], sb[maxn], his[maxn];int min(int a, int b) {return a < b ? a : b;}int max(int a, int b) {return a > b ? a : b;}void read(int &a) { a = 0; bool judge = false, fu = false; char c; while((c = getchar()) != EOF) { if(c == '-') {fu = true; continue;} if(c == ' ' || c == '\n') { if(!judge) continue; if(fu) a *= -1; return; } a = a * 10 + (c - '0'); judge = true; }}void helpPush(int x, int i, bool is) { int LA = la[i], LB = lb[i], SA = sa[i], SB = sb[i]; if(!is) LA = LB, SA = SB; his[x] = min(his[x], va[x] + SA); va[x] += LA; if(vb[x] != INF) vb[x] += LB; sa[x] = min(sa[x], la[x] + SA); sb[x] = min(sb[x], lb[x] + SB); la[x] += LA; lb[x] += LB;}void pushDown(int i) { if(!la[i] && !lb[i] && sa[i] >= 0 && sb[i] >= 0) return; int LS = ls[i], RS = rs[i], VL = va[LS], VR = va[RS]; if(VL == VR) helpPush(LS, i, true), helpPush(RS, i, true); if(VL < VR) helpPush(LS, i, true), helpPush(RS, i, false); if(VL > VR) helpPush(LS, i, false), helpPush(RS, i, true); la[i] = lb[i] = sa[i] = sb[i] = 0;}void update(int i) { int LS = ls[i], RS = rs[i]; his[i] = min(his[LS], his[RS]); va[i] = min(va[LS], va[RS]); int a = max(va[LS], va[RS]), b = min(vb[LS], vb[RS]); if(va[LS] != va[RS]) vb[i] = min(a, b); else vb[i] = b;}void builtTree(int &i, int A, int B) { i = ++pos; l[i] = A; r[i] = B; if(A == B) { va[i] = da[A]; vb[i] = INF; his[i] = va[i]; return; } int mid = (A + B) >> 1; builtTree(ls[i], A, mid); builtTree(rs[i], mid + 1, B); update(i);}void plusOnTree(int i, int A, int B, int val) { int L = l[i], R = r[i]; if(R < A || L > B) return; if(A <= L && R <= B) { va[i] += val; if(vb[i] != INF) vb[i] += val; la[i] += val; lb[i] += val; sa[i] = min(sa[i], la[i]); sb[i] = min(sb[i], lb[i]); his[i] = min(his[i], va[i]); return; } pushDown(i); plusOnTree(ls[i], A, B, val); plusOnTree(rs[i], A, B, val); update(i);}void maxOnTree(int i, int A, int B, int val) { int L = l[i], R = r[i]; if(R < A || L > B) return; if(A <= L && R <= B && vb[i] > val) { if(va[i] >= val) return; la[i] += (val - va[i]); va[i] = val; return; } pushDown(i); maxOnTree(ls[i], A, B, val); maxOnTree(rs[i], A, B, val); update(i);}int Query(int i, int A, int B, bool HIS) { int L = l[i], R = r[i]; if(R < A || L > B) return INF; if(A <= L && R <= B) { if(HIS) return his[i]; return va[i]; } pushDown(i); int temp = min(Query(ls[i], A, B, HIS), Query(rs[i], A, B, HIS)); update(i); return temp;}int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) read(da[i]); builtTree(root, 1, n); for(int i = 1; i <= m; i++) { read(task); read(a); read(b); if(task <= 2) read(c); if(task == 1) plusOnTree(root, a, b, c); if(task == 2) maxOnTree(root, a, b, c); if(task == 3) printf("%d\n", Query(root, a, b, false)); if(task == 4) printf("%d\n", Query(root, a, b, true)); } return 0;}
- UOJ169. 【UR #11】元旦老人与数列
- #169. 【UR #11】元旦老人与数列
- 【UR #4】元旦激光炮
- UOJ52——【UR #4】元旦激光炮
- UOJ 51 [UR #4]元旦三侠的游戏
- 《老人与海》
- 老人与海
- 《老人与海》
- 老人与海读后感
- 海明威《老人与海》
- 老人与狗
- 老人与死神
- 读《老人与海》
- 老人与黑人小孩子
- 海呜威 老人与海
- 《老人与狗》
- 《老人与海》
- 老人与流浪狗
- 【特征检测】LIOP特征描述算法
- mysql存储过程中使用事务
- C++学习之继承篇(多继承与多重继承)
- 从零开始配置Jenkins(三)——用户权限管理
- 自定义html标签属性,并通过JQuery获取
- UOJ169. 【UR #11】元旦老人与数列
- 【 bzoj 3514 】Codechef MARCH14 GERALD07加强版 - LCT
- CRS-2527: Unable to start 'ora.LISTENER.lsnr' because it has a 'hard' dependency on 'ora.cluster_vip
- 开源监控软件ganglia安装手册
- java实现排序二叉树
- HTML5:组织内容
- CNN卷积神经网络的改进(15年最新paper)
- opencv图像处理基本操作
- java请求第三方接口