周六

啊啊啊啊啊,交了n遍第三题,就是不过,疯了;

先把代码贴一下 总算从tle变wa了(还真的不如我写的暴力分高)

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
#define ll long long
map<int,int>ma;
int rmq[30][100001];
int readin(){
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int gcd(int a,int b){
if(b==0)return a;
else return gcd(b,a%b);
}
//int a[100001];
int lg[100001];
int query(int l,int r){
    if(l>r) swap(l,r); 
        int x=lg[r-l+1]; 
        return gcd(rmq[x][l],rmq[x][r+1-(1<<x)]); 
}
void erfen(int l,int r,int i){
    if(r-l<=1){
        if(l==r){
        int x=query(i,r);
        ma[x]++;
        }
        else {
            int x=query(i,l);
            ma[x]++;
            int y=gcd(x,rmq[0][r]);
            ma[y]++;
        }
        return ;
    }
    int x=query(i,l),y=query(i,r);
    if(x==y){
    ma[x]+=(r-l+1);
       return ;
    }
    int mid=(l+r+1)>>1;
    int t=query(i,mid);
    if(t==1){
    ma[1]+=r-mid+1;
    erfen(l,mid-1,i);
    return ;}
    if(t==x){
        ma[x]+=(mid-l+1);
        erfen(mid+1,r,i);
        return ;
    }
    else if(t==y){
        ma[x]+=(r-mid+1);
        erfen(l,mid-1,i);
        return ;
    }
    else {
        erfen(mid+1,r,i);
        erfen(l,mid,i);
        return ;
    }
}
int main(){
    int n=readin();
   // ma[1]=0;
    for(int i=1;i<=n;i++){
        rmq[0][i]=readin();
    }
    for(int i=2;i<=n;i++) 
        lg[i]=lg[i>>1]+1; 
            
    for(int i=1;i<=lg[n];i++) 
        for(int j=1;j<=n+1-(1<<i);j++) 
            rmq[i][j]=gcd(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]); 
    for(int i=1;i<=n;i++){
        int l=i,r=n;
        erfen(l,r,i);
    }
    int m=readin();
    ll k;
    while(m--){
        k=readin();
        cout<<ma[k]<<endl;
    }
} 
View Code
原文地址:https://www.cnblogs.com/Amphetamine/p/7041324.html