因为shift操作中的数不多,所以直接用单点更新模拟一下就好了。

太久不写线段树,手好生啊,不是这错一下就是那错一下。

PS:输入写的我有点蛋疼,不知道谁有没有更好的写法。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int maxn = + ;
  9. const int maxnode = (maxn << );
  10. const int INF = 0x3f3f3f3f;
  11.  
  12. void scan(int& x)
  13. {
  14. x = ;
  15. char c = ' ';
  16. while(c < '' || c > '') c = getchar();
  17. while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
  18. }
  19.  
  20. int qL, qR;
  21. int p, v;
  22. int n, Q;
  23. int minv[maxnode];
  24.  
  25. int a[maxn];
  26.  
  27. void build(int o, int L, int R)
  28. {
  29. if(L == R) { scan(a[L]); minv[o] = a[L]; return ; }
  30. int M = (L + R) / ;
  31. build(o<<, L, M);
  32. build(o<<|, M+, R);
  33. minv[o] = min(minv[o<<], minv[o<<|]);
  34. }
  35.  
  36. void update(int o, int L, int R)
  37. {
  38. //if(v >= minv[o]) return ;
  39. if(L == R) { minv[o] = v; return ; }
  40.  
  41. int M = (L + R) / ;
  42. if(p <= M) update(o<<, L, M);
  43. else update(o<<|, M+, R);
  44. minv[o] = min(minv[o<<], minv[o<<|]);
  45. }
  46.  
  47. int query(int o, int L, int R)
  48. {
  49. if(qL <= L && R <= qR) return minv[o];
  50. int ans = INF;
  51. int M = (L + R) / ;
  52. if(qL <= M) ans = min(ans, query(o<<, L, M));
  53. if(qR > M) ans = min(ans, query(o<<|, M+, R));
  54. return ans;
  55. }
  56.  
  57. char op[];
  58.  
  59. int main()
  60. {
  61. while(scanf("%d%d", &n, &Q) == && n)
  62. {
  63. build(, , n);
  64. while(Q--)
  65. {
  66. scanf("%s", op);
  67. int l = strlen(op);
  68. if(op[] == 'q')
  69. {
  70. int i = ;
  71. qL = ;
  72. while(i < l && op[i] >= '' && op[i] <= '') { qL = qL * + op[i] - ''; i++; }
  73. while(i < l && (op[i] < '' || op[i] > '')) i++;
  74. qR = ;
  75. while(i < l && op[i] >= '' && op[i] <= '') { qR = qR * + op[i] - ''; i++; }
  76. printf("%d\n", query(, , n));
  77. }
  78. else
  79. {
  80. vector<int> hehe;
  81.  
  82. for(int i = ; i < l;)
  83. {
  84. while(i < l && (op[i] < '' || op[i] > '')) i++;
  85. if(i >= l) break;
  86. int x = ;
  87. while(i < l && op[i] >= '' && op[i] <= '') { x = x * + op[i] - ''; i++; }
  88. hehe.push_back(x);
  89. }
  90.  
  91. int sz = hehe.size();
  92. for(int i = ; i < sz - ; i++)
  93. {
  94. v = a[hehe[i + ]];
  95. p = hehe[i];
  96. update(, , n);
  97. }
  98. v = a[hehe[]];
  99. p = hehe[sz - ];
  100. update(, , n);
  101.  
  102. int t = a[hehe[]];
  103. for(int i = ; i < sz - ; i++) a[hehe[i]] = a[hehe[i+]];
  104. a[hehe[sz - ]] = t;
  105. }
  106. }
  107. }
  108.  
  109. return ;
  110. }

代码君

UVa 12299 线段树 单点更新 RMQ with Shifts的更多相关文章

  1. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  2. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  3. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  4. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  6. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  7. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  8. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

随机推荐

  1. hard link && symbolic link

    hard link :硬连接,多了一个inode,指向原始的inode,通过这个硬连接删除文件,文件不会被真正删除,而是删除这个inode symolic link:符号连接相当于快捷方式

  2. 关于window.event.returnValue=false的用处

    window.event.returnValue=false放在提交表单中的onclick事件中则不会提交表单,如果放到超链接中则不执行超链接,也就是它禁止了或取消了请求,没有任何效果. 比如: if ...

  3. shell命令cut

    cut命令用来操作字符串,可以理解为剪切字符串的工具: cut有两种用法: 1.剪切字符串中的单个字符(-c参数) 例如: str=abcdef echo $str | cut -c 1-1 输出:a ...

  4. LibreOJ #6208. 树上询问

    内存限制:512 MiB 时间限制:500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 树链剖分+线段树 屠龙宝刀点击就送 #include <vector> ...

  5. cdoj 414 八数码 (双向bfs+康拓展开,A*)

    一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...

  6. C-基础:形参char *&p与char *p

    char* &p:以引用传递的方式传指针char* p: 以值传递的方式传指针

  7. SC || Chapter 3

    ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 基本数据类型 && 对象数据类型 基本数据类型(int char long) 在栈中分配内存,不可变 对象数据类型(String BigInt ...

  8. python学习笔记-环境安装【1】

    1.在 WINDOWS 下面要运行命令 pip install virtualenvwrapper-win才行 参考地址http://blog.csdn.net/liuhongyue/article/ ...

  9. c#和Java中的接口

    使用场景: 在c#和Java中: 1.接口可以实现“多继承”(多实现),一个类只能继承自一个父类,但是可以实现多个接口. 2.接口解决了不同类型之间的多态问题,比如鱼与船不是同一类型,但是都能在水里“ ...

  10. PAT (Basic Level) Practise (中文)- 1009. 说反话 (20)

    http://www.patest.cn/contests/pat-b-practise/1009 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在 ...