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重新选定模板 ...
随机推荐
- jCallout 实现气泡提示
在提交表单前.焦点转移后或者 keyup 时往往需要对输入的文本就行检验,如果输入内容不符合相关约定则要进行提示或警告,有一个叫 jCallout 的插件可以轻松实现该功能,该插件基于 jQuery ...
- WSAEventSelect模型详解
WSAEventSelect 是 WinSock 提供的一种异步事件通知I/O模型,与 WSAAsyncSelect模型有些类似. 该模型同样是接收 FD_XXX 之类的网络事件,但是是通 ...
- how to Enable Client Integration
i got a problem,the problem is list cant use export to excel button in sharepoint 2010. I found my a ...
- DEDECMS中,引入文件
引入文件:dede:include 标签:{dede:include filename="foot.htm"/}
- Open Live Writer增加代码插件
作为一名程序员,免不了和代码打交道,自然在写博客的时候,也会用到代码的展示,Open Live Writer确实是一个不错的工具,不用再去登录博客的后台,就可以在本地进行文章的编写,但是致 ...
- amazon RequestReport
_GET_SELLER_FEEDBACK_DATA_ MarketplaceIdList 这此字段必填,否则无法取到报告
- 【转】 设定linux 系统可用资源
getrlimit和setrlimit函数 每个进程都有一组资源限制,其中某一些可以用getrlimit和setrlimit函数查询和更改. #include #include int getrli ...
- WCF 傻瓜教程
第一步,新建WCF服务应用程序 第二步,定义接口: 修改接口类,定义你要的方法接口默认文件名:IService1.cs 第三步,实现接口: 在svc文件里实现接口方法,默认文件名:Service1.s ...
- 过滤菜鸟的iOS面试题-b
网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...
- 在工程中添加pch文件
在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字的pch (precompile header)文件,在开发过程中,可以将那些整个工程都广泛使用的头文件包含在该文件下,编 ...