在人气动漫 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的更多相关文章

  1. Black Rock Shooter 题解

    题目描述 在人气动漫 Black Rock shooter 中,当加贺里对麻陶 说出了“滚回去“以后,与此同时,在另一个心灵世界里, BRS 也遭到了敌人的攻击.此时,一共有 n 个攻击排成一行 朝着 ...

  2. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  3. ural 2069. Hard Rock

    2069. Hard Rock Time limit: 1.0 secondMemory limit: 64 MB Ilya is a frontman of the most famous rock ...

  4. POJ - 2339 Rock, Scissors, Paper

    初看题目时就发了个错误,我因为没有耐心看题而不了解题目本身的意思,找不到做题的突破口,即使看了一些题解,还是没有想到方法. 后来在去问安叔,安叔一语道破天机,问我有没有搞清题目的意思,我才恍然大悟,做 ...

  5. ROCK 聚类算法‏

    ROCK (RObust Clustering using linKs)  聚类算法‏是一种鲁棒的用于分类属性的聚类算法.该算法属于凝聚型的层次聚类算法.之所以鲁棒是因为在确认两对象(样本点/簇)之间 ...

  6. Rice Rock

    先翻译评分要点,然后一点点翻译程序实现过程 如何产生一堆岩石? rock_group = set([])#空集合,全局变量   rock_group.add(a_rock) 要画出来draw hand ...

  7. JSBinding + SharpKit / 实战:转换 Survival Shooter

    从 asset store 下载 Survival Shooter (商店里有2个版本,一种是给Unity5用的,一个是给Unity4.6用的,我们这个实验用的是后者,版本是2.2.如果) 1 删除多 ...

  8. HDOJ(HDU) 2164 Rock, Paper, or Scissors?

    Problem Description Rock, Paper, Scissors is a two player game, where each player simultaneously cho ...

  9. 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展

    教程来源于:Unity官方实例教程 Space Shooter(一)-(五)       http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...

随机推荐

  1. 牛客多校Round 4

    Soved:3 rank:133 A.Ternay String 欧拉降幂一下 但是反复求phi会超时 但mod是同一个就可以记忆化一下 #include <bits/stdc++.h> ...

  2. java容器(数组和集合)内元素的排序问题

    package com.janson.day20180827; import java.util.*; /** * java中容器内对象的排序可以通过Collections.sort()和Arrays ...

  3. Oracle 控制文件(CONTROLFILE)

    一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...

  4. SERE0014: Illegal HTML character: decimal 154

    问题:jmeter,生成报告转化成html,报错SERE0014: Illegal HTML character: decimal 154 原因: 某些字符,特别是控制字符#x7F-#x9F ,在XM ...

  5. PAT 1141 PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  6. QQ帐户的申请与登陆

    QQ帐户的申请与登陆 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5,随后给出N行指令.每行指令的格式为 ...

  7. 在 Oculus和 Gear VR上开发跨平台的 VR应用

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:car ...

  8. #if 0的意义和好处

    在调试中经常遇到,写好的程序,需要调试相反的两方面,如:有两款单片机的程序,分别对应着不同的硬件引脚,我们把代码都写上了,但是不能同时让他们起效,通常的办法是/**/屏蔽一些段落,但是调试起来很麻烦. ...

  9. 【Codeforces 675D】Tree Construction

    [链接] 我是链接,点我呀:) [题意] 依次序将数字插入到排序二叉树当中 问你每个数字它的父亲节点上的数字是啥 [题解] 按次序处理每一个数字 对于数字x 找到最小的大于x的数字所在的位置i 显然, ...

  10. 在Myeclipse中拷贝一个web项目,但是tomcat文件夹中没有更新,需要进行修改才能更新。

    1.在Myeclipse中拷贝一个web项目,但是tocat文件夹中没有更新,需要进行修改才能更新. 2.方法:右键这个工程,然后Properties->MyEclipse->Projec ...