• 值得纪念的测试43


    记42场考试后终于迎来的rank1,

    与大翻盘。(一夜翻身做主人)

    长风搏空,远洋浪劲。

    革命远未成功,同志仍需努力。

    (只是简单题打得好。。。)

    #include<bits/stdc++.h>
    #define F(i,a,b) for(rg int i=a;i<=b;++i)
    #define rg register
    #define LL long long
    #define il inline
    #define pf(a) printf("%lld ",a)
    #define phn puts("")
    using namespace std;
    /*
    1、部分分2、调试信息
    */
    #define int LL
    int S,T,a,b;
    int B[80],top;
    signed main(){
        scanf("%lld%lld%lld%lld",&S,&T,&a,&b);
        B[0]=1;
        for(int i=1;T/b>=B[i-1];++i){
            B[i]=B[i-1]*b; top=i;
        }
        rg int ans=0x3f3f3f3f3f3f3f,w=0,x;    
        for(int i=0;T/S>=B[i]&&i<=top;++i){
            w=i;
            x=T-S*B[i];
            if(x%a)continue;
            x/=a;
            for(int j=i;~j;--j){
                int t=x/B[j];
                w+=t;
                x-=t*B[j];
            }
            if(x)continue;
            ans=min(ans,w);
        }
        printf("%lld
    ",ans);
    }
    /*
    g++ 1.cpp -g
    ./a.out
    3 10000000000 4 2
    */
    View Code
    #include<bits/stdc++.h>
    #define F(i,a,b) for(rg int i=a;i<=b;++i)
    #define rg register
    #define LL long long
    #define il inline
    #define pf(a) printf("%d ",a)
    #define PF(a) printf("%lld ",a)
    #define phn puts("")
    using namespace std;
    /*
    错因:
    1:f数组没清0.转移后f[now][]=0;
    2:筛约数要判i!=P/i
    */
    const int mod=1e9+7;
    int n,m,P;
    LL f[2][5001];
    int yue[5005],top,ou[5005],inv[5005];
    int G_ou[5005],G_inv[5005];
    int a[2002][2002];
    il void MO(LL &x){while(x>=mod)x-=mod;}
    il LL qpow(LL x,int k){LL s=1;for(;k;x=x*x%mod,k>>=1)if(k&1)s=s*x%mod;return s;}
    map<int,int>mp;
    il void work(int r){
        int x=yue[r],ans=x;
        for(int i=2;i*i<=x;++i){
            if(x%i==0){
                ans-=ans/i;
                while(x%i==0)x/=i;
            }
        }
        if(x>1){
            ans-=ans/x;
        }
        ou[r]=ans;
        inv[r]=qpow(ou[r],mod-2);
    }
    il LL gcd(LL a,LL b){return b==0?a:gcd(b,a%b);}
    int main(){
        scanf("%d%d%d",&n,&m,&P);
        int ed=sqrt(P);
        F(i,1,ed){
            if(P%i==0){
                yue[++top]=i;
                if(i*i!=P)yue[++top]=P/i;
            }
        }
        sort(yue+1,yue+top+1);
        F(i,1,top)mp[yue[i]]=i;
        F(i,1,top){
            work(i);
        }    
        F(i,1,top){
            G_ou[i]=ou[mp[P/yue[i]]];
            G_inv[i]=inv[mp[P/yue[i]]];
        }
        F(i,1,top){
            F(j,1,top){
                a[i][j]=gcd(1ll*yue[i]*yue[j],P);
                a[i][j]=lower_bound(yue+1,yue+top+1,a[i][j])-yue;
        //        pf(a[i][j]);
            }
        //    phn;
        }
        F(i,1,top)f[1][i]=1;
        rg int now=1;
        F(i,1,n-1){
            now=i&1;
            F(j,1,top){
            F(k,1,top){
                (f[!now][a[j][k]]+=f[now][j]*G_ou[j]%mod*G_ou[k]%mod*G_inv[a[j][k]]%mod)%=mod;
            }
            f[now][j]=0;
            }
        }
        now=n&1;
    //    F(i,1,top)PF(f[now][i]);phn;
        int x,t;
        F(i,1,m){
            scanf("%d",&x);
            if(x==0)x=P;
            t=lower_bound(yue+1,yue+top+1,gcd(x,P))-yue;
            PF(f[now][t]);
        }
        phn;
    }
    /*
    g++ 2.cpp -g
    ./a.out
    10 4 24
    0 1 2 3
    
    g++ 5.cpp -g
    ./a.out
    10 4 24
    0 1 2 3
    */
    View Code
    #include<bits/stdc++.h>
    #define F(i,a,b) for(rg int i=a;i<=b;++i)
    #define rg register
    #define LL long long
    #define il inline
    #define PF(a) printf("%lld ",a)
    #define pf(a) printf("%d ",a)
    #define phn puts("")
    using namespace std;
    #define int LL
    #define N 100010
    int n,m,K;
    LL ans=1e15;
    int a[N],b[N];
    struct node{
        int l,r;
        friend bool operator < (const node &x,const node &y){return x.l<y.l;}
    }s[N];
    int cf[N];
    il LL jud(LL o){
    //    memset(cf,0,sizeof(cf));
        LL mx=0,w=0,sum=o;
        F(i,1,n){
            sum+=cf[i]; cf[i]=0;
            if(a[i]>sum){
                if(b[i]>=i){
                    int u=a[i]-sum;
                    sum+=u;cf[b[i]+1]-=u;
                    w+=u;
                }
                else{
                    mx=max(mx,a[i]-sum);
                }
            }
        }
        cf[n+1]=0;
        w+=(o+mx)*K;
        ans=min(ans,w);
        return w;
    }
    signed main(){
    //    freopen("1.in","r",stdin);
        scanf("%lld%lld%lld",&n,&m,&K);
        F(i,1,n){
            scanf("%lld",&a[i]);
        }
        rg int l,r;
        F(i,1,m){
            scanf("%lld%lld",&l,&r);
            s[i]=(node){l,r};
        }
        sort(s+1,s+m+1);
        rg int p=0,mx=0;
        F(i,1,n){
            while(p<m&&s[p+1].l<=i)mx=max(mx,s[++p].r);
            b[i]=mx;
        }
        l=0;r=1e7+5;
        int mida,midb,midc;
        ans=1e15;
        while(l<r-2){
            mida=l+(r-l)/3;midb=r-(r-l)/3;
            LL wa=jud(mida),wb=jud(midb);
        //    pf(mida);pf(midb);PF(wa);PF(wb);phn;//
            if(wa<wb)r=midb;
            else l=mida;
        }
        F(i,l,r)jud(i);
        printf("%lld
    ",ans);
        
    }
    /*
    g++ 3.cpp -g
    ./a.out
    3 3 2
    4 12 5
    2 2
    2 2
    2 2
    */
    View Code

    T2一些代码实现比较好,要看看。 

    T1:写十字狮子。

    T2:打表,发现规律。

    T3:何时贪心。

    注:三分写法:

    while(l<r-2){
            mida=l+(r-l)/3;midb=r-(r-l)/3;
            LL wa=jud(mida),wb=jud(midb);
        //    pf(mida);pf(midb);PF(wa);PF(wb);phn;//
            if(wa<wb)r=midb;
            else l=mida;

    }

    F(i,l,r)jud(i);

    T1:数据范围1e18,应该是随便搞一搞。

      写狮子。

    T=S*b^x+a*sigma(b^i);

    b^i预处理,

    log枚举x,log计算有几个b^i。

    是B进制思想。

    当左边已确定时,右边也可以确定。

    两个细节:

    1、i<=x。

    (狮子要写变量范围)

    2、一个地方while()-=x要写成除法-=A/x*x。否则凭空变慢。

    T2:

    考试只会暴力n*p^2DP。

    最后半小时基本没得分,刚T2不会写,

    zj;

    打表,发现很多项DP值一样,且与P因数越多(gcd越大)DP值越大。

    但是考试不会用,没更进一步思考。

    其实不远了。要去大胆猜测。

    取模意义下只关注有几个质因子与P相同。(即gcd)

    f[i][j],j与P的GCD相同时,f相同。

    p^2的DP可优化为(约数个数)^2

    1e9内约数个数最大1344

    质因子个数超过时与P取min。

    实际上是取gcd.

     因为是取mod意义下,打表去找关注什么,

    在取模意义下, 非约数的部分是等效且不关注的。

    感性理解,我也没理解透彻。

    转移狮子:

    j*k转移到t

    f[i+1][t]+=f[i][j]*ou(P/j)*ou(P/k)*(1/ou(P/t));

    f含义是单点的。

    系数:两个ou是gcd同为j/k的个数。因为转以后要平分到ou(P/t)个上去,所以要除。

    T2一些代码实现比较好。

    T3:

    序列题,区间操作。

    类似前两天一道贪心。

    本题差不多。贪心最右端点不会变差。

    类比之前一道广义差分,那个是异或,区间变单点。

    这题区间用不上,但是差分用上了。

    (大神们用线段树、树状数组做了{一个变量、一个差分数组}构成的差分能做的事。)

    尽量简单化,不要复杂化。简单操作胜过复杂结构。

    t那个特殊的,f(使用次数)的函数是单谷的。可以三分。

    函数的观察、研究。

    然后就三分套贪心了。

    T0:

    (遇到简单题,一道随便搞一道贪心,只有T2挺难还不会打的暴力然后就rank1了。。。稍水。。。)

    考试写了T1T3正解,T2不会只写了暴力。

    结果T3数据出锅,全场最高40,

    预估240实际180

    然额并列rank1了。。。(但我罚时少啊,快结束一直纠结要不要再交一个,想想算了,于是救了我罚时)

    1、考前英语课剧困,怕奥赛考试犯困,写了半张卷子,然后睡了不到半截课。

    为考试准备了精力(论准备工作)

    录卡借的OOO大神的(所以rank1要感谢OOO)

    (然额英语作业分数比OOO大神还高)

    (然额英语作业还是班rank14)

    2、考后:拿到测试点后,大家改完的代码第一个点都一样,都错了,而且比答案小!大脸打完也是。

    我们就怀疑数据错了。靠kx的对拍发现果然错了!

    重测以后。。。顺利从180升到240了(第一还是并列的)

    3、记第一次上台主持考后分享。

  • 相关阅读:
    Integer vs int
    j2ee gradle构建
    ubuntu16.04更新node.js
    阿里云centos7服务器
    使用jdbc给一张表增加多行字段
    安装mysql后,java使用jdbc连接mysql数据库
    关于异常try{}catch(){}
    计算机基础单位
    java mongodb 增删改查 工具类
    java 操作mongodb查询条件的常用设置
  • 原文地址:https://www.cnblogs.com/seamtn/p/11524018.html
Copyright © 2020-2023  润新知