(权限题)NFLSoj #113: 或负 题解

标签: NFLSoj 最大流
4人阅读 评论(0) 收藏 举报
分类:

一眼网络流
考虑超级源点向第i个长者连流量为L[i]的边,每个长者拆成D天,向每一天连N-sum[i][j],sum[i][j]表示他当天必须用来准备批判会的时间
每个长者的每一天专门再拆一个点管理长者的午休,连Hl-Hr-sum1[i][j],sum1[i][j]表示他当天午休时间内必须用来准备批判会的时间
最后对应的点向批判会连边

*数组不要开小了!!!

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const double eps=1e-10;
const double pi=acos(-1);

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

int Z,D,H,N,Hl,Hr;
int L[148],R[148][148],F[148][148][148],sum[148][148],sum1[148][148];
int t;

int head[200048],to[800048],nxt[800048],f[800048],tot=1;
inline void addedge(int s,int t,int cap)
{
    to[++tot]=t;nxt[tot]=head[s];head[s]=tot;f[tot]=cap;
    to[++tot]=s;nxt[tot]=head[t];head[t]=tot;f[tot]=0;
}

int depth[200048];queue<int> q;
inline bool bfs()
{
    int i,x,y;
    for (i=0;i<=t;i++) depth[i]=-1;
    depth[0]=0;q.push(0);
    while (!q.empty())
    {
        x=q.front();q.pop();
        for (i=head[x];i;i=nxt[i])
        {
            y=to[i];
            if (depth[y]==-1 && f[i])
            {
                depth[y]=depth[x]+1;
                q.push(y);
            }
        }
    }
    if (depth[t]==-1) return false; else return true;
}

inline int dfs(int x,int maxf)
{
    if (x==t || !maxf) return maxf;
    int i,y,now,minf,ans=0;
    for (i=head[x];i;i=nxt[i])
    {
        y=to[i];
        if (depth[y]==depth[x]+1 && f[i])
        {
            minf=min(maxf-ans,f[i]);
            now=dfs(y,minf);
            f[i]-=now;f[i^1]+=now;ans+=now;
        }
        if (ans>=maxf) return ans;
    }
    if (!ans) depth[x]=0;
    return ans;
}

int main ()
{
    int i,j,k;
    Z=getint();D=getint();H=getint();N=getint();Hl=getint();Hr=getint();
    for (i=1;i<=Z;i++) L[i]=getint();
    for (i=1;i<=D;i++)
        for (j=1;j<=H;j++)
            R[i][j]=getint();
    for (i=1;i<=Z;i++)
        for (j=1;j<=D;j++)
        {
            sum[i][j]=N;
            for (k=1;k<=H;k++)
            {
                F[i][j][k]=getint();
                sum[i][j]-=(F[i][j][k]==0);
                if (Hl<=k && k<=Hr) sum1[i][j]+=(F[i][j][k]==1);
            }
            if (sum1[i][j]==0) {printf("No\n");return 0;}
            if (sum[i][j]<0) {printf("No\n");return 0;}
        }
    t=Z+D*Z+D*Z+D*H+1;
    for (i=1;i<=Z;i++) addedge(0,i,L[i]);
    for (i=1;i<=Z;i++)
        for (j=1;j<=D;j++)
            addedge(i,Z+(i-1)*D+j,sum[i][j]);
    for (i=1;i<=Z;i++)
        for (j=1;j<=D;j++)
            addedge(Z+(i-1)*D+j,Z+D*Z+(i-1)*D+j,sum1[i][j]-1);
    for (i=1;i<=Z;i++)
        for (j=1;j<=D;j++)
            for (k=1;k<=H;k++)
            {
                if (!F[i][j][k]) continue;
                if (Hl<=k && k<=Hr)
                    addedge(Z+D*Z+(i-1)*D+j,Z+D*Z+D*Z+(j-1)*H+k,1);
                else
                    addedge(Z+(i-1)*D+j,Z+D*Z+D*Z+(j-1)*H+k,1);
            }
    for (i=1;i<=D;i++)
        for (j=1;j<=H;j++)
            addedge(Z+D*Z+D*Z+(i-1)*H+j,t,R[i][j]);
    int ans=0,need=0;
    for (i=1;i<=D;i++)
        for (j=1;j<=H;j++)
            need+=R[i][j];
    while (bfs()) ans+=dfs(0,2e9);
    if (ans==need) printf("Yes\n"); else printf("No\n");
    return 0;
}
查看评论

JEECG_3.7 权限开发讲解

-
  • 1970年01月01日 08:00

(权限题)NFLSoj #4: Grass Planting 题解

可以裸上树剖 也可以动一动脑子nlogn过:对于每一次修改在u,v上+1,在lca(u,v)上-2 对于每一次查询u,v,取depth较大的那个球子数和 用一下dfs序加一个BIT就可以了 ...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-01-17 08:46:56
  • 44

(权限题)NFLSoj #26: ? ? ? 题解

四维偏序裸题 刚开始上了三层cdq分治,TLE了,把最后一次cdq分治换成树状数组就过了 下面程序中注释掉的部分是第三层cdq分治 #include #include #include #...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-01-27 16:53:13
  • 47

(权限题)NFLSoj #35: Large Banner 题解

这好像是USACO2010的原题 Ans=∑i=1m∑j=1n[gcd(i,j)=1且l2≤i2+j2≤h2]∗2(m−i+1)(n−j+1)Ans=∑i=1m∑j=1n[gcd(i,j)=1且l2...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-04-05 14:41:15
  • 10

(权限题) NFLSoj #105: Merging 题解

这道题是codeforces #51F 的数据加强版 感觉应该是状压dp什么的,但数据范围达到了2e4,不得不从其他角度考虑 我们可以发现一些性质:题目最后要形成的是一棵树,那么考虑如果原图中有一...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-03-30 20:40:45
  • 11

(权限题)NFLSoj #32: 辐射 题解

先吐槽一波这题实在是太难写了。。。 借鉴youyl的博客: 考虑一个辐射源对其他点的贡献,就是若干个正方形叠加在一起。 如: 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 ...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-01-25 23:05:47
  • 36

Codeforces刷题之路——133A HQ9+

A. HQ9+ time limit per test 2 seconds memory limit per test 256 megabytes input st...
  • CodingXiaoGuo
  • CodingXiaoGuo
  • 2016-08-24 14:47:19
  • 925

蓝桥杯算法训练题解

1.区间k大数查询 可以先排序,也可以使用快排的思想。 /***********************************************************************...
  • gwq5210
  • gwq5210
  • 2015-03-26 19:15:49
  • 544

OCP-1Z0-051-V9.02-113题

113. Examine the structure of the ORDERS table:   Name             Null      Type  ORDER_ID    ...
  • rlhua
  • rlhua
  • 2013-09-24 15:36:47
  • 8267

(权限题)NFLSoj #103: 小D的道路 题解

感觉有点像网络流,但不会搞 看到数据范围又不由得往状压dp方面想 我们可以发现,一个图是优美的,则它的形状一定是一条从1~n的链,其中链上的每个点挂着一个子图 考虑dp[Mask][i]表示当前...
  • IcePrincess_1968
  • IcePrincess_1968
  • 2018-03-29 16:04:04
  • 16
    个人资料
    持之以恒
    等级:
    访问量: 9617
    积分: 1489
    排名: 3万+
    最新评论