F - Clear The Matrix

分析

题目问将所有星变成点的花费,限制了行数(只有4行),就可以往状压DP上去靠了。

\(dp[i][j]\) 表示到第 \(i\) 列时状态为 \(j\) 的花费,只需要记录 16 位二进制,因为我们最多只能影响到 4 * 4 的星,那么每次都是从一个 4 * 4 的矩阵转移到一个 4 * 4 的矩阵,注意,转移时必须保证最左边列全部为 1 (即都是星号),那么最后答案就是 \(dp[n][(1 << 16) - 1]\)。

比如我们选定点 (i, j),将 3 * 3 的星变成点,那么变的就是左上角 (i, j - 2) 右下角 (i + 2, j) 的这个矩阵。

为了状态转移,我们会同时对一列的星进行变换,可能有多种方案,这个可以预处理再加些优化,最后合法的是很少的。

code

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
string mp[4];
int dp[2][1 << 16];
int n, cnt, a[5], b[133], c[133];
int calc(int xl, int xr, int yl, int yr) {
int res = 0;
for (int i = xl; i <= xr; i++) {
for (int j = yl; j <= yr; j++) {
res += 1 << ((i * 4) + j);
}
}
return res;
}
void dfs(int x, int mx, int st, int cost) {
if (x == 4) {
b[cnt] = st;
c[cnt++] = cost;
return;
}
for (int i = 4; i >= 1; i--) {
if (x + i > 4) continue;
if (!x) {
dfs(x + 1, i, st | calc(4 - i, 3, x, i - 1), cost + a[i]);
} else {
if (x + i > mx) {
dfs(x + 1, x + i, st | calc(4 - i, 3, x, x + i - 1), cost + a[i]);
} else {
break;
}
}
}
dfs(x + 1, x, st, cost);
}
int main() {
cin >> n >> a[1] >> a[2] >> a[3] >> a[4];
for (int i = 0; i < 4; i++) {
cin >> mp[i];
}
dfs(0, 0, 0, 0);
memset(dp[0], 0x3f, sizeof dp[0]);
dp[0][(1 << 16) - 1] = 0;
int cur = 0;
for (int i = 0; i < n; i++) {
int cst = 0;
for (int j = 0; j < 4; j++) {
if (mp[j][i] == '.') {
cst += 1 << (12 + j);
}
}
cur = !cur;
memset(dp[cur], 0x3f, sizeof dp[cur]);
for (int j = 0; j < (1 << 12); j++) {
dp[cur][j | cst] = dp[!cur][(j << 4) + 15];
if (dp[!cur][(j << 4) + 15] == 0x3f3f3f3f) continue;
for (int k = 0; k < cnt; k++) {
dp[cur][j | cst | b[k]] = min(dp[!cur][(j << 4) + 15] + c[k], dp[cur][j | cst | b[k]]);
}
}
}
cout << dp[cur][(1 << 16) - 1] << endl;
return 0;
}

G. Yet Another Maxflow Problem

分析

一道“网络流”的题目。

本题主要注意最小割等于最大流,我们去构造这个解,即怎样才算最小割。注意到本题边的限制颇多,\(A_i\)-\(A_{i+1}\) 连有向边,\(B_i\)-\(B_{i+1}\) 连有向边,且从 A 到 B 连有向边,考虑 A 这部分,如果删掉边 \(A_i\)-\(A_{i+1}\) ,那么 \(A_{i+1}\) 下面所有边都无意义了,对于 B 这部分,删掉 \(B_i\)-\(B_{i+1}\),则 \(B_i\) 上面所有边都无意义了,有这样的性质后,我们枚举左边的边,用线段树维护删掉右边的边的代价的最小值(右边也有可能不删),用 multiset 维护全局最优解。

code

