OJ题号:
洛谷2880

思路1:

线段树维护区间最大最小值。

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<utility>
  4. #include<algorithm>
  5. inline int getint() {
  6. char ch;
  7. bool sgn=false;
  8. while(!isdigit(ch=getchar())) if(ch=='-') sgn=true;
  9. int x=ch^'';
  10. while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
  11. return sgn?-x:x;
  12. }
  13. const int inf=0x7fffffff;
  14. const int N=;
  15. class SegmentTree {
  16. #define _left <<1
  17. #define _right <<1|1
  18. private:
  19. int max[N<<],min[N<<];
  20. void push_up(const int p) {
  21. max[p]=std::max(max[p _left],max[p _right]);
  22. min[p]=std::min(min[p _left],min[p _right]);
  23. }
  24. public:
  25. void build(const int p,const int b,const int e) {
  26. if(b==e) {
  27. max[p]=min[p]=getint();
  28. return;
  29. }
  30. int mid=(b+e)>>;
  31. build(p _left,b,mid);
  32. build(p _right,mid+,e);
  33. push_up(p);
  34. }
  35. std::pair<int,int> query(const int p,const int b,const int e,const int l,const int r) {
  36. if((b==l)&&(e==r)) {
  37. return std::make_pair(max[p],min[p]);
  38. }
  39. int mid=(b+e)>>;
  40. int max=,min=inf;
  41. if(l<=mid) {
  42. std::pair<int,int> tmp=query(p _left,b,mid,l,std::min(mid,r));
  43. max=std::max(max,tmp.first);
  44. min=std::min(min,tmp.second);
  45. }
  46. if(r>mid) {
  47. std::pair<int,int> tmp=query(p _right,mid+,e,std::max(mid+,l),r);
  48. max=std::max(max,tmp.first);
  49. min=std::min(min,tmp.second);
  50. }
  51. return std::make_pair(max,min);
  52. }
  53. };
  54. SegmentTree t;
  55. int main() {
  56. int n=getint(),m=getint();
  57. t.build(,,n);
  58. while(m--) {
  59. int l=getint(),r=getint();
  60. std::pair<int,int> tmp=t.query(,,n,l,r);
  61. printf("%d\n",tmp.first-tmp.second);
  62. }
  63. return ;
  64. }

思路2:
倍增法求RMQ。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<algorithm>
  5. inline int getint() {
  6. char ch;
  7. while(!isdigit(ch=getchar()));
  8. int x=ch^'';
  9. while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
  10. return x;
  11. }
  12. const int N=,logN=log2(N)+;
  13. int min[N][logN],max[N][logN];
  14. int main() {
  15. int n=getint(),m=getint();
  16. for(int i=;i<=n;i++) {
  17. min[i][]=max[i][]=getint();
  18. }
  19. for(int j=;j<=log2(n);j++) {
  20. for(int i=;i<=n-(<<j)+;i++) {
  21. min[i][j]=std::min(min[i][j-],min[i+(<<(j-))][j-]);
  22. max[i][j]=std::max(max[i][j-],max[i+(<<(j-))][j-]);
  23. }
  24. }
  25. while(m--) {
  26. int l=getint(),r=getint();
  27. int k=log2(r-l+);
  28. printf("%d\n",std::max(max[l][k],max[r+-(<<k)][k])-std::min(min[l][k],min[r+-(<<k)][k]));
  29. }
  30. return ;
  31. }

[USACO07JAN]Balanced Lineup的更多相关文章

  1. 洛谷 P2880 [USACO07JAN]Balanced Lineup G (ST表模板)

    题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N ...

  2. 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)

    维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...

  3. ST表 || RMQ问题 || BZOJ 1699: [Usaco2007 Jan]Balanced Lineup排队 || Luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup

    题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup 题解: ST表板子 代码: #include<cstdio> #include<cstring&g ...

  4. P2880 [USACO07JAN]平衡的阵容Balanced Lineup(RMQ的倍增模板)

    题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup RMQ问题:给定一个长度为N的区间,M个询问,每次询问Li到Ri这段区间元素的最大值/最小值. RMQ的高级写法一般 ...

  5. P2880 [USACO07JAN]平衡的阵容Balanced Lineup

    P2880 [USACO07JAN]平衡的阵容Balanced Lineup RMQ RMQ模板题 静态求区间最大/最小值 (开了O2还能卡到rank9) #include<iostream&g ...

  6. 【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)

    题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...

  7. [USACO07JAN]平衡的阵容Balanced Lineup

    [USACO07JAN]平衡的阵容Balanced Lineup 题目描述 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) a ...

  8. poj 3264:Balanced Lineup(线段树,经典题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32820   Accepted: 15447 ...

  9. Balanced Lineup(树状数组 POJ3264)

    Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 40493 Accepted: 19035 Cas ...

随机推荐

  1. JavaScript 计时

    http://www.w3school.com.cn/js/js_timing.asp JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码 ...

  2. 修改input placeholder样式

    <style> /* 通用 */ ::-webkit-input-placeholder { color: rgb(235, 126, 107); } ::-moz-placeholder ...

  3. LVTTL与LVCMOS区别

    TTL电平的VIH/VIL一般是2V/0.8V,VOH/VOL一般是 2.4V/0.4V,不论是3.3V还是5V的TTL都一样的:CMOS的VIH/VIL一般是70%VCC/30%VCC,VOH/VO ...

  4. Maven私服安装及配置——(十二)

    0.私服实际是B/S架构的,需要通过浏览器访问.访问地址在 nexus-2.12.0-01\conf\nexus.properties中查看.

  5. Linux如何解决动态库的版本控制

    引用自:http://www.linuxidc.com/Linux/2012-04/59071.htm (换句话说,soname不是真实存在的文件,只是在此库中和将来调用此库的文件中保存的一个名字,在 ...

  6. urb传输的代码分析【转】

    转自:http://blog.csdn.net/zkami/article/details/2503829 urb传输的代码分析 如需引用,请注明出处blog.csdn.net/zkami 作者Zhe ...

  7. C# Json To Object 无废话

    json字符串如下: { success : 0, errorMsg : "错误消息", data : { total : "总记录数", rows : [ { ...

  8. springcloud微服务架构搭建:服务调用

    spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign. Ribbon是一个基于HTTP和TCP客户端的负载均衡器,类似nginx反向代理,可 ...

  9. Python学习五|集合、布尔、字符串的一些特点

    #集合本身就像无值的字典 list1 = set([1,2,3,4]) list2 = {1,2,3,4} print('list1 == list2?:',list1==list2)#list1 = ...

  10. easyui tree:根据属性格式化树节点名称

    $('#resourceTree').tree({ method : 'post', animate : true, onContextMenu : function(e, node) { e.pre ...