博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SP1716 GSS3 - Can you answer these queries III
阅读量:4612 次
发布时间:2019-06-09

本文共 3221 字,大约阅读时间需要 10 分钟。

题意翻译

nn 个数,qq 次操作

操作0 x yA_xAx 修改为yy

操作1 l r询问区间[l, r][l,r] 的最大子段和

感谢 @Edgration 提供的翻译

题目描述

You are given a sequence A of N (N <= 50000) integers between -10000 and 10000. On this sequence you have to apply M (M <= 50000) operations:

modify the i-th element in the sequence or for given x y print max{Ai + Ai+1 + .. + Aj | x<=i<=j<=y }.

输入输出格式

输入格式:

 

The first line of input contains an integer N. The following line contains N integers, representing the sequence A1..AN.

The third line contains an integer M. The next M lines contain the operations in following form:
0 x y: modify Ax into y (|y|<=10000).
1 x y: print max{Ai + Ai+1 + .. + Aj | x<=i<=j<=y }.

 

输出格式:

 

For each query, print an integer as the problem required.

 

输入输出样例

输入样例#1: 
41 2 3 441 1 30 3 -31 2 41 3 3
输出样例#1: 
64-3 其实很基础的一道线段树,但是赛场上就是调不通,又是一次赛后AC的典范,一定是我写代码的方式不对。。。
1 #include 
2 #define mid ((t[d].l + t[d].r) >> 1) 3 using namespace std; 4 const int N = 50005; 5 struct Tree{ 6 int l,r,lgss,rgss,gss,sum; 7 }t[N*8]; 8 9 int n,m;10 int a[N];11 12 void build(int d,int l,int r){13 t[d].l = l;t[d].r = r;14 if (l == r){15 t[d].gss = t[d].lgss = t[d].rgss = t[d].sum = a[l];16 return;17 }18 build(d*2,l,mid);19 build(d*2+1,mid+1,r);20 t[d].sum = t[d*2].sum + t[d*2+1].sum;21 t[d].gss = max(t[d*2].gss,max(t[d*2+1].gss,t[d*2].rgss+t[d*2+1].lgss));22 t[d].lgss = max(t[d*2].lgss,t[d*2].sum + t[d*2+1].lgss);23 t[d].rgss = max(t[d*2+1].rgss,t[d*2].rgss + t[d*2+1].sum);24 }25 26 void modify(int d,int x,int y){27 if (t[d].l == x && t[d].r == x){28 t[d].gss = t[d].lgss = t[d].rgss = t[d].sum = y;29 return;30 }31 if (x <= mid) modify(d*2,x,y);32 else if (x > mid) modify(d*2+1,x,y);33 t[d].sum = t[d*2].sum + t[d*2+1].sum;34 t[d].gss = max(t[d*2].gss,max(t[d*2+1].gss,t[d*2].rgss+t[d*2+1].lgss));35 t[d].lgss = max(t[d*2].lgss,t[d*2].sum + t[d*2+1].lgss);36 t[d].rgss = max(t[d*2+1].rgss,t[d*2].rgss + t[d*2+1].sum);37 }38 39 int getl(int d,int l,int r){40 if (t[d].l == l && t[d].r == r){41 return t[d].lgss;42 }43 if (r > mid){44 return max(getl(d*2,l,mid),t[d*2].sum + getl(d*2+1,mid+1,r));45 }46 return getl(d*2,l,r);47 }48 49 int getr(int d,int l,int r){50 if (t[d].l == l && t[d].r == r){51 return t[d].rgss;52 }53 if (l <= mid){54 return max(getr(d*2+1,mid+1,r),getr(d*2,l,mid) + t[d*2+1].sum);55 }else return getr(d*2+1,l,r);56 }57 58 int get(int d,int l,int r){59 if (t[d].l == l && t[d].r == r){60 return t[d].gss;61 }62 if (r <= mid) return get(d*2,l,r);63 else if (l > mid) return get(d*2+1,l,r);64 return max(get(d*2,l,mid),max(get(d*2+1,mid+1,r),getr(d*2,l,mid)+getl(d*2+1,mid+1,r)));65 }66 67 int main(){68 scanf("%d",&n);69 for (int i = 1;i <= n;++i){70 scanf("%d",a+i);71 72 }73 build(1,1,n);74 scanf("%d",&m);75 for (int i = 0;i < m;++i){76 int kk,x,y;77 scanf("%d%d%d",&kk,&x,&y);78 if (kk == 0){79 modify(1,x,y);80 }else {81 printf("%d\n",get(1,x,y));82 }83 }84 }

 

转载于:https://www.cnblogs.com/mizersy/p/10780782.html

你可能感兴趣的文章
JavaScript 30 - 1 学习笔记
查看>>
Nginx 假如reload或reopen时发生错误如何解决
查看>>
Linux网络配置方法(DNS,IP,GW)
查看>>
go语言基础之二维数组
查看>>
vim基本命令
查看>>
[转]HTTP协议之状态码详解
查看>>
box-shadow
查看>>
select * 和select 1 以及 select count(*) 和select count(1)的区别
查看>>
进度条04
查看>>
Silverlight RadGridView的HeaderCellStyle样式
查看>>
IE兼容CSS3圆角border-radius的方法
查看>>
Elsevier期刊投稿状态
查看>>
flask
查看>>
Heartbeat+LVS构建高可用负载均衡集群
查看>>
c++中const使用详解
查看>>
项目百态——深入理解软件项目行为模式(一)
查看>>
C# 文件读写Helper类
查看>>
Linux 命令总结
查看>>
BZOJ1386 : [Baltic2000]Stickers
查看>>
android联系人应用感悟
查看>>