2015湖南省选集训DAY5——work(BZOJ4177)

Description

Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i]元,每只羊可以卖b[i]元,为了防止牛羊之间相互影响,Mike找到了m条规律,每条规律给出一个三元组(i, j, k)表示如果第i个围栏和第j个围栏养的是不同的动物,那么Mike就需要花费k的代价请人帮忙处理牛羊之间的影响。不过同时Mike也发现k条特殊的规则(S, a, b),表示如果S中所有牲畜围栏中都养的是动物a,那么Mike可以获得b的额外收入。现在Mike想知道他该在哪些围栏中饲养什么动物才能使得总收益最大,为了简化问题,你只需要输出最大收益。

Input

第一行三个整数n、m、k,表示一共有n个围栏,m条规律,k条规则。

第二行有n个整数,表示a[i]。

第三行有n个整数,表示b[i]。

接下来m行,每行有三个整数(i, j, k)表示一条规则。

再接下来k行,每行一开始有三个整数t、a和b,表示一条规则(S, a, b),其中S的大小为t,接下来

t个整数表示S中的元素(a为0表示全为牛,a为1表示全为羊)。

Output

输出一个整数ans,表示最大收益。

Sample Input

4 2 1

1 2 3 1

2 3 1 2

1 2 3

1 3 2

2 0 100 1 2

Sample Output

108

HINT

对于100的数据,n <= 5000, m <= 5000, k <= 5000, a = 0 or 1。

题解与吐槽:

傻逼网络流

然后听取了tkd的建议拆了点。。。

wa后发现拆点毫无意义而且会影响正确性

从源点向每个点连一条流量为ai的边,每个点向汇点连一条流量为bi的边。于是每一种割法对应一种选择。然后考虑第二种限制,我们向有关系的两点互连流量为k的边,意会一下。第三种的话我们再加上一个新点,如果要求是割掉集合中的点与汇点的边,于是从源点向这个点连流量为收益大小的边,在从这个点向集合中的点连流量无穷大的边;另一种情况同理。于是就完了。

请无视掉那个奇怪的typedef,其实它的含义是tkd神犇

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;
typedef long long tkdsb;

const tkdsb inf=0x3f3f3f3f3f3f;

tkdsb getint()
{
    char c=getchar();
    tkdsb f=1,g=0;
    while(c>‘9‘ || c<‘0‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c<=‘9‘ && c>=‘0‘)g=(g<<3)+(g<<1)+c-‘0‘,c=getchar();
    return f*g;
}

const tkdsb maxn=40005;

tkdsb n,m,k;

struct edge{
    tkdsb from,to,cap;
};

tkdsb s,t;

vector<tkdsb> g[maxn];
vector<edge> eds;

void addedge(tkdsb from,tkdsb to,tkdsb cap)
{
    g[from].push_back(eds.size());
    eds.push_back((edge){from,to,cap});
    g[to].push_back(eds.size());
    eds.push_back((edge){to,from,0});
}

tkdsb d[maxn];
queue<tkdsb> q;

bool bfs()
{
    memset(d,-1,sizeof d);
    d[s]=0;
    q.push(s);
    while(!q.empty())
    {
        tkdsb x=q.front();q.pop();
        for(vector<tkdsb>::iterator it=g[x].begin();it!=g[x].end();it++)
        {
            edge e=eds[*it];
            if(d[e.to]==-1 && e.cap>0)
            {
                d[e.to]=d[x]+1;
                q.push(e.to);
            }
        }
    }
    return d[t]!=-1;
}

tkdsb cur[maxn];

tkdsb dfs(tkdsb x,tkdsb f)
{
    if(x==t || f==0)return f;
    tkdsb used=0;
    tkdsb temp;

    for(tkdsb i=cur[x];i<g[x].size();i++)
    {
        edge e=eds[g[x][i]];
        if(d[e.to]==d[x]+1 && e.cap)
        {
            temp=dfs(e.to,min(e.cap,f-used));
            cur[x]=i;
            eds[g[x][i]].cap-=temp;
            eds[(g[x][i])^1].cap+=temp;
            used+=temp;
            if(used==f)return used;
        }
    }
    if(used==0)d[x]=-1;
    return used;
}

tkdsb dinic()
{
    tkdsb res=0;
    while(bfs())
    {
        memset(cur,0,sizeof cur);
        res+=dfs(s,inf);
    }
    return res;
}

//expected score 100

