zoukankan      html  css  js  c++  java
  • BZOJ:4873: [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅

    首先很开心在膜你赛的时候做了出来。

    看到数据范围,看到不能dp,看到贡献去重后计算,咦,流?

    那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他的子区间(依赖关系),代价上也很容易用依赖关系搞。

    提交完A了就没理,后来同学说我#1了???

    #include<cstdio>
    #include<algorithm>
    #define MN 40001
    using namespace std;
    
    int read_p,read_ca,read_f;
    inline int read(){
        read_p=0;read_ca=getchar();read_f=1;
        while(read_ca<'0'||read_ca>'9') read_f=read_ca=='-'?-1:read_f,read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p*read_f;
    }
    const int INF=1e9;
    struct na{int y,z,ne;}b[MN*10];
    int n,m,map[101][101],nu[101][101],a[101],num=1,no=0,S,T,mmh=0,g[MN],c[MN],d[MN],l[MN];
    inline void in(int x,int y,int z){b[++num].y=y;b[num].z=z;b[num].ne=l[x];l[x]=num;}
    inline void add(int x,int y,int z){in(x,y,z);in(y,x,0);}
    inline int min(int a,int b){return a<b?a:b;}
    int sap(int x,int f){
        if (x==T) return f;
        int h=0,q;
        for (int i=d[x];i;i=b[i].ne)
        if (b[i].z&&g[b[i].y]+1==g[x]){
            q=sap(b[i].y,min(b[i].z,f-h));
            h+=q;b[i].z-=q;b[i^1].z+=q;
            if (h==f||g[S]==no) return h;
        }
        if (!(--c[g[x]])) g[S]=no;d[x]=l[x];c[++g[x]]++;
        return h;
    }
    int main(){
        register int i,j;
        n=read();m=read();
        S=++no;T=++no;
        
        for (i=1;i<=n;i++)
        for (j=i;j<=n;j++) nu[i][j]=++no;
        
        for (i=1;i<=n;i++)
        for (j=i+1;j<=n;j++)
        add(nu[i][j],nu[i][j-1],INF),add(nu[i][j],nu[i+1][j],INF);
        
        for (i=1;i<=n;i++){
            a[i]=read();map[i][i]-=a[i];
            add(nu[i][i],no+a[i],INF);
        }
        for (i=1;i<=n;i++)
        for (j=i;j<=n;j++) if ((map[i][j]+=read())>0) add(S,nu[i][j],map[i][j]),mmh+=map[i][j];else add(nu[i][j],T,-map[i][j]);
        if (m) for (i=1;i<=1000;i++) add(no+i,T,i*i);no+=1000;
        
        for (;g[S]<no;mmh-=sap(S,INF));
        printf("%d
    ",mmh);
    }
    View Code
  • 相关阅读:
    POJ 题目2750 Potted Flower(线段树求环型区间中连续区间的最大和)
    即使没人看我们也要坚持写Blog
    鸟哥的Linux私房菜-----7、硬件管理
    android createbitmap函数内存溢出,求解怎样进行处理out of memory溢出问题
    hdu4614Vases and Flowers 线段树
    安装npm及cnpm(Windows)
    安装npm及cnpm(Windows)
    安装npm及cnpm(Windows)
    Echarts设置点击事件
    Vs Code中炫酷写代码插件Power Mode的安装配置
  • 原文地址:https://www.cnblogs.com/Enceladus/p/6770616.html
Copyright © 2011-2022 走看看