Codeforces Round #271 (Div. 2) F Ant colony
来源:互联网 发布:怎么安装spss13软件 编辑:程序博客网 时间:2024/05/21 09:43
【题意】
给了n个数,然后给了m个查询,每个查询有个左区间l和右区间r。在这个区间里求出每一个数能别其他多少个数整除。如果,这个个数是r-l这个数就会被删除,要求个各区间里面不被删除的数的个数!
【解题方法】
如果区间[l,r]内所有数的gcd!=该区间内最小的数minv,则对于区间内的每个数都至少有一个数不是其倍数,那么每个数的v值都不可能等于r-l,所以所有的蚂蚁都要被吃掉(统统吃掉),答案是r-l+1。现在如果gcd=minv,那么对于所有的等于minv的数,所有的数都是他的倍数,对于所有的不等于minv的数,至少有一个不是他的倍数(比如minv),所以答案就是r-l+1-minv的个数。
【AC code】
//CF.271 F//Ant colony#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=1e5+5;const int inf=1e9+10;struct node{ int l,r; int minn,num,gc;//维护区间的最小值,最小值的个数,区间的最大公约数}Tree[maxn<<2];int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}void PushUp(int rt){ Tree[rt].gc=gcd(Tree[rt*2].gc,Tree[rt*2+1].gc);}void Build(int l,int r,int rt){ Tree[rt].l=l,Tree[rt].r=r; if(l==r) { scanf("%d",&Tree[rt].minn); Tree[rt].num=1; Tree[rt].gc=Tree[rt].minn; return ; } int mid=(l+r)/2; Build(l,mid,rt*2); Build(mid+1,r,rt*2+1); if(Tree[rt*2].minn<Tree[rt*2+1].minn) { Tree[rt].minn=Tree[rt*2].minn; Tree[rt].num=Tree[rt*2].num; } else if(Tree[rt*2].minn>Tree[rt*2+1].minn) { Tree[rt].minn=Tree[rt*2+1].minn; Tree[rt].num=Tree[rt*2+1].num; } else { Tree[rt].minn=Tree[rt*2].minn; Tree[rt].num=Tree[rt*2].num+Tree[rt*2+1].num; } PushUp(rt);}int minv,minnum,mingcd;//记录[l,r]区间的答案void queryans(int L,int R,int rt){ if(L<=Tree[rt].l&&Tree[rt].r<=R) { if(minv>Tree[rt].minn) { minv=Tree[rt].minn; minnum=Tree[rt].num; } else if(minv==Tree[rt].minn) {// minv=Tree[rt].minn; minnum+=Tree[rt].num; } mingcd=gcd(mingcd,Tree[rt].gc); return ; } int mid=(Tree[rt].l+Tree[rt].r)/2; if(L<=mid) queryans(L,R,rt*2); if(mid<R) queryans(L,R,rt*2+1);}int main(){ int n; cin>>n; Build(1,n,1); //puts("success!"); int t,l,r; cin>>t; while(t--) { cin>>l>>r; minv=inf; minnum=0; mingcd=0; queryans(l,r,1); //cout<<minv<<" "<<mingcd<<" "<<minnum<<endl; if(mingcd==minv) { cout<<r-l+1-minnum<<endl; } else { cout<<r-l+1<<endl; } }}
0 0
- Codeforces Round #271 (Div. 2)F. Ant colony(线段树)
- Codeforces Round #271 (Div. 2) F. Ant colony(线段树)
- Codeforces Round #271 (Div. 2) F Ant colony
- F. Ant colony(Codeforces Round #271)
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树求区间gcd)
- Codeforces Round #271 (Div. 2) F - Ant colony 线段树 + GCD
- 【CODEFORCES】 F. Ant colony
- 【Codeforces Round 271 (Div 2)F】【贪心 线段树】Ant colony 区间段内是其他所有数因子的数的个数
- Codeforces 474 F. Ant colony
- codeforces 474F Ant colony(线段树)
- codeforces 474F F. Ant colony(线段树+数论)
- codeforces 474F F. Ant colony(线段树+数论)
- CodeForces 474F Ant colony(线段树)
- CodeForces 474F Ant colony 【线段树】【gcd】【二分】
- Codeforces Round #271 (Div. 2) F 线段树+pair
- Codeforces Round #277.5 (Div. 2) F
- Codeforces Round #279 (Div. 2) F
- JAVA 面向对象 类和对象
- 初始JavaScript
- 《linux学习》之新建用户无法登陆问题
- Spark Checkpoint读操作代码分析
- Base64编码及其作用
- Codeforces Round #271 (Div. 2) F Ant colony
- StarUML软件设计建模工具破解
- 8086汇编语言 R命令更改寄存器的内容
- poj-1222 高斯消元
- python学习——分布式进程
- 355-Design Twitter
- 一个简单代码的不简单实现
- 中软实训随记
- for循环语句