int main()
{
//  freopen("work.in","r",stdin);
//  freopen("work.out","w",stdout);

    n=getint();
    m=getint();
    k=getint();

    s=0;
    t=maxn-1;

    tkdsb x,y;
    tkdsb z;
    tkdsb res=0;

    for(tkdsb i=1;i<=n;i++)
    {
        x=getint();
        addedge(s,i,x);
        res+=x;
    }
    for(tkdsb i=1;i<=n;i++)
    {
        x=getint();
        addedge(i,t,x);
        res+=x;
    }
    for(tkdsb i=1;i<=m;i++)
    {
        x=getint();
        y=getint();
        z=getint();

        addedge(x,y,z);
        addedge(y,x,z);
    }

    tkdsb temp;

    for(tkdsb i=1;i<=k;i++)
    {
        temp=getint();
        x=getint();
        y=getint();
        res+=y;
        if(x==1)
        {
            addedge(i+n,t,y);
            for(tkdsb j=1;j<=temp;j++)
            {
                z=getint();
                addedge(z,i+n,inf);
            }
        }
        else
        {
            addedge(s,i+n,y);
            for(tkdsb j=1;j<=temp;j++)
            {
                z=getint();
                addedge(n+i,z,inf);
            }
        }
    }
    res-=dinic();
    printf("%lld\n",res);

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 19:01:46

2015湖南省选集训DAY5——work(BZOJ4177)的相关文章

2015湖南省队集训DAY3——Light

Light [问题描述] "若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引 对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简 问题,她一定也答不上来." --<上古之魔书> 天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列 a[i],远 魔书上记载到:2 个位置的 graze 值为两者位置差与数值差的和: graze(x,y)=|x-y|+|a[x]-a[y]|. 要想破解天罚,就必须支持 2种操作(

2015湖南省队集训DAY6——B题(BZOJ4179)

题面挺扯的,我就直接说人话算了. 题目大意:给你若干个病毒串,问你能不能构造出长度大于n的字符串使其中不出现任何一个字符串. 多组数据,总文件大小小于1M 题解: 联动:BZOJ2938 基本是原题,稍作了改动. 考虑ac自动机. 所求即为ac自动机中是否存在长度大于等于l的路径 先将所有的串插进去,然后构造失配指针. 显然的,插入后的末端节点肯定是不能经过的. 但仅这样显然是不可以的,我们考虑在匹配时,如果失配指针指向的节点是danger节点,那么这个节点也是不能经过的(显然). 所以考虑ac

2017雅礼省选集训做题记录

嘛,最近在补雅礼省选前集训的题.都是我会做的题..那一定是最水的那些题啦 题目在loj.ac上都有.过段时间如果搬了雅礼NOI集训的题应该也会做做的吧.. Day1 T1 一道经典套路题,做法跟UOJ #228基础数据结构练习题类似. 使用线段树维护.考虑相邻两个数的差值最多变化log次.也就是说,对于每个区间,只要操作二进行大概log次就能使得这个区间内所有数完全一样.所以对于操作二,只要记录一下区间最大最小值,就能直接打标记或者暴力DFS下去. 和UOJ那个题一样,注意一个特殊情况,就是一个

湖南省队集训 -- 1

不知道为什么今天状态 大 好 可能是暴力分比较简单吧,来认真写一下总结 开局睡了1h-- 然后考虑a题,发现特殊性:因为最后的和一定是10^n的,最后两个数一定是后面一段全是0,前面一段两个数的和是⑨,0和⑨中间夹一对和为10 然后脑补正解不能,暴力枚举一下好像可以,就是判断是在不好写 然后考虑b题,看N^2算法,脑玩了一下发现距离是不会变得,如果钦定了一个点建站第1~n-1个点产生的权值是不会变得,最后一个点的距离也变不了,唯一得变量需求要乘距离,然后把剩下的不变量加起来,这就是个kx+b的形

雅礼集训 Day5

今日得分:100+0+40 = 140 题解 T1:考虑线性基,考虑每个数位是否会在线性基里,显然除了L的第一位1以外,其他位置只有从0变成1的时候才会加入线性基,对每一位分别判断即可 T2:考虑二分图匹配,对于每一个枚举到的一类点,我们把二类点按照极角序尝试匹配,显然按照这个顺序匹配不会出现冲突问题,因为如果一个点没选,那么直接形成匹配,如果一个点无法增广,那么它一定被选,不会对之后的点产生影响 T3:最后发现是求一个基环树森林的不同构标号个数,分别处理环和树,树哈希,环枚举循环节大小

[蒟蒻修炼计划][谜之吐槽]常州集训day5

T1 Description 小W和小M一起玩拼图游戏啦~ 小M给小M一张N个点的图,有M条可选无向边,每条边有一个甜蜜值,小W要选K条边,使得任意两点间最多有一条路径,并且选择的K条边甜蜜值之和最大. Input 第一行三个正整数N,M,K. 接下来M行,每行三个正整数A,B,C表示A.B两点间有一条甜蜜值为C的无向边. Output 一行输出最大甜蜜值之和. Sample Input 5 4 3 1 2 10 1 3 9 2 3 7 4 5 3 Sample Output 22 HINT N

暑假集训day5

今天的主要内容为最小生成树.判负环和差分约束系统 苗条的最小生成树 poj3522 本题排序完枚举最小边,Kruskal跑n遍即可. #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int INF=0x7fffffff; inline int read(){ int num=0,t=1;char c=getchar(); while(c>'9'||

Test 2015.6.25 集训 Day1

三题五小时 T1 正解:树链剖分或LCT,然而并听不太懂 考试时写了个树形DP+各种想办法优化,然而并没有什么卵用,和暴力分一样高 T2 正解:后缀和计数+贪心 主要写T1,T3去了,写了n^3暴力走人,其实可以过40分,然而我高估了数据= =,只开了20分的数组 T3 正解:曼哈顿距离转化一下,四维DP维护一个矩形,有O(1)的找最近点的算法然而不会 写了个状压然而之前暴力写的dfs,想了想应该优化程度差不多,傻逼地同暴力分= =,下午回来改DP还改了30min,效率感人 还是太年轻,有些东西

股神小L 2016Vijos省选集训 day1

股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型预测了一支股票接下来n天的价格. 我们把这支股票第i天的价格称为a_i.在接下来n天里,每一天小L可以选择花费a_i买入一股或者卖出一股从而获得a_i元收入. 当然小L卖出股票的时候,自己的账户上必须要有至少一股的剩余.现在小L希望知道,在n天过去之后,采取最优策略的情况下自己最多赚到多少钱. 注意