poj 3264

Sample Input

  1. 6 3
  2. 1
  3. 7
  4. 3
  5. 4
  6. 2
  7. 5
  8. 1 5
  9. 4 6
  10. 2 2

Sample Output

  1. 6
  2. 3
  3. 0

求任一区间的最大值和最小值的差

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. using namespace std;
  7. #define N 50005
  8. #define mod 258280327
  9. #define MIN 0
  10. #define MAX 1000001
  11. struct node
  12. {
  13. int val,maxn,minx;
  14. int Left,Right;
  15. } pnode[4*N];
  16. int a[N];
  17. int tmax,tmin;
  18. void build(int i,int l,int r)
  19. {
  20. pnode[i].Left = l;
  21. pnode[i].Right = r;
  22. pnode[i].maxn = MIN;
  23. pnode[i].minx = MAX;
  24. if(l == r)
  25. return;
  26. build(i*2,l ,(l+r)/2);
  27. build(i*2+1, (l+r)/2 + 1,r);
  28. }
  29.  
  30. void insert(int i,int index,int va)
  31. {
  32. if(pnode[index].Left == pnode[index].Right)
  33. {
  34. pnode[index].maxn = pnode[index].minx = va;
  35. return ;
  36. }
  37. pnode[index].maxn = max(pnode[index].maxn,va);
  38. pnode[index].minx = min(pnode[index].minx,va);
  39. int mid = (pnode[index].Left+pnode[index].Right)/2;
  40. if (mid >= i)
  41. insert(i,index*2,va);
  42. else
  43. insert(i,index*2+1, va);
  44. }
  45.  
  46. void query(int u,int l,int r,int a,int b)
  47. {
  48. // if(pnode[u].minx >= tmin && pnode[u].maxn < tmax)
  49. // return;
  50. if(a == l && b == r)
  51. {
  52. if(tmax < pnode[u].maxn)
  53. tmax = pnode[u].maxn;
  54. if(tmin > pnode[u].minx)
  55. tmin = pnode[u].minx;
  56. return ;
  57. }
  58.  
  59. int mid = (l + r)>>1;
  60. if (mid >= b)
  61. query(u*2,l, mid, a, b);
  62. else if (mid < a)
  63. query(u*2+1,mid+1, r, a, b);
  64. else
  65. {
  66. query(u*2,l, mid, a, mid);
  67. query( u*2+1,mid+1, r, mid+1, b);
  68. }
  69. }
  70.  
  71. int main()
  72. {
  73. int n,m;
  74. scanf("%d%d",&n,&m);
  75. build(1,1,n);
  76. for(int i = 1; i <= n; i++)
  77. {
  78. scanf("%d",&a[i]);
  79. insert(i,1,a[i]);
  80. }
  81.  
  82. for(int i = 1; i <= m; i++)
  83. {
  84. int x,y;
  85. tmax = -MAX;
  86. tmin = MAX;
  87. scanf("%d%d",&x,&y);
  88. query(1,1,n,x,y);
  89. printf("%d\n",tmax-tmin);
  90. }
  91.  
  92. return 0;
  93. }

  

poj 3468

Sample Input

  1. 10 5
  2. 1 2 3 4 5 6 7 8 9 10
  3. Q 4 4
  4. Q 1 10
  5. Q 2 4
  6. C 3 6 3
  7. Q 2 4

Sample Output

  1. 4
  2. 55
  3. 9
  4. 15

