题目地址:http://codeforces.com/contest/474/problem/F

由题意可知,最后能够留下来的一定是区间最小gcd。

那就转化成了该区间内与区间最小gcd数相等的个数。区间最小gcd一定小于等于区间最小值。所以仅仅要先推断最小值是否是最小gcd。若是的话,就求出最小值的个数。然后用r-l+1-个数就可以。

对于以上信息。能够用线段树来维护。分别维护区间gcd,区间最小值以及区间最小值的个数。

代码例如以下:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstring>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <ctype.h>
  8. #include <queue>
  9. #include <map>
  10. #include <set>
  11. #include <algorithm>
  12.  
  13. using namespace std;
  14. #define LL __int64
  15. #define lson l, mid, rt<<1
  16. #define rson mid+1, r, rt<<1|1
  17. const int INF=0x3f3f3f3f;
  18. const int MAXN=100000;
  19. int minv[MAXN<<2], gcd[MAXN<<2], num[MAXN<<2], q_minv, q_gcd, q_num;
  20. int getgcd(int a, int b)
  21. {
  22. return a==0?
  23.  
  24. b:getgcd(b%a,a);
  25. }
  26. void PushUp(int rt)
  27. {
  28. minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
  29. gcd[rt]=getgcd(gcd[rt<<1],gcd[rt<<1|1]);
  30. if(minv[rt<<1]==minv[rt<<1|1])
  31. num[rt]=num[rt<<1]+num[rt<<1|1];
  32. else if(minv[rt<<1]>minv[rt<<1|1])
  33. num[rt]=num[rt<<1|1];
  34. else
  35. num[rt]=num[rt<<1];
  36. }
  37. void build(int l, int r, int rt)
  38. {
  39. if(l==r)
  40. {
  41. scanf("%d",&minv[rt]);
  42. num[rt]=1;
  43. gcd[rt]=minv[rt];
  44. return ;
  45. }
  46. int mid=l+r>>1;
  47. build(lson);
  48. build(rson);
  49. PushUp(rt);
  50. }
  51. void query(int ll, int rr, int l, int r, int rt)
  52. {
  53. if(ll<=l&&rr>=r)
  54. {
  55. q_gcd=getgcd(q_gcd,gcd[rt]);
  56. if(minv[rt]==q_minv)
  57. {
  58. q_num+=num[rt];
  59. }
  60. else if(minv[rt]<q_minv)
  61. {
  62. q_num=num[rt];
  63. q_minv=minv[rt];
  64. }
  65. return ;
  66. }
  67. int mid=l+r>>1;
  68. if(ll<=mid) query(ll, rr, lson);
  69. if(rr>mid) query(ll,rr,rson);
  70. }
  71. int main()
  72. {
  73. int n, m, i, l, r;
  74. scanf("%d",&n);
  75. build(1, n, 1);
  76. /*for(i=1;i<=9;i++)
  77. {
  78. printf("%d %d %d\n",minv[i], gcd[i], num[i]);
  79. }*/
  80. scanf("%d",&m);
  81. while(m--)
  82. {
  83. scanf("%d%d",&l,&r);
  84. q_minv=INF;
  85. q_gcd=0;
  86. q_num=0;
  87. query(l,r,1,n,1);
  88. if(q_gcd==q_minv)
  89. {
  90. printf("%d\n",r-l+1-q_num);
  91. }
  92. else
  93. {
  94. printf("%d\n",r-l+1);
  95. }
  96. }
  97. return 0;
  98. }

Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)的更多相关文章

  1. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  2. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

  3. Codeforces Round #271 (Div. 2) F. Ant colony 线段树

    F. Ant colony time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. Codeforces Round #271 (Div. 2) F ,E, D, C, B, A

    前言:最近被线段树+简单递推DP虐的体无完肤!真是弱! A:简单题,照着模拟就可以,题目还特意说不用处理边界 B:二分查找即可,用lower_lound()函数很好用 #include<stri ...

  5. Codeforces Round #552 (Div. 3) F题

    题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...

  6. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  7. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  8. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  9. Codeforces Round #310 (Div. 1) C. Case of Chocolate (线段树)

    题目地址:传送门 这题尽管是DIV1的C. . 可是挺简单的. .仅仅要用线段树分别维护一下横着和竖着的值就能够了,先离散化再维护. 每次查找最大的最小值<=tmp的点,能够直接在线段树里搜,也 ...

随机推荐

  1. 移动端1px 边框完整方案(四个方向)

    使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l  左右方向 t ...

  2. Java工具类之——BigDecimal运算封装(包含金额的计算方式)

    日常对于金额计算,应该都是用的BigDecimal,  可是苦于没有好的工具类方法,现在贡献一个我正在用的对于数字计算的工具类,项目中就是用的这个,简单粗暴好用,话不多说,代码奉上(该工具类需要引入g ...

  3. js贪吃蛇-简单版

    分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  4. .net中LAMBDA表达式常用写法

    这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...

  5. C语言函数与程序结构

    title : C语言函数与程序结构 tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义 grammar_cjkRuby: true --- 外部变量 变量声明用于说明变量 ...

  6. man ctags

    ctags命令帮助   命令格式     ctags [options] [file(s)] 或     etags [options] [file(s)]   源文件参数     不同语言中对象的种 ...

  7. 基础5.jQuery常用事件

    jQuery常用事件 1.bind() 方法 :为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 2.blur() 方法:当元素失去焦点时发生 blur 事件. 3.change() ...

  8. springboot之banner

    1 在Main里面关闭 @SpringBootApplication@MapperScan("org.sselab.mapper")public class Application ...

  9. vpn服务器搭建

    这里我们用CentOS6.0和Shdowsocks搭建 首先了解几个命令 wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP.HTTPS.FTP 三个最常见的 TCP/IP协议 下载, ...

  10. TensorFlow[1]:概念和简例

    简介 TensorFlow是一个实现机器学习算法的接口,也是执行机器学习算法的框架.使用数据流式图规划计算流程,可以将计算映射到不同的硬件和操作系统平台. 主要概念 TensorFlow的计算可以表示 ...