• CF1146G Zoning Restrictions


    CF1146G Zoning Restrictions 

    网络流

    h<=50?

    直接都选择最大的,ans=n*h*h

    最小割

    考虑舍弃或者罚款

    有一个>x就要罚款?

    经典取值限制的模型:切糕割!

    每个位置的x+1到额外点tot连接inf边

    tot向t连接c边

    大概这样:

    #include<bits/stdc++.h>
    #define reg register int
    #define il inline
    #define fi first
    #define se second
    #define mk(a,b) make_pair(a,b)
    #define numb (ch^'0')
    #define pb push_back
    #define solid const auto &
    #define enter cout<<endl
    #define pii pair<int,int>
    using namespace std;
    typedef long long ll;
    template<class T>il void rd(T &x){
        char ch;x=0;bool fl=false;
        while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
        for(x=numb;isdigit(ch=getchar());x=x*10+numb);
        (fl==true)&&(x=-x);
    }
    template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
    template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
    template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('
    ');}
    
    namespace Miracle{
    const int N=55;
    const int P=N*N;
    const int inf=0x3f3f3f3f;
    int n,m,h;
    int s,t;
    struct node{
        int nxt,to;
        int w;
    }e[2*(P+P+N*N)];
    int hd[P],cnt=1;
    void add(int x,int y,int z){
        e[++cnt].nxt=hd[x];
        e[cnt].to=y;e[cnt].w=z;
        hd[x]=cnt;
    
        e[++cnt].nxt=hd[y];
        e[cnt].to=x;e[cnt].w=0;
        hd[y]=cnt;
    }
    int d[P];
    int q[P],l,r;
    int ans;
    int dfs(int x,int flow){
        int res=flow;
        if(x==t) return flow;
        for(reg i=hd[x];i&&res;i=e[i].nxt){
            int y=e[i].to;
            if(d[y]==d[x]+1&&e[i].w){
                int k=dfs(y,min(res,e[i].w));
                if(!k) d[y]=0;
                res-=k;
                e[i].w-=k;
                e[i^1].w+=k;
            }   
        }
        return flow-res;
    }
    bool bfs(){
        memset(d,0,sizeof d);
        l=1,r=0;
        q[++r]=s;
        d[s]=1;
        while(l<=r){
            int x=q[l++];
            for(reg i=hd[x];i;i=e[i].nxt){
                int y=e[i].to;
                if(e[i].w&&!d[y]){
                    d[y]=d[x]+1;
                    q[++r]=y;
                    if(y==t) return true;
                }
            }
        }
        return false;
    }
    int num(int x,int y){
        return (x-1)*(h+1)+y+1;
    }
    int main(){
        rd(n);rd(h);rd(m);
        ans=n*h*h;
        s=0;t=num(n,h)+1;
        int tot=t;
        for(reg i=1;i<=n;++i){
            add(s,num(i,0),inf);
            for(reg j=0;j<h;++j){
                add(num(i,j),num(i,j+1),h*h-j*j);
            }
        }
        int l,r,x,c;
        for(reg i=1;i<=m;++i){
            rd(l);rd(r);rd(x);rd(c);
            if(x<h){
                ++tot;
                add(tot,t,c);
                for(reg j=l;j<=r;++j){
                    add(num(j,x+1),tot,inf);
                }
            }
        }
        int flow=0;
        while(bfs()){
            while(flow=dfs(s,inf)) ans-=flow;
        }
        ot(ans);
        return 0;
    }
    
    }
    signed main(){
        Miracle::main();
        return 0;
    }
    
    /*
       Author: *Miracle*
    */
  • 相关阅读:
    范德蒙矩阵相关
    bat运行exe程序
    github 用token远程连接(三)
    为什么将样本方差除以N1?
    Git commit格式 详解(二)
    C++中this与*this的区别
    函数末尾加入const的作用
    git 使用小补充(四)
    人工智能 机器学习
    机器学习分类
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10857458.html
Copyright © 2020-2023  润新知