①对区间i - j 的数全加上c ;   ②求区间的和

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. #define N 100005
  9. #define mod 258280327
  10. #define MIN 0
  11. #define MAX 1000001
  12.  
  13. struct node
  14. {
  15. ll val,els;
  16. int Left,Right;
  17. } pnode[4*N];
  18.  
  19. int a[N];
  20. int tmax,tmin;
  21. void build(int i,int l,int r)
  22. {
  23. pnode[i].Left = l;
  24. pnode[i].Right = r;
  25. pnode[i].val = 0;
  26. pnode[i].els = 0;
  27. if(l == r)
  28. return;
  29. build(i*2,l ,(l+r)/2);
  30. build(i*2+1, (l+r)/2 + 1,r);
  31. }
  32.  
  33. void insert(int i,int index,int va)
  34. {
  35. if(pnode[index].Left == pnode[index].Right)
  36. {
  37. pnode[index].val = va;
  38. return ;
  39. }
  40. pnode[index].val+=va;
  41. int mid = (pnode[index].Left+pnode[index].Right)/2;
  42. if (mid >= i)
  43. insert(i,index*2,va);
  44. else
  45. insert(i,index*2+1, va);
  46. }
  47.  
  48. void add(int u,int l,int r,ll c,int a,int b)
  49. {
  50. if(a == l && b == r)
  51. {
  52. pnode[u].els += c;
  53. return ;
  54. }
  55. pnode[u].val += (b-a+1)*c; //让大于a,b的部分加上
  56. if(l == r)
  57. return ;
  58. int mid = (l + r)>>1;
  59. if (mid >= b)
  60. add(u*2,l, mid, c, a, b);
  61. else if (mid < a)
  62. add(u*2+1,mid+1, r, c, a, b);
  63. else
  64. {
  65. add(u*2,l, mid , c,a, mid);
  66. add(u*2+1,mid+1, r,c, mid+1, b);
  67. }
  68. }
  69.  
  70. long long query(int u,int l,int r,int a,int b)
  71. {
  72. if(a == l && b == r)
  73. {
  74. return pnode[u].val + (pnode[u].Right - pnode[u].Left + 1)*pnode[u].els;
  75. }
  76. pnode[u].val += (pnode[u].Right - pnode[u].Left + 1)*pnode[u].els;
  77. //当取了a,b的附加值后,将其附加值往下放
  78. add(u*2,pnode[u].Left,(pnode[u].Left + pnode[u].Right)/2,pnode[u].els,pnode[u].Left,(pnode[u].Left + pnode[u].Right)/2);
  79. add(u*2+1,(pnode[u].Left+pnode[u].Right)/2+1,pnode[u].Right,pnode[u].els,(pnode[u].Left+pnode[u].Right)/2+1,pnode[u].Right);
  80. pnode[u].els = 0;
  81. int mid = (l + r)>>1;
  82. if (mid >= b)
  83. return query(u*2,l, mid, a, b);
  84. else if (mid < a)
  85. return query(u*2+1,mid+1, r, a, b);
  86. else
  87. {
  88. return query(u*2,l, mid, a, mid)+query( u*2+1,mid+1, r, mid+1, b);
  89. }
  90. }
  91.  
  92. int main()
  93. {
  94. int n,m,l,r,c;
  95. char ch;
  96. while(scanf("%d%d",&n,&m)!= EOF)
  97. {
  98. build(1,1,n);
  99. for(int i = 1; i <= n; i++)
  100. {
  101. scanf("%d",&a[i]);
  102. insert(i,1,a[i]);
  103. }
  104.  
  105. for(int i = 1; i <= m; i++)
  106. {
  107. getchar();
  108. ch = getchar();
  109. if(ch == 'Q')
  110. {
  111. scanf("%d%d",&l,&r);
  112. printf("%I64d\n",query(1,1,n,l,r));
  113. }
  114. if(ch == 'C')
  115. {
  116. scanf("%d%d%d",&l,&r,&c);
  117. add(1,1,n,c,l,r);
  118. }
  119. }
  120. }
  121. return 0;
  122. }

  

poj 3264 & poj 3468(线段树)的更多相关文章

  1. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  2. POJ 3264 Balanced Lineup 线段树RMQ

    http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...

  3. [POJ] 3264 Balanced Lineup [线段树]

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34306   Accepted: 16137 ...

  4. poj 3264(RMQ或者线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 42929   Accepted: 20184 ...

  5. POJ 3264 Balanced Lineup 线段树 第三题

    Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...

  6. POJ - 3264 Balanced Lineup 线段树解RMQ

    这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...

  7. POJ 3264 Balanced Lineup (线段树)

    Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...

  8. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

  9. hdu 1698+poj 3468 (线段树 区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...

随机推荐

  1. SQLAlchemy 教程 —— 基础入门篇

    SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...

  2. 201621123043 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains的源代码如下 public boolean contain ...

  3. MySort实验报告

    实验日期:2017.5.2 实验内容:利用sort方法对已给的数据进行重新排序. 实验原图: 对原代码进行添加,补充新的内容: 在for循环中,新输入一个变量j,并新定义新的长度toSort.leng ...

  4. 原生ajax的请求函数

    ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务器.发送请求.接收响应 ...

  5. php代码开启缓冲的使用方法

    php可以开启缓冲区,就是将内容放到缓冲区,再决定什么时候发送给浏览器. 感谢:http://www.jb51.net/article/38964.htm 解析PHP中ob_start()函数的用法 ...

  6. selenium在页面中多个fream的定位

    在做页面元素定位的时候,遇到多fream的页面定位比较困难,需要先去切换到元素所在的fream才能成功定位. 1,切换到目标fream: driver.switch_to.frame('freamID ...

  7. js window

    window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...

  8. vue表单详解——小白速会

    一.基本用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定. 但 v-model 本质上不过是语法糖.它负责监听用户的 ...

  9. Jetty入门(1-1)Jetty入门教程

    一.Jetty是什么? 1.Jetty 是一个Java语言编写的,开源的Servlet容器和应用服务器. Jetty 极度轻量级.高便携性.功能强大.灵活和扩展性好,而且支持各种技术如SPDY.Web ...

  10. python/MySQL练习题(二)

    python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...