今天无意间找到了训练指南的网上代码,都是刘汝佳写的,在

今天在做这题1400 - "Ray, Pass me the dishes!",我写的线段树的思路跟上次的Frequent Sequence的思路类似,维护区间上从左端点开始、从右端点开始,中间部分的最优序列,查了半天,没查到问题,先把代码备份上来。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int MAXN = ;
  7.  
  8. typedef long long int64;
  9.  
  10. int dish[MAXN];
  11. int64 dish_sum[MAXN];
  12.  
  13. int64 get_sum(int L, int R) {
  14. return dish_sum[R] - dish_sum[L - ];
  15. }
  16.  
  17. class SegNode {
  18. public:
  19. int L, R;
  20. int L_end, R_beg;
  21. int beg, end;
  22. int64 LR_sum() { return get_sum(L, R); }
  23. int64 L_sum() { return get_sum(L, L_end); }
  24. int64 R_sum() { return get_sum(R_beg, R); }
  25. int64 sum() { return get_sum(beg, end); }
  26. void log() {
  27. printf("[%d %d]: (%d %d), (%d %d), (%d %d).\n",
  28. L, R, L, L_end, R_beg, R, beg, end);
  29. }
  30. } node[ * MAXN];
  31.  
  32. class SegTree {
  33. public:
  34. void build(int r, int L, int R) {
  35. node[r].L = L;
  36. node[r].R = R;
  37. if (L == R) {
  38. // leaf
  39. node[r].L_end = R;
  40. node[r].R_beg = L;
  41. node[r].beg = L;
  42. node[r].end = R;
  43. } else {
  44. // non leaf
  45. int M = (L + R) / ;
  46. build( * r, L, M);
  47. build( * r + , M + , R);
  48.  
  49. // left
  50. node[r].L_end = node[ * r].L_end;
  51. if (node[ * r].LR_sum() + node[ * r + ].L_sum() > node[ * r].L_sum()) {
  52. node[r].L_end = node[ * r + ].L_end;
  53. }
  54.  
  55. // right
  56. node[r].R_beg = node[ * r + ].R_beg;
  57. if (node[ * r + ].LR_sum() + node[ * r].R_sum() > node[ * r + ].R_sum()) {
  58. node[r].R_beg = node[ * r].R_beg;
  59. }
  60.  
  61. // mid
  62. if (node[ * r].sum() >= node[ * r + ].sum()) {
  63. node[r].beg = node[ * r].beg;
  64. node[r].end = node[ * r].end;
  65. } else {
  66. node[r].beg = node[ * r + ].beg;
  67. node[r].end = node[ * r + ].end;
  68. }
  69. if (node[ * r].R_sum() + node[ * r + ].L_sum() > node[r].sum()) {
  70. node[r].beg = node[ * r].R_beg;
  71. node[r].end = node[ * r + ].L_end;
  72. }
  73. }
  74. //node[r].log();
  75. }
  76. void query(int r, int L, int R, int& left, int& right, int k) {
  77. if (L <= node[r].L && node[r].R <= R) {
  78. if (k == ) { left = node[r].L; right = node[r].L_end; }
  79. else if (k == ) { left = node[r].R_beg; right = node[r].R; }
  80. else { left = node[r].beg; right = node[r].end; }
  81. } else {
  82. if (R <= node[ * r].R) {
  83. query( * r, L, R, left, right, k);
  84. } else if (L >= node[ * r + ].L) {
  85. query( * r + , L, R, left, right, k);
  86. } else {
  87. int left_beg, left_end, right_beg, right_end;
  88. query( * r, L, R, left_beg, left_end, k);
  89. query( * r + , L, R, right_beg, right_end, k);
  90. if (k == ) {
  91. left = left_beg;
  92. right = left_end;
  93. if (get_sum(left_beg, right_end) > get_sum(left, right)) {
  94. left = left_beg;
  95. right = right_end;
  96. }
  97. } else if (k == ) {
  98. left = right_beg;
  99. right = right_end;
  100. if (get_sum(left_beg, right_end) > get_sum(left, right)) {
  101. left = left_beg;
  102. right = right_end;
  103. }
  104. } else {
  105. if (get_sum(left_beg, left_end) >= get_sum(right_beg, right_end)) {
  106. left = left_beg;
  107. right = left_end;
  108. } else {
  109. left = right_beg;
  110. right = right_end;
  111. }
  112. int m_l, m_r, x;
  113. query( * r, L, R, m_l, x, );
  114. query( * r + , L, R, x, m_r, );
  115. if (get_sum(m_l, m_r) > get_sum(left, right)) {
  116. left = m_l;
  117. right = m_r;
  118. }
  119. }
  120. }
  121. }
  122. }
  123. } tree;
  124.  
  125. int main() {
  126. int n, m, c = ;
  127. while (scanf("%d%d", &n, &m) != EOF) {
  128. dish_sum[] = ;
  129. for (int i = ; i <= n; i++) {
  130. scanf("%d", &dish[i]);
  131. dish_sum[i] = dish_sum[i - ] + dish[i];
  132. }
  133. tree.build(, , n);
  134. printf("Case %d:\n", ++c);
  135. for (int i = ; i < m; i++) {
  136. int l, r, left, right;
  137. scanf("%d%d", &l, &r);
  138. if (l > r) swap(l, r);
  139. l = max(, l);
  140. r = min(n, r);
  141. tree.query(, l, r, left, right, );
  142. printf("%d %d\n", left, right);
  143. }
  144. }
  145. }

