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重新选定模板 ...
随机推荐
- Contiki学习入门之概览
Contiki是专为物联网领域而设计的开源操作系统,适用于联网嵌入式系统和无线传感器网络.由瑞典计算机科学学院的Adam Dunkels团队开发.它有以下几个特点. 1. 网络标准 contiki提供 ...
- Poj OpenJudge 百练 1860 Currency Exchang
1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency ...
- 《APUE》第6章笔记
这一章主要介绍了口令文件和组文件的结构和一些围绕这些结构的函数. 口令文件即passwd就是在/etc/passwd中可以查阅.其结构是: 上图四个平台能支持的就用黑点表示. 因为加密口令这一项放在p ...
- Jquery 禁用 a 标签 onclick 事件30秒后可用
<a href="javascript:;" id="sendToTel" >发送短信</a> <script type=&quo ...
- present的时候是可以直接回到第一个viewcon的
最新:我并没有记错,是可以直接回到的 [self.presentingViewController.presentingViewController dismissModalViewControlle ...
- 伪元素content的应用
日常开发中,我们常用:before,:after来实现一些效果,比如 – 边框 – 图标 此时的content中只是为了伪元素能渲染出来而声明 1 2 3 div:before{ content: & ...
- Apache+PHP+MySql 的安装及配置
每一项技术用的人多了,就会有人将其进行优化,做成一个简单.实用.大众化的工具,这对于初识者来说是非常方便的,但是对于长久学习或工作这方面的人技术人员来说是不可取的,所以还是要学习基础的实用方法.因此, ...
- DrawWindowFrame
extern void DrawWindowFrame(HWND hWnd)//画窗口边框 { RECT rc; HWND DeskHwnd = ::GetDesktopWindow(); //取得桌 ...
- linux 加载驱动后有permanent的解决办法
参考http://blog.csdn.net/zmnqazqaz/article/details/38058713解决 原因是系统默认内核使用gcc与当前编译模块gcc版本不同导致的. 查看内核默认使 ...
- 关于FileSystemWatcher监听文件创建
FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...