「JSOI2015」圈地

「JSOI2015」圈地

传送门

显然是最小割。

首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于所有的墙,连两条边,连接起墙两边的房子,容量就是修墙的费用,然后直接用权值和 - 最小割就是最大收益。

参考代码:

#include <cstring>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
template < class T > inline T min(T a, T b) { return a < b ? a : b; }
template < class T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while ('0' > c || c > '9') f |= c == '-', c = getchar();
    while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
    s = f ? -s : s;
}

const int _ = 400 * 400 + 5, __ = 3 * 400 * 400 + 5, INF = 2147483647;

int tot = 1, head[_]; struct Edge { int v, w, nxt; } edge[__ << 1];
inline void Add_edge(int u, int v, int w) { edge[++tot] = (Edge) { v, w, head[u] }, head[u] = tot; }
inline void link(int u, int v, int w) { Add_edge(u, v, w), Add_edge(v, u, 0); }

int n, m, x, sum, s, t, dep[_], cur[_];

inline int bfs() {
    static int hd, tl, Q[_];
    memset(dep, 0, sizeof (int) * (t - s + 1));
    hd = tl = 0, Q[++tl] = s, dep[s] = 1;
    while (hd < tl) {
        int u = Q[++hd];
        for (rg int i = head[u]; i; i = edge[i].nxt) {
            int v = edge[i].v, w = edge[i].w;
            if (dep[v] == 0 && w)
                dep[v] = dep[u] + 1, Q[++tl] = v;
        }
    }
    return dep[t] > 0;
}

inline int dfs(int u, int flow) {
    if (u == t) return flow;
    for (rg int& i = cur[u]; i; i = edge[i].nxt) {
        int v = edge[i].v, w = edge[i].w;
        if (dep[v] == dep[u] + 1 && w) {
            int res = dfs(v, min(w, flow));
            if (res) { edge[i].w -= res, edge[i ^ 1].w += res; return res; }
        }
    }
    return 0;
}

inline int Dinic() {
    int res = 0;
    while (bfs()) {
        for (rg int i = s; i <= t; ++i) cur[i] = head[i];
        while (int d = dfs(s, INF)) res += d;
    }
    return res;
}

inline int id(int i, int j) { return (i - 1) * m + j; }

int main() {
#ifndef ONLINE_JUDGE
    file("cpp");
#endif
    read(n), read(m), s = 0, t = n * m + 1;
    for (rg int i = 1; i <= n; ++i)
        for (rg int j = 1; j <= m; ++j) {
            read(x), sum += x > 0 ? x : -x;
            if (x > 0) link(s, id(i, j), x);
            if (x < 0) link(id(i, j), t, -x);
        }
    for (rg int i = 1; i <= n - 1; ++i)
        for (rg int j = 1; j <= m; ++j)
            read(x), link(id(i, j), id(i + 1, j), x), link(id(i + 1, j), id(i, j), x);
    for (rg int i = 1; i <= n; ++i)
        for (rg int j = 1; j <= m - 1; ++j)
            read(x), link(id(i, j), id(i, j + 1), x), link(id(i, j + 1), id(i, j), x);
    printf("%d\n", sum - Dinic());
    return 0;
}

原文地址:https://www.cnblogs.com/zsbzsb/p/12305485.html

时间: 2024-08-30 04:30:51

「JSOI2015」圈地的相关文章

「JSOI2015」salesman

「JSOI2015」salesman 传送门 显然我们为了使收益最大化就直接从子树中选大的就好了. 到达次数的限制就是限制了可以选的子树的数量,因为每次回溯上来都会减一次到达次数. 多种方案的判断就是看自己选中的子树中和没选的子树中是否存在两个值相等的,这样它们就可以通过互换来达到另一种方案,值得注意的是如果选了一个值为 \(0\) 的子树就肯定可以多一种方案出来,因为这颗子树选或不选都是满足最优的. 这里有个小问题:交到BZOJ上面去它会提示你 sort 没有声明,此时需要 #include

「JSOI2015」套娃

「JSOI2015」套娃 传送门 考虑贪心. 首先我们假设所有的套娃都互相不套. 然后我们考虑合并两个套娃 \(i\),\(j\) 假设我们把 \(i\) 套到 \(j\) 里面去,那么就可以减少 \(b_j \times out_i\) 的花费. 我们有一种 贪心策略就是说把所有套娃按 \(b\) 从大到小排序,然后每次找一个 \(out\) 最大的让它套. 我们可以这么证明正确性: 对于四个套娃 \(i, j, k, l\) ,假设 \(b_i > b_j, out_k > out_l\)

