bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包
题目传送门
https://lydsy.com/JudgeOnline/problem.php?id=4244
题解
挺妙的一道题。
一开始一直往最短路上面想,然后怎么想发现都没有用。
然后就又开始自闭了。最后又去拜读题解了。(今天怎么读了两次题解啊,没救了没救了
一条合法的路线一定是从 \(0\) 到 \(n + 1\) 的链上套了无数个环。每一个邮戳台至少被一个环经过。
经过邮戳台的方式有 \(4\) 类:
- 上行 -> 邮戳台 -> 下行,费用为 \(u+e\)
- 下行 -> 邮戳台 -> 上行,费用为 \(d+v\)
- 上行 -> 邮戳台 -> 上行,费用为 \(u+v\)
- 下行 -> 邮戳台 -> 下行,费用为 \(d+e\)
其中第一类和第二类可以互相之间构成大环(跨越了两个邮戳台为大环)。
对于一个环,可以发现从路程上,第一类一定出现在第二类的前面。但是,从位置上,第二类一定出现在第一类的前面。于是,我们令 \((\) 表示第二类环,\()\) 表示第一类环。于是合法的路径是一个合法的括号序列。另外,对于第 \(4\) 类,因为是从下行台来的,所以之前必须有一个 \((\)。
然后,令 \(dp[i][j]\) 表示前 \(i\) 个位置,有 \(j\) 个不匹配的 \((\) 的最优解。直接转移就可以了。
注意第一二种情况可以多次使用,所以是一个完全背包。
最后加上从 \(0\) 到 \(n + 1\) 的链的长度。
代码如下,时间复杂度 \(O(n^2)\)。
#include<bits/stdc++.h>
#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back
template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b, 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b, 1 : 0;}
typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
template<typename I> inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
f ? x = -x : 0;
}
const int N = 3000 + 7;
const int INF = 0x3f3f3f3f;
int n, t;
int u[N], v[N], d[N], e[N];
int dp[N][N];
inline void work() {
memset(dp, 0x3f, sizeof(dp)), dp[0][0] = 0;
for (int i = 1; i <= n; ++i) {
const int &u = ::u[i], &v = ::v[i], &d = ::d[i], &e = ::e[i];
for (int j = 0; j < n; ++j) smin(dp[i][j], dp[i - 1][j + 1] + u + e);
for (int j = 0; j <= n; ++j) smin(dp[i][j], dp[i - 1][j] + u + v);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i - 1][j - 1] + v + d);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i - 1][j] + d + e);
for (int j = 1; j <= n; ++j) smin(dp[i][j], dp[i][j - 1] + v + d);
for (int j = n - 1; ~j; --j) smin(dp[i][j], dp[i][j + 1] + u + e);
for (int j = 0; j <= n; ++j) if (dp[i][j] != INF) dp[i][j] += t * j * 2;
}
printf("%d\n", dp[n][0] + (n + 1) * t);
}
inline void init() {
read(n), read(t);
for (int i = 1; i <= n; ++i) read(u[i]), read(v[i]), read(d[i]), read(e[i]);
}
int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
init();
work();
fclose(stdin), fclose(stdout);
return 0;
}
bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包的更多相关文章
- [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- 「JOISC 2014 Day1」巴士走读
「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...
- 「JOISC 2014 Day1」 历史研究
「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...
- loj2880「JOISC 2014 Day3」稻草人
题目链接:bzoj4237 loj2880 考虑\(cdq\)分治,按\(x\)坐标排序,于是问题变成统计左下角在\([l,mid]\),右上角在\([mid+1,r]\)的矩形数量 我们先考虑固 ...
- LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...
随机推荐
- sql2000如何完美压缩.mdf文件
--收缩数据库 dbcc shrinkdatabase('test_db') , ) --数据文件mdf , ) --日志文件ldf ) --更新
- JavaScript 常用的技术(陆续更新)
截取字符串(指定长度) var str = "abc-110001"; //str.substring(起始位置(0开始),截取的长度) str.substring(0,4); / ...
- [CSP-S模拟测试]:传递(暴力+bitset)
题目描述 我们称一个有向图$G$是传递的,当且仅当对于图$G$的三个不同顶点$a,b,c$,若图$G$中有一条边从$a$到$b$且有一条边从$b$到$c$,那么图中也有一条边从$a$到$c$.我们称一 ...
- datagrid选择一行
onLoadSuccess:function(value, rec){ $("#sinopec_search_btn").linkbutton('enable'); var dat ...
- html5: postMessage解决跨域通信的问题
效果图 postmessage解析 HTML5提供了新型机制PostMessage实现安全的跨源通信. 语法 otherWindow.postMessage(message, targetOrigin ...
- custom serializer for just one property in Json.NET
Json序列化的时候跳过加密字段 字段类定义如下 public class Field { public bool IsEncrypted { get; set; } public string Na ...
- loj#2391 「JOISC 2017 Day 1」港口设施
分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...
- tools-eclipse-003-下载安装优化
一.下载 1.1.jdk安装 下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装:不需要安装jre,默认会 ...
- python读写excle
我们可以通过python的一些模块进行excle中用例的读取,或者导出数据到excle 目录 1.安装模块 2.读excle 3.写excle 1.安装模块 python中有第三方模块可以进行excl ...
- 解读:nginx的一个神秘配置worker_cpu_affinity
今天在查看nginx的相关知识的时候发现了一个nginx之前不认识的配置:worker_cpu_affinity. nginx默认是没有开启利用多核cpu的配置的.需要通过增加worker_cpu_a ...