• Codeforces Round #407 (Div. 1)


    人傻不会B 写了C正解结果因为数组开小最后RE了 疯狂掉分

    AC:A Rank:392 Rating: 2191-92->2099

    A. Functions again

    题目大意:给定一个长度为n的数组,求最大的,其中1<=l<r<=n。(n<=10^5)

    思路:按左端点所在位置的奇偶性分开计算即可。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define ll long long
    char B[1<<26],*S=B,C;int X,F;
    inline int read()
    {
        for(F=1;(C=*S++)<'0'||C>'9';)if(C=='-')F=-1;
        for(X=C-'0';(C=*S++)>='0'&&C<='9';)X=(X<<3)+(X<<1)+C-'0';
        return X*F;
    }
    #define MN 200000
    int a[MN+5];
    ll s[MN+5];
    int main()
    {
        fread(B,1,1<<26,stdin);
        int n=read(),i,p;long long mx=0,mn;
        for(i=1;i<=n;++i)a[i]=read();
        for(mn=0,i=p=1;i<n;++i,p*=-1)
        {
            s[i]=s[i-1]+abs(a[i+1]-a[i])*p;
            mx=max(mx,s[i]-mn);
            if(~i&1)mn=min(mn,s[i]);
        }
        for(mn=0,i=1,p=-1;i<n;++i,p*=-1)
        {
            s[i]=s[i-1]+abs(a[i+1]-a[i])*p;
            mx=max(mx,s[i]-mn);
            if(i&1)mn=min(mn,s[i]);
        }
        printf("%I64d",mx);
    }

    B. Weird journey

    题目大意:给定一张n个点m条边的无向图,无重边,有自环,问有多少对边满足有路径有且只经过这两条边一次,且经过其他m-2条边两次。(n,m<=10^6)

    思路:分类讨论+大判断。先判连通性,答案为相邻的非自环边对数+自环边数*非自环边数+自环边对数。

    #include<cstdio>
    char B[1<<26],*S=B,C;int X;
    inline int read()
    {
        while((C=*S++)<'0'||C>'9');
        for(X=C-'0';(C=*S++)>='0'&&C<='9';)X=(X<<3)+(X<<1)+C-'0';
        return X;
    }
    #define MN 1000000
    int f[MN+5],r[MN+5],u[MN+5];
    int gf(int k){return f[k]?f[k]=gf(f[k]):k;}
    int main()
    {
        fread(B,1,1<<26,stdin);
        int n,m,x,y,i,cnt=1,s=0;long long ans=0;
        n=read();m=read();
        for(i=1;i<=m;++i)
        {
            x=read();y=read();
            if(x==y)++s,u[x]=1;
            else ++r[x],++r[y];
            if(gf(x)!=gf(y))++cnt,f[gf(x)]=gf(y);
        }
        for(i=1;i<=n;++i)if(!u[i]&&!r[i])++cnt;
        if(cnt<n)return 0*puts("0");
        for(i=1;i<=n;++i)ans+=1LL*r[i]*(r[i]-1)>>1;
        ans+=1LL*s*(m-s)+(1LL*s*(s-1)>>1);
        printf("%I64d",ans);
    }

    C. The Great Mixing

    题目大意:k种可乐,每种浓度为ai/1000,每种取出任意自然数份混合在一起,问混合出浓度为n/1000的可乐至少要几份。(0<=n,ai<=1000,k<=10^6)

    思路:先把所有ai减去n,问题转化为选出的和为0至少选几个,如果都小于0或都大于0则无解,否则容易证明答案至多为O(n)(若ai<0,aj>0,则ai*aj+aj*(-ai)=0),bfs搜出和为x至少要几步,可以很快算出答案。

    #include<cstdio>
    char B[1<<26],*S=B,C;int X;
    inline int read()
    {
        while((C=*S++)<'0'||C>'9');
        for(X=C-'0';(C=*S++)>='0'&&C<='9';)X=(X<<3)+(X<<1)+C-'0';
        return X;
    }
    #define MN 1000
    #define MX 1000000
    int u[MN*2+5],t[MN+5],tn,d[MX*2+5],q[MX*2+5],qn;
    int main()
    {
        fread(B,1,1<<26,stdin);
        int n,k,i,j,x,o1=1,o2=1;
        n=read();k=read();
        for(i=1;i<=k;++i)
        {
            if(!(x=read()-n))return 0*puts("1");
            if(x<0)o1=0;
            if(x>0)o2=0;
            if(!u[x+MN])u[x+MN]=1,t[++tn]=x;
        }
        if(o1||o2)return 0*puts("-1");
        for(i=1;i<=tn;++i)d[q[++qn]=t[i]+MX]=1;
        for(i=1;i<=qn;++i)
        {
            if(q[i]==MX)return 0*printf("%d",d[MX]);
            for(j=1;j<=tn;++j)
            {
                x=q[i]+t[j];
                if(x<0||x>MX*2||d[x])continue;
                d[q[++qn]=x]=d[q[i]]+1;
            }
        }
    }
  • 相关阅读:
    C++基础--if/else和switch/case的区别
    条件概率,联合概率,边缘概率及独立事件,古典概型
    Maven中的Archetype概念及作用用途
    Unable to execute 'doFinal' with cipher instance
    查看是否存在tomcat进程和关闭方法
    python中的‘’的作用
    sklearn中predict_proba()的用法例子(转)
    pandas.DataFrame.sample随机抽样
    最全的MonkeyRunner自动化测试从入门到精通(1)
    阿里创新自动化测试工具平台--Doom
  • 原文地址:https://www.cnblogs.com/ditoly/p/CF407.html
Copyright © 2020-2023  润新知