Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
题目地址:http://codeforces.com/contest/474/problem/F
由题意可知,最后能够留下来的一定是区间最小gcd。
那就转化成了该区间内与区间最小gcd数相等的个数。区间最小gcd一定小于等于区间最小值。所以仅仅要先推断最小值是否是最小gcd。若是的话,就求出最小值的个数。然后用r-l+1-个数就可以。
对于以上信息。能够用线段树来维护。分别维护区间gcd,区间最小值以及区间最小值的个数。
代码例如以下:
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <cstring>
- #include <stdlib.h>
- #include <math.h>
- #include <ctype.h>
- #include <queue>
- #include <map>
- #include <set>
- #include <algorithm>
- using namespace std;
- #define LL __int64
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- const int INF=0x3f3f3f3f;
- const int MAXN=100000;
- int minv[MAXN<<2], gcd[MAXN<<2], num[MAXN<<2], q_minv, q_gcd, q_num;
- int getgcd(int a, int b)
- {
- return a==0?
- b:getgcd(b%a,a);
- }
- void PushUp(int rt)
- {
- minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
- gcd[rt]=getgcd(gcd[rt<<1],gcd[rt<<1|1]);
- if(minv[rt<<1]==minv[rt<<1|1])
- num[rt]=num[rt<<1]+num[rt<<1|1];
- else if(minv[rt<<1]>minv[rt<<1|1])
- num[rt]=num[rt<<1|1];
- else
- num[rt]=num[rt<<1];
- }
- void build(int l, int r, int rt)
- {
- if(l==r)
- {
- scanf("%d",&minv[rt]);
- num[rt]=1;
- gcd[rt]=minv[rt];
- return ;
- }
- int mid=l+r>>1;
- build(lson);
- build(rson);
- PushUp(rt);
- }
- void query(int ll, int rr, int l, int r, int rt)
- {
- if(ll<=l&&rr>=r)
- {
- q_gcd=getgcd(q_gcd,gcd[rt]);
- if(minv[rt]==q_minv)
- {
- q_num+=num[rt];
- }
- else if(minv[rt]<q_minv)
- {
- q_num=num[rt];
- q_minv=minv[rt];
- }
- return ;
- }
- int mid=l+r>>1;
- if(ll<=mid) query(ll, rr, lson);
- if(rr>mid) query(ll,rr,rson);
- }
- int main()
- {
- int n, m, i, l, r;
- scanf("%d",&n);
- build(1, n, 1);
- /*for(i=1;i<=9;i++)
- {
- printf("%d %d %d\n",minv[i], gcd[i], num[i]);
- }*/
- scanf("%d",&m);
- while(m--)
- {
- scanf("%d%d",&l,&r);
- q_minv=INF;
- q_gcd=0;
- q_num=0;
- query(l,r,1,n,1);
- if(q_gcd==q_minv)
- {
- printf("%d\n",r-l+1-q_num);
- }
- else
- {
- printf("%d\n",r-l+1);
- }
- }
- return 0;
- }
Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)的更多相关文章
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)
题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...
- 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 ...
- Codeforces Round #271 (Div. 2) F ,E, D, C, B, A
前言:最近被线段树+简单递推DP虐的体无完肤!真是弱! A:简单题,照着模拟就可以,题目还特意说不用处理边界 B:二分查找即可,用lower_lound()函数很好用 #include<stri ...
- Codeforces Round #552 (Div. 3) F题
题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...
- 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 ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- 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. 这题 ...
- Codeforces Round #310 (Div. 1) C. Case of Chocolate (线段树)
题目地址:传送门 这题尽管是DIV1的C. . 可是挺简单的. .仅仅要用线段树分别维护一下横着和竖着的值就能够了,先离散化再维护. 每次查找最大的最小值<=tmp的点,能够直接在线段树里搜,也 ...
随机推荐
- 移动端1px 边框完整方案(四个方向)
使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l 左右方向 t ...
- Java工具类之——BigDecimal运算封装(包含金额的计算方式)
日常对于金额计算,应该都是用的BigDecimal, 可是苦于没有好的工具类方法,现在贡献一个我正在用的对于数字计算的工具类,项目中就是用的这个,简单粗暴好用,话不多说,代码奉上(该工具类需要引入g ...
- js贪吃蛇-简单版
分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- .net中LAMBDA表达式常用写法
这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...
- C语言函数与程序结构
title : C语言函数与程序结构 tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义 grammar_cjkRuby: true --- 外部变量 变量声明用于说明变量 ...
- man ctags
ctags命令帮助 命令格式 ctags [options] [file(s)] 或 etags [options] [file(s)] 源文件参数 不同语言中对象的种 ...
- 基础5.jQuery常用事件
jQuery常用事件 1.bind() 方法 :为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 2.blur() 方法:当元素失去焦点时发生 blur 事件. 3.change() ...
- springboot之banner
1 在Main里面关闭 @SpringBootApplication@MapperScan("org.sselab.mapper")public class Application ...
- vpn服务器搭建
这里我们用CentOS6.0和Shdowsocks搭建 首先了解几个命令 wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP.HTTPS.FTP 三个最常见的 TCP/IP协议 下载, ...
- TensorFlow[1]:概念和简例
简介 TensorFlow是一个实现机器学习算法的接口,也是执行机器学习算法的框架.使用数据流式图规划计算流程,可以将计算映射到不同的硬件和操作系统平台. 主要概念 TensorFlow的计算可以表示 ...