P1427 小白逛公园
时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。
    一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
    那么,就请你来帮小白选择公园吧。

输入格式

第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。
    接下来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

【题解】
线段树裸题,维护前缀最大,后缀最大,最大子区间和区间和
查询的是偶发,维护  当前区间在查询区间范围内的  前缀最大,后缀最大,最大子区间和区间和
注意这个题,有一种情况,叫l > r,要交换过来(淦淦淦淦淦淦淦淦淦淦淦淦)

  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 小白逛公园相关推荐

  1. 【ybt高效进阶4-4-3】【luogu P4513】公园遛狗 / 小白逛公园

    公园遛狗 / 小白逛公园 题目链接:ybt高效进阶4-4-3 / luogu P4513 题目大意 给你一个序列,要维护两个操作. 单点修改和在一个区间中找权值最大的子区间的权值. 思路 其实这个是很 ...

  2. vijos 1083 小白逛公园

    描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根 ...

  3. P4513 小白逛公园

    题目描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦- 在小新家附近有一条"公园路",路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始, ...

  4. 公园遛狗 / 小白逛公园【线段树】

    >Link ybtoj公园遛狗 luogu P4513 >解题思路 这道题我做的时候只想到了build.insert怎么写,ask看了书以后写的(真的好巧妙T) 单点修改+区间查询使我们想 ...

  5. 洛谷P4513 小白逛公园

    区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...

  6. P4513 小白逛公园 (线段树)

    题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...

  7. 【BZOJ】1756: Vijos1083 小白逛公园(线段树)

    题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀  区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...

  8. 公园遛狗(小 * 逛公园)

    P4513 小白逛公园 线段树求最大子段和,由于是动态的且n,m均高达1e5,因此想到线段树 #include<bits/stdc++.h> using namespace std; #d ...

  9. 牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)

    链接:https://ac.nowcoder.com/acm/contest/392/I 来源:牛客网 华华和月月逛公园 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...

最新文章

  1. 华为手机连电脑_手机装进电脑里 华为MateBook X Pro 2020款升级多屏协同
  2. 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
  3. weeklyblogging_20100805PM
  4. 图解git原理与日常实用指南
  5. mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...
  6. display none的元素重新展示如何撑开页面_关于元素的浮动你了解多少
  7. 不想“被out”?来看看现在的开发者都在做什么
  8. 几行小代码,将Testlink的xml用例导入至excel
  9. java的xsd文件_java – 如何通过相对路径引用本地XSD文件
  10. HTML img标签无法居中
  11. b3log-solo 部署到GAE上
  12. 什么邮箱垃圾邮件少?邮箱反垃圾系统是什么?
  13. 【Delphi】中使用消息Messages(七)Android 系统消息
  14. E18-D80NK红外避障传感器使用(附32单片机源码)
  15. esp8266与51单片机通信(看完不会你打我)用手机控制led灯的亮灭
  16. 测量电压调节器输出纹波和开关瞬变的方法
  17. html课堂笔记2.24
  18. Rserver部分配置
  19. ssh报user not allowed because account is locked错误
  20. AE基础教程(6)——第6章 显示通道,分辨率解析

热门文章

  1. 用python画漂亮图片-Python 竟能绘制如此酷炫的三维图
  2. python可以干嘛知乎-一行Python代码能做什么?
  3. python就业前景-Python就业前景分析
  4. python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
  5. 零基础学python需要多久-零基础学习Python开发需要多长时间?
  6. python官网下载步骤linux-linux如何安装python
  7. python详细安装教程linux-python 在linux系统的安装教程
  8. python的jupyter的使用教程-JupyterNotebook设置Python环境的方法步骤
  9. python画轨迹曲线-python 画3维轨迹图并进行比较的实例
  10. python课程多少钱一节课-日照少儿python编程一节课多少钱