题目描述 Description

【Shadow 1】第三题
“南山经之首曰鹊山。其首曰招摇之山,临于西海之上。多桂多金玉。有草焉,其状如韭而青华,其名曰祝馀,食之不饥……
又东三百里曰堂庭之山。金棪木,多白猿,多水玉,多黄金。
又东三百八十里曰猨翼之山。其中多怪兽,水多怪鱼。多白玉,多蝮虫,多怪蛇,多怪木,不可以上……”
《山海经》是以山为纲,以海为线记载古代的河流、植物、动物以及矿产等情况,而且每一条记录路线都不会有重复的山出现。某天,wyl8899想游览《山海经》中的路线,为了简化问题,wyl8899已经把每座山用一个整数表示他对该山的喜恶程度。wyl8899想知道第a座山到第b座山的中间某短路[i,j]能使他感到最满意,即[i,j]这条路上所有山的喜恶程度之和是所有c,d最大。由于wyl8899还要去WJMZBMR家里【哗……】,所以他把这个问题扔给了Shadow:“你做不出来就……”

输入描述 Input Description

第1行,2个整数N,M,N表示一共有N座山,M表示wyl8899想问的次数(Shadow:问那么多干嘛……);
第2行,N个整数,代表N座山的喜恶程度,绝对值均小于10000;
第3-(M+2)行,每行有2个数a,b,表示询问从第a座山到第b座山的最大值。
输出描述 Output Description
一共有M行,每行有3个数i,j,s,表示从第i座山到第j座山总的喜恶程度为s。显然,对于每个询问,有a≤i≤j≤b,如果有多组解,则输出i最少的,如果i也相等,则输出j最少的解。

样例输入 Sample Input

5 3
5 -6 3 -1 4
1 3
1 5
5 5

样例输出 Sample Output

1 1 5
3 5 6
5 5 4

数据范围及提示 Data Size & Hint

对于100%的数据,2≤N≤200000,1≤M≤100000,1≤a≤b≤N。


填了个史前巨坑

维护个区间最大子段和,要维护左右端点…好吧左右端点好恶心

然后机智的我重载加号和小于号…然后交上去还是WA…我以为我不知道哪写错了…然后开始各种改,借鉴黄学长博客什么的…

调了一个小时发现值没求错!端点不是最优!!然后开始输出重载加号!后来发现加号没错然后去看小于号,之后才发现是重载小于号出毛病了…改了个大于号小于号成功AC…我这智商也是没谁了…

好像我没写过线段树维护区间最大子段和…我写的是splay…

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;typedef long long LL;
const int SZ = 1000010;
const int INF = 1000000010;struct haha{int l,r,x;void print(){printf("%d %d %d\n",l,r,x);}
};bool operator <(const haha &a,const haha &b)
{return a.x < b.x || (a.x == b.x && a.l > b.l) || (a.x == b.x && a.l == b.l && a.r > b.r);
}haha operator +(haha a,haha b)
{haha c;c.l = min(a.l,b.l); c.r = max(a.r,b.r); c.x = a.x + b.x;return c;
}struct segment{int l,r;haha sum,lx,rx,mx;
}tree[SZ << 2];void update(int p)
{int lch = p << 1,rch = p << 1 | 1;tree[p].sum = tree[lch].sum + tree[rch].sum;tree[p].lx = max(tree[lch].lx,tree[lch].sum + tree[rch].lx);tree[p].rx = max(tree[rch].rx,tree[lch].rx + tree[rch].sum);tree[p].mx = max(max(tree[lch].mx,tree[rch].mx),tree[lch].rx + tree[rch].lx);
}int num[SZ];void build(int p,int l,int r)
{tree[p].l = l;tree[p].r = r;if(l == r){tree[p].sum = tree[p].mx = tree[p].lx = tree[p].rx = (haha){l,r,num[l]};return ;}int mid = l + r >> 1;build(p << 1,l,mid);build(p << 1 | 1,mid + 1,r);update(p);
}segment ask(int p,int l,int r)
{if(l == tree[p].l && tree[p].r == r) return tree[p];int mid = tree[p].l + tree[p].r >> 1;if(r <= mid) return ask(p << 1,l,r);else if(l > mid) return ask(p << 1 | 1,l,r);else{segment a,b,c;a = ask(p << 1,l,mid); b = ask(p << 1 | 1,mid + 1,r);c.mx = max(max(a.mx,b.mx),a.rx + b.lx);c.lx = max(a.lx,a.sum + b.lx);c.rx = max(b.rx,a.rx + b.sum);c.sum = a.sum + b.sum;c.l = l; c.r = r;return c;}
}int main()
{int n,m;scanf("%d%d",&n,&m);for(int i = 1;i <= n;i ++)scanf("%d",&num[i]);build(1,1,n);for(int i = 1;i <= m;i ++){int l,r;scanf("%d%d",&l,&r);segment f = ask(1,l,r);printf("%d %d %d\n",f.mx.l,f.mx.r,f.mx.x);}return 0;
}

