Black Rock Shooter
在人气动漫 Black Rock shooter 中,当加贺里对麻陶
说出了“滚回去“以后,与此同时,在另一个心灵世界里,
BRS 也遭到了敌人的攻击。此时,一共有 n 个攻击排成一行
朝着她飞了过来,每个攻击有一个伤害值。并且每个攻击伤
害可能随时变化。BRS 的攻击可以打掉一段连续的攻击。现
在,给出 m 段攻击,求出 BRS 最多可以打掉此段里多少的
伤害(就是说从给定一段里选择连续一段打掉)。伤害从 1
到 n 编号。
输入格式
第一行 2 个整数:n , m
第二行 n 个数:第 i 个数代表第 i 个攻击
第 3 到 2+m 行:每行三个数 k,x,y。若 k=1,x,y
代表查询的区间。若 k=2,代表第 x 个攻击伤害改为了 y
所有的伤害值绝对值<=1000
输出格式
对于每次 k=1,输出一个整数代表最大值
样例输入
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
样例输出
2
-1
数据范围
对于 20%的数据:n,m<=100
对于 60%的数据:n,m<=3000
对于 100%的数据:n<=500000,m<=100000
【题解】
这道题应该是一道有点裸的线段树,只是将模板的求和换作求最大值而已。即用线段树维护区间最大子段和。
solution写法:区间合并线段树,维护lm,rm,mx.
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=500005;
struct tree
{
int sum;//本段总和
int v;//本段中自身的最大子段
int vl,vr;//本段连接左或右端点的最大子段
}t[MAX<<2];
int N,M,k,x,y;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=-1,ch=getchar();
while (ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*w;
}
void Update(int now)
{
int lson=now<<1,rson=now<<1|1;
t[now].v=max(t[lson].vr+t[rson].vl,max(t[lson].v,t[rson].v));
t[now].vl=max(t[lson].vl,t[lson].sum+t[rson].vl);
t[now].vr=max(t[rson].vr,t[rson].sum+t[lson].vr);
t[now].sum=t[lson].sum+t[rson].sum;
}
void Build(int now,int l,int r)
{
if (l==r)
{
t[now].sum=t[now].v=t[now].vl=t[now].vr=gi();
return;
}
int mid=(l+r)>>1;
Build(now<<1,l,mid);
Build(now<<1|1,mid+1,r);
Update(now);
}
int Query_l(int now,int l,int r)//查询左连续的最大子段
{
if (l>=x&&r<=y)
return t[now].vl;
int mid=(l+r)>>1,res;
res=Query_l(now<<1,l,mid);
if (y>mid) res=max(res,t[now<<1].sum+Query_l(now<<1|1,mid+1,r));
return res;
}
int Query_r(int now,int l,int r)//查询右连续的最大子段
{
if (l>=x&&r<=y)
return t[now].vr;
int mid=(l+r)>>1,res;
res=Query_r(now<<1|1,mid+1,r);
if (x<=mid) res=max(res,t[now<<1|1].sum+Query_r(now<<1,l,mid));
return res;
}
//x y是询问区间
int Query(int now,int l,int r)//区间最大子段
{
if (l>=x&&r<=y)
return t[now].v;
int mid=(l+r)>>1,res;
if (y<=mid) res=Query(now<<1,l,mid);
else if (x>mid) res=Query(now<<1|1,mid+1,r);
else res=max(Query_r(now<<1,l,mid)+Query_l(now<<1|1,mid+1,r),max(Query(now<<1,l,mid),Query(now<<1|1,mid+1,r)));
return res;
}
//把第x个数修改成y
void Change(int now,int l,int r)
{
if (l==r)
{
t[now].sum=t[now].v=t[now].vl=t[now].vr=y;
return;
}
int mid=(l+r)>>1;
if (x<=mid) Change(now<<1,l,mid);
else Change(now<<1|1,mid+1,r);
Update(now);
}
int main()
{
freopen("BRS.in","r",stdin);
freopen("BRS.out","w",stdout);
N=gi();M=gi();
Build(1,1,N);
while (M--)
{
k=gi();x=gi();y=gi();
if (k==1)
printf("%d\n",Query(1,1,N));
else
Change(1,1,N);
}
return 0;
}
Black Rock Shooter的更多相关文章
- Black Rock Shooter 题解
题目描述 在人气动漫 Black Rock shooter 中,当加贺里对麻陶 说出了“滚回去“以后,与此同时,在另一个心灵世界里, BRS 也遭到了敌人的攻击.此时,一共有 n 个攻击排成一行 朝着 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- ural 2069. Hard Rock
2069. Hard Rock Time limit: 1.0 secondMemory limit: 64 MB Ilya is a frontman of the most famous rock ...
- POJ - 2339 Rock, Scissors, Paper
初看题目时就发了个错误,我因为没有耐心看题而不了解题目本身的意思,找不到做题的突破口,即使看了一些题解,还是没有想到方法. 后来在去问安叔,安叔一语道破天机,问我有没有搞清题目的意思,我才恍然大悟,做 ...
- ROCK 聚类算法
ROCK (RObust Clustering using linKs) 聚类算法是一种鲁棒的用于分类属性的聚类算法.该算法属于凝聚型的层次聚类算法.之所以鲁棒是因为在确认两对象(样本点/簇)之间 ...
- Rice Rock
先翻译评分要点,然后一点点翻译程序实现过程 如何产生一堆岩石? rock_group = set([])#空集合,全局变量 rock_group.add(a_rock) 要画出来draw hand ...
- JSBinding + SharpKit / 实战:转换 Survival Shooter
从 asset store 下载 Survival Shooter (商店里有2个版本,一种是给Unity5用的,一个是给Unity4.6用的,我们这个实验用的是后者,版本是2.2.如果) 1 删除多 ...
- HDOJ(HDU) 2164 Rock, Paper, or Scissors?
Problem Description Rock, Paper, Scissors is a two player game, where each player simultaneously cho ...
- 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展
教程来源于:Unity官方实例教程 Space Shooter(一)-(五) http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...
随机推荐
- 牛客多校Round 4
Soved:3 rank:133 A.Ternay String 欧拉降幂一下 但是反复求phi会超时 但mod是同一个就可以记忆化一下 #include <bits/stdc++.h> ...
- java容器(数组和集合)内元素的排序问题
package com.janson.day20180827; import java.util.*; /** * java中容器内对象的排序可以通过Collections.sort()和Arrays ...
- Oracle 控制文件(CONTROLFILE)
一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...
- SERE0014: Illegal HTML character: decimal 154
问题:jmeter,生成报告转化成html,报错SERE0014: Illegal HTML character: decimal 154 原因: 某些字符,特别是控制字符#x7F-#x9F ,在XM ...
- PAT 1141 PAT Ranking of Institutions
After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...
- QQ帐户的申请与登陆
QQ帐户的申请与登陆 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5,随后给出N行指令.每行指令的格式为 ...
- 在 Oculus和 Gear VR上开发跨平台的 VR应用
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:car ...
- #if 0的意义和好处
在调试中经常遇到,写好的程序,需要调试相反的两方面,如:有两款单片机的程序,分别对应着不同的硬件引脚,我们把代码都写上了,但是不能同时让他们起效,通常的办法是/**/屏蔽一些段落,但是调试起来很麻烦. ...
- 【Codeforces 675D】Tree Construction
[链接] 我是链接,点我呀:) [题意] 依次序将数字插入到排序二叉树当中 问你每个数字它的父亲节点上的数字是啥 [题解] 按次序处理每一个数字 对于数字x 找到最小的大于x的数字所在的位置i 显然, ...
- 在Myeclipse中拷贝一个web项目,但是tomcat文件夹中没有更新,需要进行修改才能更新。
1.在Myeclipse中拷贝一个web项目,但是tocat文件夹中没有更新,需要进行修改才能更新. 2.方法:右键这个工程,然后Properties->MyEclipse->Projec ...