TYVJ1427 小白逛公园
描述
一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
那么,就请你来帮小白选择公园吧。
输入格式
接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。
接 下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围 (1≤a,b≤N);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。
其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。
输出格式
测试样例1
输入
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
输出
2
-1
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #define max(a, b) ((a) > (b) ? (a) :(b)) 6 #define min(a, b) ((a) < (b) ? (a) : (b)) 7 8 inline void read(int &x) 9 { 10 x = 0;char ch = getchar(), c = ch; 11 while(ch < '0' || ch > '9')c = ch, ch = getchar(); 12 while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar(); 13 if(c == '-')x = -x; 14 } 15 16 inline void swap(int &a, int &b) 17 { 18 int tmp = a; 19 a = b,b = tmp; 20 } 21 22 const int MAXN = 600000 + 10; 23 const int INF = 0x3f3f3f3f3f3f3f3f; 24 25 int n,m,num[MAXN]; 26 27 int left[MAXN << 2], right[MAXN << 2], sum[MAXN << 2], ma[MAXN << 2]; 28 29 void build(int o = 1, int l = 1, int r = n) 30 { 31 if(l == r) 32 { 33 left[o] = right[o] = sum[o] = ma[o] = num[l]; 34 return; 35 } 36 int mid = (l + r) >> 1; 37 build(o << 1, l, mid); 38 build(o << 1 | 1, mid + 1, r); 39 40 left[o] = max(left[o << 1], sum[o << 1] + left[o << 1 | 1]); 41 right[o] = max(right[o << 1 | 1], sum[o << 1 | 1] + right[o << 1]); 42 ma[o] = max(ma[o << 1], max(ma[o << 1 | 1], right[o << 1] + left[o << 1 | 1])); 43 ma[o] = max(ma[o], max(left[o], right[o])); 44 sum[o] = sum[o << 1] + sum[o << 1 | 1]; 45 } 46 47 void modify(int p, int k, int o = 1, int l = 1, int r = n) 48 { 49 if(l == p && l == r) 50 { 51 left[o] = right[o] = sum[o] = ma[o] = k; 52 return; 53 } 54 int mid = (l + r) >> 1; 55 if(mid >= p)modify(p, k, o << 1, l, mid); 56 else modify(p, k, o << 1 | 1, mid + 1, r); 57 58 left[o] = max(left[o << 1], sum[o << 1] + left[o << 1 | 1]); 59 right[o] = max(right[o << 1 | 1], sum[o << 1 | 1] + right[o << 1]); 60 ma[o] = max(ma[o << 1], max(ma[o << 1 | 1], right[o << 1] + left[o << 1 | 1])); 61 ma[o] = max(ma[o], max(left[o], right[o])); 62 sum[o] = sum[o << 1] + sum[o << 1 | 1]; 63 } 64 65 struct Node 66 { 67 int left, right, ma, sum; 68 Node(int _left, int _right, int _ma, int _sum){left = _left, right = _right, ma = _ma, sum = _sum;} 69 Node(){left = right = ma = -INF;sum = 0;} 70 }; 71 72 Node ask(int ll, int rr, int o = 1, int l = 1, int r = n) 73 { 74 if(ll <= l && rr >= r)return Node(left[o], right[o], ma[o], sum[o]); 75 int mid = (l + r) >> 1; 76 Node re, ans1, ans2; 77 int flag1 = 0, flag2 = 0; 78 if(mid >= ll)ans1 = ask(ll, rr, o << 1, l, mid), flag1 = 1; 79 if(mid < rr)ans2 = ask(ll, rr, o << 1 | 1, mid + 1, r), flag2 = 1; 80 81 re.left = max(ans1.left, ans1.sum + ans2.left); 82 if(!flag1) re.left = max(re.left, ans2.left); 83 84 re.right = max(ans2.right, ans2.sum + ans1.right); 85 if(!flag2) re.right = max(ans2.right, re.right); 86 87 re.ma = max(re.left, max(re.right, ans1.right + ans2.left)); 88 re.ma = max(re.ma, max(ans1.ma, ans2.ma)); 89 re.sum = ans1.sum + ans2.sum; 90 return re; 91 } 92 93 int main() 94 { 95 read(n), read(m); 96 for(register int i = 1;i <= n;++ i) read(num[i]); 97 memset(left, -0x3f, sizeof(left)); 98 memset(right, -0x3f, sizeof(left)); 99 memset(ma, -0x3f, sizeof(left)); 100 build(1,1,n); 101 register int tmp1,tmp2,tmp3; 102 register Node tmp; 103 for(register int i = 1;i <= m;++ i) 104 { 105 read(tmp1), read(tmp2), read(tmp3); 106 if(tmp1 == 1) 107 { 108 if(tmp2 > tmp3)swap(tmp2, tmp3); 109 tmp = ask(tmp2, tmp3, 1, 1, n); 110 printf("%d\n", tmp.ma); 111 } 112 else modify(tmp2, tmp3, 1, 1, n); 113 } 114 return 0; 115 }
TYVJ1427
转载于:https://www.cnblogs.com/huibixiaoxing/p/7482830.html
TYVJ1427 小白逛公园相关推荐
- 【ybt高效进阶4-4-3】【luogu P4513】公园遛狗 / 小白逛公园
公园遛狗 / 小白逛公园 题目链接:ybt高效进阶4-4-3 / luogu P4513 题目大意 给你一个序列,要维护两个操作. 单点修改和在一个区间中找权值最大的子区间的权值. 思路 其实这个是很 ...
- vijos 1083 小白逛公园
描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根 ...
- P4513 小白逛公园
题目描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦- 在小新家附近有一条"公园路",路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始, ...
- 公园遛狗 / 小白逛公园【线段树】
>Link ybtoj公园遛狗 luogu P4513 >解题思路 这道题我做的时候只想到了build.insert怎么写,ask看了书以后写的(真的好巧妙T) 单点修改+区间查询使我们想 ...
- 洛谷P4513 小白逛公园
区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- 公园遛狗(小 * 逛公园)
P4513 小白逛公园 线段树求最大子段和,由于是动态的且n,m均高达1e5,因此想到线段树 #include<bits/stdc++.h> using namespace std; #d ...
- 牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)
链接:https://ac.nowcoder.com/acm/contest/392/I 来源:牛客网 华华和月月逛公园 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...
最新文章
- 华为手机连电脑_手机装进电脑里 华为MateBook X Pro 2020款升级多屏协同
- 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
- weeklyblogging_20100805PM
- 图解git原理与日常实用指南
- mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...
- display none的元素重新展示如何撑开页面_关于元素的浮动你了解多少
- 不想“被out”?来看看现在的开发者都在做什么
- 几行小代码,将Testlink的xml用例导入至excel
- java的xsd文件_java – 如何通过相对路径引用本地XSD文件
- HTML img标签无法居中
- b3log-solo 部署到GAE上
- 什么邮箱垃圾邮件少?邮箱反垃圾系统是什么?
- 【Delphi】中使用消息Messages(七)Android 系统消息
- E18-D80NK红外避障传感器使用(附32单片机源码)
- esp8266与51单片机通信(看完不会你打我)用手机控制led灯的亮灭
- 测量电压调节器输出纹波和开关瞬变的方法
- html课堂笔记2.24
- Rserver部分配置
- ssh报user not allowed because account is locked错误
- AE基础教程(6)——第6章 显示通道,分辨率解析
热门文章
- 用python画漂亮图片-Python 竟能绘制如此酷炫的三维图
- python可以干嘛知乎-一行Python代码能做什么?
- python就业前景-Python就业前景分析
- python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
- 零基础学python需要多久-零基础学习Python开发需要多长时间?
- python官网下载步骤linux-linux如何安装python
- python详细安装教程linux-python 在linux系统的安装教程
- python的jupyter的使用教程-JupyterNotebook设置Python环境的方法步骤
- python画轨迹曲线-python 画3维轨迹图并进行比较的实例
- python课程多少钱一节课-日照少儿python编程一节课多少钱