CDOJ_844 程序设计竞赛
原题地址:http://acm.uestc.edu.cn/#/problem/show/844
“你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你还想和我同台竞技,做你的美梦!今天这场比赛,就是要让你知道你是多么
的无能!!”
不训练,无以为战。有n项能力是ACM竞赛要求的,训练则能提升,忽略则会荒废。
这m天,你能做到如何。
Input
第一行两个整数n,m,分别表示有n项能力要求,共有m天。
第二行n个整数,第i个整数ai表示第i项能力的数值。
接下来m行,每行开始先读入一个整数si,表明这是一次询问还是一次能力变化。
si=0,表明这是一次询问,然后读入两个整数li,ri,表示询问在[li,ri]区间中任选一段连续序列,这段序列中所有能力值之和最大能是多少。
si=1,表明这是一次能力变化,然后读入两个整数xi,wi,表示第xi项能力变为了wi。
1≤n,m≤100000,−10000≤ai≤10000,1≤li≤ri≤n,1≤xi≤n,−10000≤wi≤10000
Output
有多少询问就输出多少行,每行输出一个整数,作为对该询问的回答。
Sample input and output
| Sample Input | Sample Output |
|---|---|
4 4 |
6 |
此题使用线段树解决。不过与一般的线段树不同,这道题需要用到4个sum变量。考虑每一个节点sequ[now],令其和为sum,连接到其最左边的值的
子串的最大和为sum1,连接到其最右边的值的字串的最大和为sum2,另其连续字串的最大和为sum0。则有以下四个等式:
sequ[now].sum = sequ[2 *
now].sum + sequ[2 * now + 1].sum;
sequ[now].sum0 = max(sequ[2 *
now].sum2, max(sequ[2 * now].sum2 + sequ[2 *now + 1].sum1, max(sequ[2 *now + 1].sum1,max(sequ[2*now].su
m0,sequ[2*now+1].sum0))));
sequ[now].sum1 = max(sequ[2 *
now].sum1, sequ[2 * now].sum + sequ[2 *
now + 1].sum1);
sequ[now].sum2 = max(sequ[2 *
now + 1].sum2, sequ[2 * now + 1].sum + sequ[2 *now].sum2);
这样维护的线段树,就能得到每一个节点的各个最值。然后在询问时使用深搜,从下往上,用和更新时同样的思想,维护不断连接的区间的各个最值,
最后输出sum0,便是得到的最值。详见代码。
#include<iostream>
#include<algorithm>
#include<stack>
#include<stdio.h>
#define MAX_N 100005
#define MAX_M 100005
using namespace std; struct node
{
int left, right, sum0, sum1, sum2, sum;
node()
{
sum0 = sum1 = sum2 = sum = 0;
}
}; node sequ[4 * MAX_N + 1000];
stack<int> st; void build(int x, int l, int r)
{
sequ[x].left = l;
sequ[x].right = r;
if (l != r)
{
int k = (l + r) / 2;
build(2 * x, l, k);
build(2 * x + 1, k + 1, r);
}
} void update(int now, int n, int a)
{
if (sequ[now].left == n&&sequ[now].right == n)
sequ[now].sum = sequ[now].sum0 = sequ[now].sum1 = sequ[now].sum2 = a;
else
{
int k = (sequ[now].left + sequ[now].right) / 2;
if (k >= n)
update(2 * now, n, a);
else
update(2 * now + 1, n, a);
sequ[now].sum = sequ[2 * now].sum + sequ[2 * now + 1].sum;
sequ[now].sum0 = max(sequ[2 * now].sum2, max(sequ[2 * now].sum2 + sequ[2 * now + 1].sum1, max(sequ[2 * now + 1].sum1
,max(sequ[2*now].sum0,sequ[2*now+1].sum0))));
sequ[now].sum1 = max(sequ[2 * now].sum1, sequ[2 * now].sum + sequ[2 * now + 1].sum1);
sequ[now].sum2 = max(sequ[2 * now + 1].sum2, sequ[2 * now + 1].sum + sequ[2 * now].sum2);
}
} void ask(int l, int r, int now)
{
if (sequ[now].left == l&&sequ[now].right == r)
st.push(now);
else
{
int k = (sequ[now].right + sequ[now].left) / 2;
if (k < l)
ask(l, r, now * 2 + 1);
else if (k >= r)
ask(l, r, now * 2);
else
{
ask(l, k, now * 2);
ask(k + 1, r, now * 2 + 1);
}
}
} int answer()
{
int sumT0 = 0, sumT1 = 0, sumT2 = 0, sumT = 0;
int nr, nl;
sumT0 = sequ[st.top()].sum0;
sumT1 = sequ[st.top()].sum1;
sumT2 = sequ[st.top()].sum2;
sumT = sequ[st.top()].sum; nr = sequ[st.top()].right;
nl = sequ[st.top()].left;
st.pop(); while (!st.empty())
{
int now = st.top();
st.pop();
if (sequ[now].left == nr)
{
sumT0 = max(sumT0, max(sequ[now].sum0, max(sequ[now].sum1, max(sumT2, sumT2 + sequ[now].sum1))));
sumT1 = max(sumT1, sumT + sequ[now].sum1);
sumT2 = max(sequ[now].sum2, sequ[now].sum + sumT2);
sumT = sumT + sequ[now].sum;
nr = sequ[now].right;
}
else
{
sumT0 = max(sumT0, max(sequ[now].sum0, max(sequ[now].sum2, max(sumT1, sumT1 + sequ[now].sum2))));
sumT1 = max(sequ[now].sum1, sequ[now].sum + sumT1);
sumT2 = max(sumT2, sumT + sequ[now].sum2);
sumT = sumT + sequ[now].sum;
nl = sequ[now].left;
}
}
return sumT0;
} int main()
{
int n, m;
scanf("%d%d", &n, &m);
build(1, 1, n);
for (int i = 0; i < n; i++)
{
int a;
scanf("%d", &a);
update(1, i + 1, a);
}
for (int i = 0; i < m; i++)
{
while (!st.empty())
st.pop();
bool p;
scanf("%d", &p);
if (p)
{
int x, w;
scanf("%d%d", &x, &w);
update(1, x, w);
}
else
{
int l, r;
scanf("%d%d", &l, &r);
ask(l, r, 1);
printf("%d\n", answer());
}
}
return 0;
}
CDOJ_844 程序设计竞赛的更多相关文章
- 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree
Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968
异或密码 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 电子科技大学第八届ACM趣味程序设计竞赛第四场(正式赛)题解
A. Picking&Dancing 有一列n个石子,两人交替取石子,每次只能取连续的两个,取走后,剩下的石子仍然排成1列.问最后剩下的石子数量是奇数还是偶数. 读懂题意就没什么好说的. #i ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
点击打开链接 2226: Contest Print Server Time Limit: 1 Sec Memory Limit: 128 MB Submit: 53 Solved: 18 [Su ...
随机推荐
- javase(2)_递归&迭代
一.递归 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题 ...
- JS函数节流和防抖
看JS高级程序设计时,了解到一个概念--函数节流,是为了防止在高频率触发某些事件导致浏览器崩溃.最近又了解到另一个概念,防抖,感觉和函数节流很像,也查看了很多篇博文,算是理解了. 区别: 函数节流:频 ...
- 文件读写FILE类
1. 新建一个文件: FILE *f = fopen("a.txt","w+"); (1)fopen()函数介绍fopen的原型是:FILE *fopen(co ...
- 优化mysql查询
mysql提供了一个特别的explain语句,用来分析查询语句的性能 : explain select ... 1.在所有用于where,order by,group by的列上添加索引 创建索引 添 ...
- Mysql 5.7在Linux上部署及远程访问
序言:最近要和伙伴一起组队,做.NET Core项目.所以自己就租了一个阿里云服务器,并且装了Linux和MySQL.这里面我的Linux是CentOs 7. 第一步 添加Mysql Yum库 这里面 ...
- PHP开发中涉及到emoji表情的几种处理方法!
emoji表情 处理 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字 ...
- Python解答力扣网站题库简单版----第三讲
1041. 困于环中的机器人 题库链接: 1041. 困于环中的机器人. 题干 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G" ...
- python计算机基础(二)
1. 操作系统有什么用? #1外部指令转化成0和1:#2.翻译所写的字符从繁(高低电压)至简(想做什么就做什么) :#3把一些硬件的复杂操作简化成一个一个接口. 2. 计算机由哪三大部分组成? 1.应 ...
- (原)iOS 用recursiveDescription打印View
今天要做一个搜索功能,用到UISearchBar 无奈背景太丑,就自定义了一个,首先用View私有方法打印一下searchBar的层次, 具体修改代码如下 for (UIView *view in _ ...
- 【HDU 2126】Buy the souvenirs(01背包)
When the winter holiday comes, a lot of people will have a trip. Generally, there are a lot of souve ...