Trainning Guide的代码的更多相关文章

  1. Trainning Guide, Data Structures, Example

    最近在复习数据结构,发现这套题不错,题目质量好,覆盖广,Data Structures部分包括Example,以及简单,中等,难三个部分,这几天把Example的做完了, 摘要如下: 通过这几题让我复 ...

  2. 【201】SeaDAS代码

    参考: 官方网站:http://seadas.gsfc.nasa.gov/ L2GEN User's Guide l2gen 代码: l2gen, ifile="ifile", g ...

  3. DCM TUTORIAL – AN INTRODUCTION TO ORIENTATION KINEMATICS (REV 0.1)

    原英文地址:dcm_tutorial 感觉这篇文章还是很有学习价值的,所以就抽出了一些时间对本文进行的翻译.下面这个好多人用的算法就是一种DCM 滤波器. //==================== ...

  4. Hadoop could not find or load main class

    Error: Could not find or load main class <class_name> 我在尝试使用hadoop definitive guide的代码做练习时,遇到一 ...

  5. Accumulators

    copy的官方programming guide的代码,只有一个要说一下,Accumulators的更新是在action做的,transformation操作中对于Accumulators的增加不会即 ...

  6. multi2sim,booksim简介

    booksim是周期精确互连网络仿真器,设计用来配合"Principles and Practices of Interconnection Networks"课程教学,仿真器采用 ...

  7. 转:使用C#的HttpWebRequest模拟登陆网站

    这篇文章是有关模拟登录网站方面的. 实现步骤: 启用一个web会话 发送模拟数据请求(POST或者GET) 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据. ...

  8. SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession作用域(Scope)和生命周期

    可以说每个MyBatis都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory实例可以通过SqlSessionFactoryBuilder来构建.一是可以通过XM ...

  9. editPuls 常用知识

    1.创建模板 1).创建模板页(*.html) 2).Tools->Preferences->File->Templates->HTML->file name重新选定模板 ...

随机推荐

  1. jCallout 实现气泡提示

    在提交表单前.焦点转移后或者 keyup 时往往需要对输入的文本就行检验,如果输入内容不符合相关约定则要进行提示或警告,有一个叫 jCallout 的插件可以轻松实现该功能,该插件基于  jQuery ...

  2. WSAEventSelect模型详解

    WSAEventSelect 是 WinSock 提供的一种异步事件通知I/O模型,与 WSAAsyncSelect模型有些类似.       该模型同样是接收 FD_XXX 之类的网络事件,但是是通 ...

  3. 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 ...

  4. DEDECMS中,引入文件

    引入文件:dede:include 标签:{dede:include filename="foot.htm"/}

  5. Open Live Writer增加代码插件

          作为一名程序员,免不了和代码打交道,自然在写博客的时候,也会用到代码的展示,Open Live Writer确实是一个不错的工具,不用再去登录博客的后台,就可以在本地进行文章的编写,但是致 ...

  6. amazon RequestReport

    _GET_SELLER_FEEDBACK_DATA_        MarketplaceIdList 这此字段必填,否则无法取到报告

  7. 【转】 设定linux 系统可用资源

    getrlimit和setrlimit函数  每个进程都有一组资源限制,其中某一些可以用getrlimit和setrlimit函数查询和更改. #include #include int getrli ...

  8. WCF 傻瓜教程

    第一步,新建WCF服务应用程序 第二步,定义接口: 修改接口类,定义你要的方法接口默认文件名:IService1.cs 第三步,实现接口: 在svc文件里实现接口方法,默认文件名:Service1.s ...

  9. 过滤菜鸟的iOS面试题-b

    网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...

  10. 在工程中添加pch文件

    在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字的pch (precompile header)文件,在开发过程中,可以将那些整个工程都广泛使用的头文件包含在该文件下,编 ...