【codevs2293】山海经 线段树相关推荐

  1. 【线段树】【cogs775】山海经

    775.山海经 ★★★ 输入文件:hill.in 输出文件:hill.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] "南山之首日鹊山.其首日招摇之山,临于西海之上 ...

  2. COGS 775. 山海经 【线段树】

    775. 山海经 [问题描述] "南山之首日鹊山.其首日招摇之山,临于西海之上,多桂,多金玉.有草焉,其状如韭而青华,其名日祝余,食之不饥--又东三百里,日堂庭之山,多棪木,多白猿,多水玉, ...

  3. Sicily 1136 山海经 (SOJ 1136) 【Segment Tree 线段树】

    原题地址:点击打开链接 这题花了整整一天来做,错误基本都是TLE,但是做完非常哈皮,因为感觉比较好地运用了线段树这个数据结构.话说这几天广东不是一般热,中午根本睡不着,满身黏糊糊,课室和图书馆倒成了平 ...

  4. 线段树的进阶:多种信息的维护与传递

     山海经 时间限制:1 s   内存限制:128 MB [问题描述] "南山之首曰鹊山.其首曰招摇之山,临于西海之上,多桂,多金玉.有草焉,其状如韭而青华,其名曰祝余,食之不饥--又东三百里 ...

  5. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  6. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  7. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  8. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  9. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

最新文章

  1. Python3 try-except、raise和assert解析
  2. 指定动态分区_重点解析!2021湖南中级职称评审动态趋势
  3. 【机器学习算法-python实现】svm支持向量机(3)—核函数
  4. VTK:Remote之FrenetSerretFrame
  5. bool类型数组转换成一个整数_Go 学习笔记 02 | 基本数据类型以及 byte 和 rune 类型...
  6. Windows 10修改环境变量方法
  7. docker多个容器一起打包_如何实现多个docker容器同时执行一条命令?
  8. 华为中兴腾讯拿下国家科学技术进步奖,中南大学一作奖项总数全国第三
  9. Android启动的init进程
  10. HTML+JS调用摄像头拍照并上传图片
  11. 简道云-第4章-表单实例
  12. visio premium 2010 产品密钥
  13. VS2008连接TFS 2010
  14. 破解tomcat管理员密码
  15. 实践 基于Arduino 的 平衡车
  16. photoshop cc2017全套视频课程 从基础到实战案例PS海报-王诚-专题视频课程
  17. @4-1 CCF 2020-06-1 线性分类器
  18. CentOS安装Firefox的Flash播放器插件
  19. Day10-软件测试用例-等价划分法与边界值法
  20. 浏览器是如何运作的?

热门文章

  1. 摄影需要训练一双能发现不同点的眼睛
  2. openGauss 数据库维护管理指导(四)
  3. 苹果系统和windows系统怎么切换_【电脑】在windows系统上安装苹果Mac系统
  4. 产品的批号和序列号应用区别
  5. nodejs导入模块
  6. VS2015可以运行opencv库,但不出图片。
  7. 【Unity】如何让粒子系统显示在UI上呢?
  8. 利用计算机控制软件,Wayk Now(计算机远程控制软件)
  9. java批改算数题,一秒批改数学题 小猿口算横式题目批改准确率达99.9%
  10. 神经网络入门及tensorflow实战