「JSOI2015」串分割

「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然后每一段长度 \(\frac{n}{k}\) 最后取最小的. 把这个思想运用到一般情况:如果分出来两段长短不一,那么长的只会比短的那个长度多 \(1\) ,再仔细想想,所有段只会有两种不同的长度 \(\lfloor \frac{n}{k} \rfloor, \lceil \frac{n}{k} \r

字符串树「JSOI2015」

[题目描述] 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子. 字符串树本质上还是一棵树,即N个节点N-1条边的连通无向无环图,节点从1到N编号.与普通的树不同的是,树上的每条边都对应了一个字符串.萌萌和JYY在树下玩的时候,萌萌决定考一考JYY.每次萌萌都写出一个字符串S和两个节点U,V,需要JYY立即回答U和V之间的最短路径(即,之间边数最少的路径.由于给定的是一棵树,这样的路径是唯一的)上有多少个字

币圈惊现门罗币挖矿新家族「罗生门」

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 一.前言 腾讯安全云鼎实验室通过部署的威胁感知系统捕获了一批挖矿样本(具有同源性),是一批可挖取门罗币(xmr)的挖矿病毒.这批样本今年5月开始出现,目前各大杀软对此样本基本无法有效查杀,腾讯云云镜第一时间跟进查杀.根据进一步溯源的信息可以推测该挖矿团伙利用被***的×××服务器进行病毒传播.分析显示,此挖矿样本不具有传播性,总体结构式是 Loader + 挖矿子体,挖矿团伙通过控制的机器进行远程 S

技术人员应对「考核」的一些思考

来这个公司实习已经半年多了,在年前经历了一次年终考核,最终对我的工作的评级是 C(及格-符合当前职位的工作),让我不禁思考自己在项目中的一些工作的问题,为什么我是C?是我做的不够好吗?或者说在哪里做的不够好? 从考核流程来看,基本上是 CTO 与 Team Leader 对团队成员的「年终总结与次年工作计划」进行Rank,个人狭义的认为「考核」的主要支持材料就是这个总结了. 他山之石 其他公司是怎么考核的呢?说实话我也不太清楚,刚入行,只能通过搜索了解,在网上了解到有以下几种:发精品博客.发论文

保障「舌尖」安全 大數據應用有錢「數」

兩會期間,空氣.水.食品安全等問題依然是關注熱點.針對食品安全風險如何把控的話題,昨日,全國政協委員嚴琦.全國政協委員杜惠平.全國政協委員彭靜等接受商報記者採訪時均建議,新的市場環境下,除了完善的制度體系建設,解決食品安全問題更需要藉助更新的技術和服務.而隨著移動互聯網.大數據等先進技術手段在食品安全領域的應用,配套建設誠信資料庫.移動APP等將迎來商機. 現狀 食品追溯體系 推廣率亟待提高 食品安全關係千家萬戶,保障「舌尖」安全目前還有哪些方面需要完善? 全國政協委員嚴琦表示,在2010年和2

Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题

一.故事背景 现在很多人都喜欢玩文艺,特别是我身边的UI们,拍照一分钟修图半小时.就是为了能够在朋友圈显得逼格高,不过的确是挺好看的,修图的软件太多了就不多说了,而且一般都没有水印啥的.相比较短视频有一个比较有逼格的编辑工具「Vue」个人已经用了很长时间了,拍出来的视频借助强大滤镜真的很好看,显得逼格也高,更重要的是他有我最喜欢的功能就是可以添加视频背景音乐,选择自己喜欢的音乐,然后还可以编辑这段背景音乐,反正我个人觉的这个是我最喜欢用的产品了.但是好用的东西必定有它不好的地方,因为他真的很强大

互联网公司的2019年「春潮」:谁迎风逐浪,谁黯然退潮?

用一个词来形容过去一年的中国互联网,大概就是「波涛汹涌」.短短时间,中国互联网产业格局已经悄然发生改变.在 2019 年的金三银四求职季,小千结合一些求职案例,带领大家回顾一下 2018 年至今中国互联网企业的变迁,希望为大家的求职带来些许帮助. 一.大厂的中年危机,猝不及防一口「凉」 代表公司:网易 与传统行业相比,互联网向来是「年轻」与「不安分」的代名词.但是在互联网界,也有一些公司因为人员流动率低.工作节奏慢被誉为互联网里的「国企」.网易.新浪就是其中的典型代表. 尤其是网易,「一入猪场胖