标签:
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 681 Accepted Submission(s): 240
题意:
题解:
1 /****************************** 2 code by drizzle 3 blog: www.cnblogs.com/hsd-/ 4 ^ ^ ^ ^ 5 O O 6 ******************************/ 7 #include<bits/stdc++.h> 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<map> 12 #include<algorithm> 13 #include<queue> 14 #define LL __int64 15 #define pii pair<int,int> 16 #define MP make_pair 17 const int N=1000006; 18 using namespace std; 19 int gcd(int a,int b) 20 { 21 return b==0 ? a : gcd(b,a%b); 22 } 23 int n,q,a[N],ans[N]; 24 vector<pii> G[N]; 25 struct QQ{ 26 int l,r,id; 27 bool operator < (const QQ &a) const 28 { 29 return a.r>r; 30 } 31 }Q[N]; 32 int C[N],vis[N]; 33 void update (int x,int c) 34 { 35 for(int i=x;i<N;i+=i&(-i)) C[i]+=c; 36 } 37 int ask(int x) 38 { 39 int s=0; 40 for(int i=x;i;i-=i&(-i)) s+=C[i]; 41 return s; 42 } 43 int main() 44 { 45 while(scanf("%d %d",&n,&q)!=EOF) 46 { 47 for(int i=1;i<=n;i++) 48 scanf("%d",&a[i]); 49 for(int i=0;i<=n;i++) 50 G[i].clear(); 51 for(int i=1;i<=n;i++) 52 { 53 int x=a[i]; 54 int y=i; 55 for(int j=0;j<G[i-1].size();j++) 56 { 57 int res=gcd(x,G[i-1][j].first); 58 if(x!=res) 59 { 60 G[i].push_back(MP(x,y)); 61 x=res; 62 y=G[i-1][j].second; 63 } 64 } 65 G[i].push_back(MP(x,y)); 66 } 67 memset(C,0,sizeof(C)); 68 memset(vis,0,sizeof(vis)); 69 for(int i=1;i<=q;i++) 70 { 71 scanf("%d %d",&Q[i].l,&Q[i].r); 72 Q[i].id=i; 73 } 74 sort(Q+1,Q+q+1); 75 for(int R=0,i=1;i<=q;i++) 76 { 77 while(R<Q[i].r) 78 { 79 R++; 80 for(int j=0;j<G[R].size();j++) 81 { 82 int res=G[R][j].first; 83 int ids=G[R][j].second; 84 if(vis[res]) 85 update(vis[res],-1); 86 vis[res]=ids; 87 update(vis[res],1); 88 } 89 } 90 ans[Q[i].id]=ask(R)-ask(Q[i].l-1); 91 } 92 for(int i=1;i<=q;i++) 93 cout<<ans[i]<<endl; 94 } 95 return 0; 96 }
2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869
标签:
原文地址:http://www.cnblogs.com/hsd-/p/5866925.html