题意:有N个数字,M个操作,然后回答每个Q开头的询问

操作形式:

A val pos:在pos位置上+val

Q l r:询问l~r之间有多少个质数

R val l r:把l~r之间的数字替换成val

分析:建成两棵树,一棵更新 原数列,一棵更新 质数序列(只有0,1)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6. #define repu(i,a,b) for(int i=a;i<b;i++)
  7. #define lson l , m , rt << 1
  8. #define rson m + 1 , r , rt << 1 | 1
  9. const int maxn = ;
  10. const int M = ;
  11. int h , w , n;
  12. bool p[M];
  13. int prime()
  14. {
  15. memset(p,false,sizeof(p));
  16. p[] = p[] = true;
  17. for(int i = ; i <= M; i += )
  18. p[i] = true;
  19. for(int i = ; i <= sqrt(M); i+=)
  20. {
  21. int k = i * ;
  22. for(int j = i*i; j <= M; j += k)
  23. p[j] = true;
  24. }
  25. }
  26. struct Segment
  27. {
  28. int col[maxn<<];
  29. int sum[maxn<<];
  30. void init()
  31. {
  32. memset(col,,sizeof(col));
  33. memset(sum,,sizeof(sum));
  34. }
  35. void PushUp(int rt)
  36. {
  37. sum[rt] = sum[rt<<] + sum[rt<<|];
  38. }
  39. void PushDown(int rt,int m)
  40. {
  41. if(col[rt] != -)///如果是0就进不去
  42. {
  43. col[rt<<] = col[rt<<|] = col[rt];
  44. sum[rt<<] = (m - (m >> )) * col[rt];
  45. sum[rt<<|] = (m >> ) * col[rt];
  46. col[rt] = -;
  47. }
  48. }
  49. void build(int l,int r,int rt)
  50. {
  51. col[rt] = -;
  52. sum[rt] = ;
  53. if (l == r) return ;
  54. int m = (l + r) >> ;
  55. build(lson);
  56. build(rson);
  57. PushUp(rt);
  58. }
  59. void Update(int p,int add,int l,int r,int rt)
  60. {
  61. if(l == r)
  62. {
  63. sum[rt] += add;
  64. return ;
  65. }
  66. PushDown(rt , r - l + );
  67. int m = (l + r) >> ;
  68. if (p <= m) Update(p, add, lson);
  69. else Update(p, add, rson);
  70. PushUp(rt);
  71. }
  72. void update(int L,int R,int c,int l,int r,int rt)
  73. {
  74. if (L <= l && r <= R)
  75. {
  76. col[rt] = c;
  77. ///因为序列只有0,1;如果初始化为0的话,赋值有可能赋成0,pushdown就进不了,也就跟新不了数据了
  78. sum[rt] = c * (r - l + );
  79. return ;
  80. }
  81. PushDown(rt , r - l + );
  82. int m = (l + r) >> ;
  83. if (L <= m) update(L , R , c , lson);
  84. if (R > m) update(L , R , c , rson);
  85. PushUp(rt);
  86. }
  87. int query(int L,int R,int l,int r,int rt)
  88. {
  89. if (L <= l && r <= R)
  90. {
  91. return sum[rt];
  92. }
  93. PushDown(rt , r - l + );
  94. int m = (l + r) >> ;
  95. int ret = ;
  96. if (L <= m) ret += query(L , R , lson);
  97. if (m < R) ret += query(L , R , rson);
  98. PushUp(rt);
  99. return ret;
  100. }
  101. } Seg,seg;
  102. int main()
  103. {
  104. int T , n , m, a , b , c;
  105. prime();
  106. scanf("%d",&T);
  107. for (int cas = ; cas <= T ; cas ++)
  108. {
  109. Seg.init();
  110. seg.init();
  111. scanf("%d%d",&n,&m);
  112. Seg.build( , n , );
  113. seg.build( , n , );
  114. repu(i,,n+)
  115. {
  116. scanf("%d",&a);
  117. Seg.Update(i,a,,n,);
  118. if(!p[a])///如果是质数才加1
  119. seg.Update(i,,,n,);
  120. }
  121. char s[];
  122. while(m--)
  123. {
  124. scanf("%s",s);
  125. if(s[] == 'R')
  126. {
  127. scanf("%d%d%d",&a, &b, &c);
  128. Seg.update(b , c , a , , n , );
  129. if(!p[a])///如果是质数,更新成1
  130. seg.update(b , c , , , n , );
  131. else
  132. seg.update(b , c , , , n , );
  133. }
  134. else if(s[] == 'A')
  135. {
  136. scanf("%d%d",&a,&b);///在b位置上加a,如果加的数字成了质数,也得更新另一棵树
  137. int t = Seg.query(b,b,,n,);
  138. Seg.Update(b,a,,n,);
  139. if(!p[t+a] && p[t])///原本不是质数,变成了质数
  140. seg.Update(b,,,n,);
  141. else if(p[t+a] && !p[t])///原本是质数,变成了合数
  142. seg.Update(b,-,,n,);
  143. else if(p[t+a] && p[t]) ;
  144. else if(!p[t+a] && !p[t]) ;
  145. }
  146. else
  147. {
  148. scanf("%d%d",&a,&b);
  149. printf("%d\n",seg.query(a,b,,n,));
  150. }
  151. }
  152. }
  153. return ;
  154. }

