input

q n

q行 F a b或者Q a b

output

face left  face top  face right

可以用map或者线段树做

  1. //map
  2. #include<cstdio>
  3. #include<map>
  4. using namespace std;
  5. map<int, char>a;
  6. int main()
  7. {
  8. int n, t, i, d2, d1, r, l, s;
  9. char com;
  10. map<int, char>::iterator p, q;
  11. while (~scanf("%d%d", &n, &t))
  12. {
  13. a.insert(make_pair(, 't'));
  14. a.insert(make_pair(, 't'));
  15. a.insert(make_pair(t + , 't'));
  16. for (i = ; i < n; i++)
  17. {
  18. scanf("\n%c%d%d", &com, &d1, &d2);
  19. if (com == 'F')
  20. {
  21. if (d1 > d2)
  22. {
  23. com = 'l';
  24. for (p = a.begin(); p->first < d2; p++);
  25. for (q = p; q->first <= d1; q++);
  26. q--;
  27. char tmp;
  28. tmp = q->second;
  29. q++;
  30. if (p != q) a.erase(p, q);
  31. a.insert(make_pair(d2, com));
  32. a.insert(make_pair(d1 + , tmp));
  33. }
  34. else
  35. {
  36. com = 'r';
  37. for (p = a.begin(); p->first < d1; p++);
  38. for (q = p; q->first <= d2; q++);
  39. q--;
  40. char tmp;
  41. tmp = q->second;
  42. q++;
  43. if (p != q) a.erase(p, q);
  44. a.insert(make_pair(d1, com));
  45. a.insert(make_pair(d2 + , tmp));
  46. }
  47. }
  48. else
  49. {
  50. r = ; l = ; s = ;
  51. for (p = a.begin(); p->first <= d1; p++);
  52. for (q = p; q->first <= d2; q++);
  53. q--;
  54. p--;
  55. for (; p != q;)
  56. {
  57. if (p->second == 'r')
  58. r += (++p)->first - d1;
  59. else if (p->second == 'l')
  60. l += (++p)->first - d1;
  61. else s += (++p)->first - d1;
  62. d1 = p->first;
  63. }
  64. if (q->second == 'r') r += d2 - d1 + ;
  65. else if (q->second == 'l') l += d2 - d1 + ;
  66. else s += d2 - d1 + ;
  67. printf("%d %d %d\n", l, s, r);
  68. }
  69. }
  70. a.clear();
  71. }
  72. return ;
  73. }
  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <cstdlib>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <ctime>
  11. #include <cmath>
  12. #define MAX 100000
  13. using namespace std;
  14. int q,n,setv[MAX*],v,a,b,sum[],sumv[MAX*][];
  15. void pushdown(int &l,int &r,int &k)
  16. {
  17. if(setv[k]<) return;
  18. int m=l+((r-l)>>),lc=k<<,rc=(k<<)+;
  19. setv[rc]=setv[lc]=setv[k];
  20. memset(sumv[lc],,sizeof(sumv[]));
  21. memset(sumv[rc],,sizeof(sumv[]));
  22. sumv[lc][setv[k]]=m-l+;
  23. sumv[rc][setv[k]]=r-m;
  24. setv[k]=-;
  25. }
  26. void reset(int l,int r,int k)
  27. {
  28. int lc=k<<,rc=(k<<)+;
  29. sumv[k][]=sumv[lc][]+sumv[rc][];
  30. sumv[k][]=sumv[lc][]+sumv[rc][];
  31. sumv[k][]=sumv[lc][]+sumv[rc][];
  32. }
  33. void update(int l,int r,int k)
  34. {
  35. int lc=k<<,rc=(k<<)+;
  36. if(a<=l&&b>=r)
  37. {
  38. setv[k]=v;
  39. memset(sumv[k],,sizeof(sumv[]));
  40. sumv[k][setv[k]]=r-l+;
  41. return;
  42. }
  43. pushdown(l,r,k);
  44. int m=l+((r-l)>>);
  45. if(a<=m) update(l,m,lc);
  46. if(b>m) update(m+,r,rc);
  47. reset(l,r,k);
  48. }
  49. void query(int l,int r,int k)
  50. {
  51. // printf("%d:%d %d %d %d\n",k,setv[k],sumv[k][0],sumv[k][1],sumv[k][2]);
  52. if(setv[k]>=)
  53. {
  54. sum[setv[k]]+=min(r,b)-max(l,a)+;
  55. return;
  56. }
  57. if(a<=l&&b>=r)
  58. {
  59. sum[]+=sumv[k][];
  60. sum[]+=sumv[k][];
  61. sum[]+=sumv[k][];
  62. return;
  63. }
  64. int m=l+((r-l)>>);
  65. if(a<=m) query(l,m,k<<);
  66. if(b>m) query(m+,r,(k<<)+);
  67. }
  68. int main()
  69. {
  70. //freopen("/home/user/桌面/in","r",stdin);
  71. while(scanf("%d%d",&q,&n)==)
  72. {
  73. memset(setv,-,sizeof(setv[])**n);
  74. memset(sumv,,sizeof(sumv[])**n);
  75. a=;b=n;v=;
  76. update(,n,);
  77. char op[];
  78. while(q--)
  79. {
  80. scanf("%s%d%d",op,&a,&b);
  81. if(op[]=='F')
  82. {
  83. v=;
  84. if(a>b)
  85. {
  86. v=;
  87. swap(a,b);
  88. }
  89. update(,n,);
  90. // for(int i=1;i<3*n;i++) printf("%d:%d %d %d %d\n",i,setv[i],sumv[i][0],sumv[i][1],sumv[i][2]);
  91. }
  92. else
  93. {
  94. sum[]=sum[]=sum[]=;
  95. query(,n,);
  96. printf("%d %d %d\n",sum[],sum[],sum[]);
  97. }
  98. }
  99. }
  100. //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
  101. return ;
  102. }

