HDU 5726 区间GCD=k的个数
2017-03-18 09:31
363 查看
不知为何改了了ll就过了 感觉Int应该不会有问题才对
做了两道区间GCD的 也算有点收获#include <bits/stdc++.h>
#define N 101000
#define FREI freopen("in.txt","r",stdin)
#define FREO freopen("out.txt","w",stdout)
#define Mem(a,b) memset(a,b,sizeof(a))
#define lson root<<1
#define rson root<<1|1
#define Mid int mid=(l+r)>>1
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
typedef pair<ll,ll> Pair;
int n,m;
ll a
;
map<ll,ll> f;
vector<Pair> v
;
ll GCD[N<<2];
void build(int root,int l,int r){
if(l==r){
GCD[root]=a[l];
return ;
}
Mid;
build(lson,l,mid);
build(rson,mid+1,r);
GCD[root]=__gcd(GCD[lson],GCD[rson]);
}
ll query(int root,int l,int r,int ql,int qr) {
ll res=0;
if(l>qr||r<ql)
return 0;
if(l>=ql&&r<=qr) {
return GCD[root];
}
Mid;
res=__gcd(res,query(lson,l,mid,ql,qr));
res=__gcd(res,query(rson,mid+1,r,ql,qr));
return res;
}
inline void yingshe(ll tmp) {
if(!f.count(tmp)) {
f[tmp]=0;
}
}
inline void Count(ll tmp,ll num){
f[tmp]+=num;
}
int main() {
#ifndef ONLINE_JUDGE
FREI;
//FREO;
#endif // ONLINE_JUDGE
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++) {
scanf("%d",&n);
f.clear();
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
v[i].clear();
}
build(1,1,n);
for(int i=1; i<=n; i++) {
v[i].push_back(make_pair(a[i],i));
ll tmp=a[i],r=i;
yingshe(tmp);
for(int j=0; j<v[i-1].size(); j++) {
ll gcd=__gcd(tmp,v[i-1][j].first);
if(gcd!=tmp) {
yingshe(gcd);
Count(tmp,r-v[i-1][j].second);
v[i].push_back(make_pair(gcd,v[i-1][j].second));
tmp=gcd;
r=v[i-1][j].second;
}
}
Count(tmp,r);
}
scanf("%d",&m);
printf("Case #%d:\n",cas);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
ll ans=query(1,1,n,l,r);
printf("%lld %lld\n",ans,f[ans]);
}
}
}
做了两道区间GCD的 也算有点收获#include <bits/stdc++.h>
#define N 101000
#define FREI freopen("in.txt","r",stdin)
#define FREO freopen("out.txt","w",stdout)
#define Mem(a,b) memset(a,b,sizeof(a))
#define lson root<<1
#define rson root<<1|1
#define Mid int mid=(l+r)>>1
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
typedef pair<ll,ll> Pair;
int n,m;
ll a
;
map<ll,ll> f;
vector<Pair> v
;
ll GCD[N<<2];
void build(int root,int l,int r){
if(l==r){
GCD[root]=a[l];
return ;
}
Mid;
build(lson,l,mid);
build(rson,mid+1,r);
GCD[root]=__gcd(GCD[lson],GCD[rson]);
}
ll query(int root,int l,int r,int ql,int qr) {
ll res=0;
if(l>qr||r<ql)
return 0;
if(l>=ql&&r<=qr) {
return GCD[root];
}
Mid;
res=__gcd(res,query(lson,l,mid,ql,qr));
res=__gcd(res,query(rson,mid+1,r,ql,qr));
return res;
}
inline void yingshe(ll tmp) {
if(!f.count(tmp)) {
f[tmp]=0;
}
}
inline void Count(ll tmp,ll num){
f[tmp]+=num;
}
int main() {
#ifndef ONLINE_JUDGE
FREI;
//FREO;
#endif // ONLINE_JUDGE
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++) {
scanf("%d",&n);
f.clear();
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
v[i].clear();
}
build(1,1,n);
for(int i=1; i<=n; i++) {
v[i].push_back(make_pair(a[i],i));
ll tmp=a[i],r=i;
yingshe(tmp);
for(int j=0; j<v[i-1].size(); j++) {
ll gcd=__gcd(tmp,v[i-1][j].first);
if(gcd!=tmp) {
yingshe(gcd);
Count(tmp,r-v[i-1][j].second);
v[i].push_back(make_pair(gcd,v[i-1][j].second));
tmp=gcd;
r=v[i-1][j].second;
}
}
Count(tmp,r);
}
scanf("%d",&m);
printf("Case #%d:\n",cas);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
ll ans=query(1,1,n,l,r);
printf("%lld %lld\n",ans,f[ans]);
}
}
}
相关文章推荐
- HDU 5726 GCD 【区间GCD + 暴力预处理】
- HDU 5726 GCD 区间gcd查询 MAP RMQ 优化
- HDU 5726 GCD (线段树维护区间gcd)
- hdu_5726_GCD(线段树维护区间+预处理)
- hdu_5726_GCD(线段树维护区间+预处理)
- hdu 5726 GCD (线段树 + 区间预处理)
- HDU 5726 GCD (rmq+二分 or 线段树 维护区间gcd)
- hdu 5726 GCD (区间RMQ )
- HDU 5726 求gcd=k的区间的个数 (二分+RMQ)
- hdu 5726 区间gcd RMQ+二分 || 暴力枚举
- HDU 5726 GCD 区间GCD=k的个数
- Hdu 5726 GCD【思维+二分+区间Gcd】好题!
- hdu 5726 GCD (区间gcd-RMQ)
- hdu 5726(区间gcd)
- Hdu-5869 Different GCD Subarray Query(区间不同值离线算法)
- 【HDU 5726】GCD(映射+RMQ)
- hdu 5726 GCD RMQ+二分枚举
- 莫队算法 区间Gcd Hdu 5381
- HDU 5726 GCD [RMQ+二分]
- HDU 5869 求区间中不同连续序列的gcd的个数(树状数组)