AC代码

ZOJ 3911 线段树的更多相关文章

  1. Prime Query (ZOJ 3911 线段树)

    Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a sequen ...

  2. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  3. ZOJ 3279-Ants(线段树)

    传送门:zoj 3279 Ants Ants Time Limit: 2 Seconds      Memory Limit: 32768 KB echo is a curious and cleve ...

  4. zoj 3888 线段树 ***

    卡n^2,用线段树降到nlogn 记录每个点上所覆盖线段的次小值,保证能有两条路径能走 #include<cstdio> #include<iostream> #include ...

  5. F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)

    题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树  但是没有push_up  最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段  思路是 ...

  6. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  7. HDU 1199 &amp;&amp; ZOJ 2301 线段树离散化

    一段长度未知的线段.一种操作:a b c ,表示区间[a,b]涂为颜色C,w代表白色,b代表黑色,问终于的最长连续白色段,输出起始位置和终止位置 离散化处理.和寻常的离散化不同,须要把点化成线段.左闭 ...

  8. zoj 2706 线段树

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1706 trick:关于正数和负数的整除问题,正数整除是自动向下取整的 ...

  9. ZOJ 3299 线段树 离散化

    本来是个很简单的题目,难住我的主要是这么几点 1.它所有的点都是坐标,不是实际的砖块,1,3指的是1-2 2-3的砖块...后来就是用1 代表1-2 ,2代表2-3.....,这样的话,每次读入的数据 ...

随机推荐

  1. jquery笔记之属性选择器 查找以某种条件开头的页面元素

    jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...

  2. jsessionid 导致重定向404的问题

    http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletResponse.html#encod ...

  3. C# 扩展类

    C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...

  4. Sql语句复习

    1.两张表A,B 其中A表中字段1,字段2,字段3要迁移到B表中字段4,字段5,字段6,迁移后B表的字段7 全赋值为123: insert into B(字段4,字段5,字段6,字段7) select ...

  5. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  6. 在Heroku上,安装Wordpress

    其實在 Heroku 上安裝 Wordpress 不會很難,不過閱讀之前,你可能先要知道 Heroku 與 git 的基本操作,建議可以先參考以下網站用 Heroku 架設 Wordpress 網站 ...

  7. 用php获取本周,上周,本月,上月,本季度日期的代码

    echo date("Ymd",strtotime("now")), "\n"; echo date("Ymd",str ...

  8. css 变量与javascript结合

    <div onClick="test('yellow')"> CSS Variable</div> ================CSS :root{ - ...

  9. [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】

    原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...

  10. 认识WCF

    WCF 一.什么是WCF? 1.Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口.它是.NET框 ...