NBUT 1120 线段树的更多相关文章

  1. NBUT 1120 Reimu's Teleport (线段树)

    题意: 有n个格子,一开始全部面向top.接下来的每次修改F a b ,如果 a>b则将a~b之间的格子全面置为向右,否则置为向左.对于每个询问Q输出向左.top.右的数量. 思路: 普通线段树 ...

  2. RMQ with Shifts(线段树)

    RMQ with Shifts Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Pra ...

  3. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  4. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

随机推荐

  1. javascript 限制字符串字数换行 带BUG

    function chang(str ,len) { function lenStat(str) { function isChinese(str) { //判断是不是中文 var reCh = /[ ...

  2. Docker私有仓库3

    http://www.cnblogs.com/womars/p/5906435.html(上篇地址) 三.测试上两篇 #测试一下 [root@lh- data]# pwd /opt/data [roo ...

  3. delphi edit 中undo 和clearundo 复制粘贴等总结

    edit 和memo都有undo功能, Undo:恢复到改动前. ClearUndo:撤销掉Undo缓冲区的内容,则将无法恢复到改动前的 从该文本框的撤销缓冲区中清除关于最近操作的信息,根据应用 程序 ...

  4. ZOJ 3702 Gibonacci number

    本来已经关上电脑了 但还是想打开电脑纪念一下这充实的一天…… 第一节高数课讲新课级数 讲完一个知识点 想问问女票今天咋又没来上课…… 突然发现院长问我自费去不去省赛…… !!! 当然是去啊! ……虽然 ...

  5. wuzhi 五指 伪静态

    rewrite ^(.*)list\/([0-9]+)-([0-9]+)\.html$ $1index.php?v=listing&cid=$2&page=$3 last; rewri ...

  6. 华中农业大学新生赛C题

    http://acm.hzau.edu.cn/problem.php?id=1099 题意: 输入两个整数 l 和 n,代表半径和output的保留小数点位数. 输出圆的面积,保留n位小数. 一开始觉 ...

  7. Git单独checkout子目录

    http://schacon.github.io/git/git-read-tree.html#_sparse_checkout Existing Repository If you already ...

  8. 《JavaScript高级程序设计》读书笔记 ---基本概念小结

     ECMAScript 中的基本数据类型包括Undefined.Null.Boolean.Number 和String. 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据 ...

  9. iOSstoryboard xib下label怎么自适应宽度高度

    先看需求:两个Label,要求蓝色的label紧跟在红色的label文字后面 ok首选正常添加约束 红色的Label添加宽度,高度,左边,上边约束 蓝色的Label添加宽度,高度,左边,和红色的水平对 ...

  10. inflate的使用注意事项

    public View inflate (int resource, ViewGroup root, boolean attachToRoot) 我们在使用这个方法时,要清楚原理,下面是这个方法的文档 ...