zoukankan      html  css  js  c++  java
  • bzoj 3158: 千钧一发【最小割】

    这个条件非常妙啊,奇数和奇数一定满足1,因为( (2a+1)2+(2b+1)2=4a2+4a+4b2+4b+2=2(2(a2+a+b2+b)+1) )里面这个一定不是平方数因为除二后是个奇数不能再分一个2出来;偶数和偶数一定满足2,因为gcd>=2
    考虑最小割,先加上所有收益然后求割之后满足条件的最小代价
    所以对于a[i]&1,连接(s,i,b[i]),否则连接(i,t,b[i]),对于不能同时选的i,j来说,连(i,j),表示要么割掉i的收益要么割掉j的收益

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    using namespace std;
    const int N=2005;
    int n,a[N],b[N],h[N],cnt=1,le[N],s,t,ans;
    struct qwe
    {
        int ne,to,va;
    }e[N*N];
    int read()
    {
        int r=0,f=1;
        char p=getchar();
        while(p>'9'||p<'0')
        {
            if(p=='-')
                f=-1;
            p=getchar();
        }
        while(p>='0'&&p<='9')
        {
            r=r*10+p-48;
            p=getchar();
        }
        return r*f;
    }
    void add(int u,int v,int w)
    {
        cnt++;
        e[cnt].ne=h[u];
        e[cnt].to=v;
        e[cnt].va=w;
        h[u]=cnt;
    }
    void ins(int u,int v,int w)
    {
        add(u,v,w);
        add(v,u,0);
    }
    bool bfs()
    {
        memset(le,0,sizeof(le));
        queue<int>q;
        le[s]=1;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=h[u];i;i=e[i].ne)
                if(e[i].va>0&&!le[e[i].to])
                {
                    le[e[i].to]=le[u]+1;
                    q.push(e[i].to);
                }
        }
        return le[t];
    }
    int dfs(int u,int f)
    {
        if(u==t||!f)
            return f;
        int us=0;
        for(int i=h[u];i&&us<f;i=e[i].ne)
            if(e[i].va>0&&le[e[i].to]==le[u]+1)
            {
                int t=dfs(e[i].to,min(e[i].va,f-us));
                e[i].va-=t;
                e[i^1].va+=t;
                us+=t;
            }
        if(!us)
            le[u]=0;
        return us;
    }
    int dinic()
    {
        int r=0;
        while(bfs())
            r+=dfs(s,1e9);
        return r;
    }
    int gcd(int a,int b)
    {
        return !b?a:gcd(b,a%b);
    }
    long long clc(int a,int b)
    {
        return 1ll*a*a+1ll*b*b;
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
            a[i]=read();
        for(int i=1;i<=n;i++)
            b[i]=read();
        s=0,t=n+1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]&1)
                ins(s,i,b[i]);//,cerr<<i<<endl;
            else
                ins(i,t,b[i]);
            ans+=b[i];
        }
        for(int i=1;i<=n;i++)
            if(a[i]&1)
                for(int j=1;j<=n;j++)
                    if(!(a[j]&1)&&gcd(a[i],a[j])==1&&(long long)sqrt(clc(a[i],a[j]))*(long long)sqrt(clc(a[i],a[j]))==clc(a[i],a[j]))
                        ins(i,j,1e9);//,cerr<<i<<" "<<j<<endl;
        printf("%d
    ",ans-dinic());
        return 0;
    }
    
  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/lokiii/p/10769751.html
Copyright © 2011-2022 走看看