哈哈,原来题意看错了,但有多个解的时候,输出起点靠前的,如果起点一样,则输出终点靠前的,修改后AC的代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; const int MAXN = ; typedef long long int64; int dish[MAXN];
int64 dish_sum[MAXN]; int64 get_sum(int L, int R) {
return dish_sum[R] - dish_sum[L - ];
} class SegNode {
public:
int L, R;
int L_end, R_beg;
int beg, end;
int64 LR_sum() { return get_sum(L, R); }
int64 L_sum() { return get_sum(L, L_end); }
int64 R_sum() { return get_sum(R_beg, R); }
int64 sum() { return get_sum(beg, end); }
void log() {
printf("[%d %d]: (%d %d), (%d %d), (%d %d).\n",
L, R, L, L_end, R_beg, R, beg, end);
}
} node[ * MAXN]; class SegTree {
public:
void build(int r, int L, int R) {
node[r].L = L;
node[r].R = R;
if (L == R) {
// leaf
node[r].L_end = R;
node[r].R_beg = L;
node[r].beg = L;
node[r].end = R;
} else {
// non leaf
int M = (L + R) / ;
build( * r, L, M);
build( * r + , M + , R); // left
node[r].L_end = node[ * r].L_end;
if (node[ * r].LR_sum() + node[ * r + ].L_sum() > node[ * r].L_sum()) {
node[r].L_end = node[ * r + ].L_end;
} // right
node[r].R_beg = node[ * r + ].R_beg;
if (node[ * r + ].LR_sum() + node[ * r].R_sum() >= node[ * r + ].R_sum()) {
node[r].R_beg = node[ * r].R_beg;
} // mid
if (node[ * r].sum() >= node[ * r + ].sum()) {
node[r].beg = node[ * r].beg;
node[r].end = node[ * r].end;
} else {
node[r].beg = node[ * r + ].beg;
node[r].end = node[ * r + ].end;
}
if (node[ * r].R_sum() + node[ * r + ].L_sum() > node[r].sum() ||
(node[ * r].R_sum() + node[ * r + ].L_sum() == node[r].sum() && node[ * r].R_beg < node[r].beg)) {
node[r].beg = node[ * r].R_beg;
node[r].end = node[ * r + ].L_end;
}
}
//node[r].log();
}
void query(int r, int L, int R, int& left, int& right, int k) {
if (L <= node[r].L && node[r].R <= R) {
if (k == ) { left = node[r].L; right = node[r].L_end; }
else if (k == ) { left = node[r].R_beg; right = node[r].R; }
else { left = node[r].beg; right = node[r].end; }
} else {
if (R <= node[ * r].R) {
query( * r, L, R, left, right, k);
} else if (L >= node[ * r + ].L) {
query( * r + , L, R, left, right, k);
} else {
int left_beg, left_end, right_beg, right_end;
query( * r, L, R, left_beg, left_end, k);
query( * r + , L, R, right_beg, right_end, k);
if (k == ) {
left = left_beg;
right = left_end;
if (get_sum(left_beg, right_end) > get_sum(left, right)) {
left = left_beg;
right = right_end;
}
} else if (k == ) {
left = right_beg;
right = right_end;
if (get_sum(left_beg, right_end) >= get_sum(left, right)) {
left = left_beg;
right = right_end;
}
} else {
if (get_sum(left_beg, left_end) >= get_sum(right_beg, right_end)) {
left = left_beg;
right = left_end;
} else {
left = right_beg;
right = right_end;
}
int m_l, m_r, x;
query( * r, L, R, m_l, x, );
query( * r + , L, R, x, m_r, );
if (get_sum(m_l, m_r) > get_sum(left, right) ||
(get_sum(m_l, m_r) == get_sum(left, right) && m_l < left)) {
left = m_l;
right = m_r;
}
}
}
}
}
} tree; int main() {
int n, m, c = ;
while (scanf("%d%d", &n, &m) != EOF) {
dish_sum[] = ;
for (int i = ; i <= n; i++) {
scanf("%d", &dish[i]);
dish_sum[i] = dish_sum[i - ] + dish[i];
}
tree.build(, , n);
printf("Case %d:\n", ++c);
for (int i = ; i < m; i++) {
int l, r, left, right;
scanf("%d%d", &l, &r);
if (l > r) swap(l, r);
l = max(, l);
r = min(n, r);
tree.query(, l, r, left, right, );
printf("%d %d\n", left, right);
}
}
}

1400 - "Ray, Pass me the dishes!"的更多相关文章

  1. UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)

    "Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...

  2. uva 1400 - "Ray, Pass me the dishes!"

    又是一道线段树区间更新的题: #include<cstdio> #include<algorithm> #include<cstring> #define ll l ...

  3. uva 1400 "Ray, Pass me the dishes!" (区间合并 最大子段和+输出左右边界)

    题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左 ...

  4. UVA 1400 1400 - &quot;Ray, Pass me the dishes!&quot;(线段树)

    UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_pr ...

  5. UvaLA 3938 "Ray, Pass me the dishes!"

                            "Ray, Pass me the dishes!" Time Limit: 3000MS   Memory Limit: Unkn ...

  6. 【LA3938】"Ray, Pass me the dishes!"

    原题链接 Description After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hun ...

  7. UVa 1400 (线段树) "Ray, Pass me the dishes!"

    求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...

  8. 线段树(区间合并) LA 3989 "Ray, Pass me the dishes!"

    题目传送门 题意:动态最大连续子序列和,静态的题目 分析:nlogn的归并思想.线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better.书上用pair ...

  9. uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并

    题意:求q次询问的静态区间连续最大和起始位置和终止位置 输出字典序最小的解. 思路:刘汝佳白书 每个节点维护三个值 pre, sub, suf 最大的前缀和, 连续和, 后缀和 然后这个题还要记录解的 ...

随机推荐

  1. (POJ 3026) Borg Maze 最小生成树+bfs

    题目链接:http://poj.org/problem?id=3026. Description The Borg is an immensely powerful race of enhanced ...

  2. VisualLeakDetector

    只需要#include "vld.h"就OK -------------------------------------- 找内存泄露挺方便的,比VS自带的详细.

  3. SSH连接时出现Host key verification failed的原因及解决方法

    SSH连接的时候Host key verification failed. [root@cache001 swftools-0.9.0]# ssh 192.168.1.90@@@@@@@@@@@@@@ ...

  4. IIS上的错误与解决方案

    1.未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序. 解决方案:在IIS上打开该网站应用程序池-->高级设置-->启动32位程序-->选True

  5. JavaScript异步获取数据解析

    <script type="text/javascript">    var xhr=false;    function createXhr() {    var x ...

  6. discuz random函数

    在研究邮箱非必填的过程中发现了个比较好用的random函数,在function_core.php中找到声明: function random($length, $numeric = 0) { $see ...

  7. php 生成器 入门理解

    概念太晦涩,看不懂,直接上例子: 问题:得到一个1-1000000的整数数组,然后用foreach遍历输出 如果没有生成器,这样做: $arr=range(1,1000000);//这个函数最终会返回 ...

  8. 1090. Highest Price in Supply Chain (25)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...

  9. Jsonp 跨域请求实例

    关于jsonp的一个实例,其实自己也不是很了解,今天下午稍微研究了一下: 简单来说,jsonp就是为了两个不同网站之间数据传递而产生的,主要用于js脚本,因为浏览器本身是禁止跨域访问的: 本机实例: ...

  10. EXTJS 4.2 资料 控件之Window窗体添加html

    //这里要跳转页面 var subWindow = new Ext.Window({ title: '窗口', width: width, height: height, modal: true,// ...