Trainning Guide的代码
今天无意间找到了训练指南的网上代码,都是刘汝佳写的,在这。
今天在做这题1400 - "Ray, Pass me the dishes!",我写的线段树的思路跟上次的Frequent Sequence的思路类似,维护区间上从左端点开始、从右端点开始,中间部分的最优序列,查了半天,没查到问题,先把代码备份上来。
#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].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)) {
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);
}
}
}
Trainning Guide的代码的更多相关文章
- Trainning Guide, Data Structures, Example
最近在复习数据结构,发现这套题不错,题目质量好,覆盖广,Data Structures部分包括Example,以及简单,中等,难三个部分,这几天把Example的做完了, 摘要如下: 通过这几题让我复 ...
- 【201】SeaDAS代码
参考: 官方网站:http://seadas.gsfc.nasa.gov/ L2GEN User's Guide l2gen 代码: l2gen, ifile="ifile", g ...
- DCM TUTORIAL – AN INTRODUCTION TO ORIENTATION KINEMATICS (REV 0.1)
原英文地址:dcm_tutorial 感觉这篇文章还是很有学习价值的,所以就抽出了一些时间对本文进行的翻译.下面这个好多人用的算法就是一种DCM 滤波器. //==================== ...
- Hadoop could not find or load main class
Error: Could not find or load main class <class_name> 我在尝试使用hadoop definitive guide的代码做练习时,遇到一 ...
- Accumulators
copy的官方programming guide的代码,只有一个要说一下,Accumulators的更新是在action做的,transformation操作中对于Accumulators的增加不会即 ...
- multi2sim,booksim简介
booksim是周期精确互连网络仿真器,设计用来配合"Principles and Practices of Interconnection Networks"课程教学,仿真器采用 ...
- 转:使用C#的HttpWebRequest模拟登陆网站
这篇文章是有关模拟登录网站方面的. 实现步骤: 启用一个web会话 发送模拟数据请求(POST或者GET) 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据. ...
- SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession作用域(Scope)和生命周期
可以说每个MyBatis都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory实例可以通过SqlSessionFactoryBuilder来构建.一是可以通过XM ...
- editPuls 常用知识
1.创建模板 1).创建模板页(*.html) 2).Tools->Preferences->File->Templates->HTML->file name重新选定模板 ...
随机推荐
- [zz] 安装PostGIS(Linux篇)
0.安装PostgreSQL数据库 参考安装PostgreSQL数据库(Linux篇). 1.安装proj4 #tar zxvf proj-4.8.0.tar.gz#cd proj-4.8.0#./c ...
- HOWTO re
\w 字母数字字符 [a-z A-Z 0-9_] \W 非字母数组字符 [^a-z-A-Z 0-9_] \d 十进制数字 [0-9] \D 非数字字符 [^0-9] \s 空白字符 [\t\n\r\f ...
- boost::xml——基本操作以及中文乱码解决方案
下面是本人使用boost库的xml部分的基础操作,并且解决对于大家使用boost库读写中文xml内容出现的乱码问题. 1.实现boost库xml基本操作2.解决boost对xml中中文乱码问题3.实现 ...
- Poj 3982 序列
1.Link: http://poj.org/problem?id=3982 2.Content: 序列 Time Limit: 1000MS Memory Limit: 65536K Total ...
- Linux RedHat无法安装软件问题(No package gcc available. Nothing to do)
在一个新的Linux服务器上安装nginx的时候,命令都不能解析,缺少gcc编辑器,安装gcc的命令也出错. [root@localhost ~]# yum -y install gcc Loaded ...
- php程序备份还原mysql数据库
<?php $link = mysql_connect("localhost", "root",""); mysql_query(&q ...
- JS传参出现乱码(转载)
问题说明:在进行网站开发时,将表单的提交功能交给JS来传递,但是在传递中文的过程中出现类似于繁体字的乱码. 解决方案:为了解决这个问题,首先从底层的C#代码审查,重新设置页面传值进行模拟,但是几经测试 ...
- ajaxFileUpload - Post file and data together
jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' ...
- VI命令删除文件所有内容
>vi test.log >gg #光标移到第一行 >:.,$d
- htmlcleaner
String xpath = "//div"; Object[] myNodes = node.evaluateXPath(xpath); for (Object obj : my ...