#include <bits/stdc++.h>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
const int N = 2e5 + 10;
int a[N], b[N];
vector<pair<int, int> > G[N];
long long s[N << 4], lazy[N << 4];
void pushDown(int rt) {
lazy[rt << 1] += lazy[rt];
lazy[rt << 1 | 1] += lazy[rt];
s[rt << 1] += lazy[rt];
s[rt << 1 | 1] += lazy[rt];
lazy[rt] = 0;
}
void pushUp(int rt) { s[rt] = min(s[rt << 1], s[rt << 1 | 1]); }
void build(int l, int r, int rt) {
if (l == r)
s[rt] = b[l - 1];
else {
int m = l + r >> 1;
build(lson);
build(rson);
pushUp(rt);
}
}
void update(int L, int R, int c, int l, int r, int rt) {
if (l >= L && r <= R) {
lazy[rt] += c;
s[rt] += c;
} else {
pushDown(rt);
int m = l + r >> 1;
if (m >= L) update(L, R, c, lson);
if (m < R) update(L, R, c, rson);
pushUp(rt);
}
}
long long query(int L, int R, int l, int r, int rt) {
if (l >= L && r <= R)
return s[rt];
else {
pushDown(rt);
int m = l + r >> 1;
long long res = (1LL << 62);
if (m >= L) res = query(L, R, lson);
if (m < R) res = min(res, query(L, R, rson));
pushUp(rt);
return res;
}
}
multiset<long long> mset;
long long cb[N];
int main() {
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i < n; i++) {
scanf("%d%d", &a[i], &b[i]);
}
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[u].push_back(pair<int, int>(v, w));
}
build(1, n, 1);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < G[i].size(); j++) {
update(1, G[i][j].first, G[i][j].second, 1, n, 1);
}
cb[i] = s[1];
mset.insert(cb[i] + a[i]);
}
printf("%I64d\n", *mset.begin());
while (q--) {
int v, w;
scanf("%d%d", &v, &w);
mset.erase(mset.lower_bound(a[v] + cb[v]));
a[v] = w;
mset.insert(w + cb[v]);
printf("%I64d\n", *mset.begin());
}
return 0;
}

Educational Codeforces Round 34的更多相关文章

  1. Educational Codeforces Round 34 (Rated for Div. 2) A B C D

    Educational Codeforces Round 34 (Rated for Div. 2) A Hungry Student Problem 题目链接: http://codeforces. ...

  2. Educational Codeforces Round 34 (Rated for Div. 2) D - Almost Difference(高精度)

    D. Almost Difference Let's denote a function You are given an array a consisting of n integers. You ...

  3. Educational Codeforces Round 34 (Rated for Div. 2) C. Boxes Packing

    C. Boxes Packing time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  4. Educational Codeforces Round 34 D. Almost Difference【模拟/stl-map/ long double】

    D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. Educational Codeforces Round 34 C. Boxes Packing【模拟/STL-map/俄罗斯套娃】

    C. Boxes Packing time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. Educational Codeforces Round 34 B. The Modcrab【模拟/STL】

    B. The Modcrab time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. Educational Codeforces Round 34 A. Hungry Student Problem【枚举】

    A. Hungry Student Problem time limit per test 1 second memory limit per test 256 megabytes input sta ...

  8. Educational Codeforces Round 34 (Rated for Div. 2)

    A. Hungry Student Problem time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. Educational Codeforces Round 34 (Rated for Div. 2) B题【打怪模拟】

    B. The Modcrab Vova is again playing some computer game, now an RPG. In the game Vova's character re ...

随机推荐

  1. Jquery对话框基本配置

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...

  2. ABP 用swagger UI测试API报401无权限访问问题

    问题描述: 当我们用swagger UI对Web API 进行测试时报401错误 我们点开GET /api/services/app/Role/GetAll,输入参数 点击Try it out!按钮, ...

  3. bzoj 2750: [HAOI2012]Road

    Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...

  4. 某次送温暖考试的 c题

    题目大意: 给定n个点的无根树,树上每个点都有一个非负的点权. 树上的路径的价值定义为树上路径的点权和-树上路径的点权最大值; 现在给定一个参数P询问有多少条路径的价值是P的倍数(注意单点也算路径,路 ...

  5. redis中使用 check-and-set 操作实现乐观锁

    WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为. 被 WATCH 的键会被监视,并会发觉这些键是否被改动过了. 如果有至少一个被监视的键在 EXEC 执行之前 ...

  6. 小白的Python之路 day4 软件目录结构规范

    软件目录结构规范 为什么要设计好目录结构? "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同 ...

  7. WINDOWS下运行ORACLE SQLPLUS时报错的一次记录

    环境变量配置无误后,在sys用户 在pl/sql上登录时候报以下错误 ORA-01034: ORACLE not available进程 ID: 0会话 ID: 0 序列号: 0 然后运行控制台,有以 ...

  8. 在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法

    在Ubuntu 12.04系统中安装配置OpenCV 2.4.3的方法   对于,在Linux系统下做图像识别,不像在windows下面我们可以利用Matlab中的图像工具箱来实现,我们必须借助Ope ...

  9. jQuery中事件对象e的事件冒泡用法示例(事件冒泡与阻止冒泡)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 对DataTable(或者DataSet)修改后,提交修改到数据库

    http://blog.csdn.net/nidexuanzhe/article/details/8228832 说明:通常我们在做数据库交互时,并不一定要使用特定的SQL语句来更新数据,.NET F ...