• 周六


    啊啊啊啊啊,交了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
  • 相关阅读:
    Md5密码加密
    Java Email 发送
    java 对象的修改
    修改表内部分字段根据查询而来 update select from
    转载:MySQL join on +多条件与where的区别
    反射机制
    转载-Java Nio
    Java 中的static
    springMVC的请求流程
    myEclipse 中的svn图标详解
  • 原文地址:https://www.cnblogs.com/Amphetamine/p/7041324.html
Copyright © 2020-2023  润新知