【题解】洛谷9月月赛加时赛 —— Never·island
有趣有趣~ヾ(✿゚▽゚)ノ真的很有意思的一道dp题!感觉可以提供很多非常有意思的思路~
现场打的时候考虑了很久,但并没有做出来,主要还是卡在了两个地方:1.考虑到按照端点来进行dp,但没有办法将两个端点绑定(即选择钥匙的决策要同时作用在出发与回来的节点上);2.有一些贡献是需要前后两个队伍共同的决策才能够实现的,也并不会处理……最后的题解完美解决了这两个问题。
我们可以考虑将两个相邻端点之间能否关门作为贡献加在两个端点所代表的队伍的节点上(点权)。如果左边是出发,右边也是出发,那么将这段的贡献加在左边的节点上;如果左边是回程,右边也是回程,那么将这段的贡献加在右边的节点上。如果左边是回程,右边是出发,则中间这一段的贡献一定会被加入答案中。如果左边是出发,右边是回程,那么中间这段的贡献需要两边均给了钥匙才能获得,我们可以在它们两者之间连一条边,边权为中间的贡献。
这张图上所有的边我们可以发现构成了一条链(只有一条入边&一条出边且不构成环)。然后我们就可以愉快地dp辣!
启示是:可以将选/不选的问题抽象成为点&点权,两两之间的关系用边来描述。之后,再考虑序列/树上等等的dp。加油呀!
//代码kuai的题解嘻嘻嘻
#include <bits/stdc++.h>
using namespace std;
#define maxn 2005
#define int long long
int n, m, tot, res, last[maxn];
int id[maxn * ], f[maxn][maxn][], val[maxn];
int w[maxn], vis[maxn], nxt[maxn], rec[maxn];
map <int, int> Map; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void dfs(int u)
{
vis[rec[++ tot] = u] = ;
if(nxt[u]) dfs(nxt[u]);
} signed main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++)
{
int l = read(), r = read();
Map[l] = i * , Map[r] = i * + ;
id[i] = l, id[i + n] = r;
}
sort(id + , id + + n + n);
for(int i = ; i < n * ; i ++)
{
int l = id[i], r = id[i + ];
int ld = Map[l], rd = Map[r];
int a = ld & , b = rd & , len = r - l;
if(a && !b) res += len;
else if(a && b) val[rd >> ] += len;
else if(!a && !b) val[ld >> ] += len;
else if(!a && b)
{
if((ld >> ) == (rd >> )) val[ld >> ] += len;
else last[rd >> ] = ld >> , w[rd >> ] = len;
}
}
for(int i = ; i <= n + n; i ++)
{
int d = Map[id[i]];
if(!(d & ) && !vis[d >> ]) dfs(d >> );
}
memset(f, 0xbf, sizeof(f));
f[n + ][][] = f[n][][] = ;
for(int i = n; i > ; i --, f[i][][] = )
for(int j = (n - i + , m); j > ; j --)
{
f[i][j][] = max(f[i + ][j][], f[i + ][j][]);
if(!last[rec[i]]) f[i][j][] = max(f[i + ][j - ][], f[i + ][j - ][]) + val[rec[i]];
else f[i][j][] = max(f[i + ][j - ][], f[i + ][j - ][] + w[rec[i]]) + val[rec[i]];
}
printf("%lld\n", id[n * ] - id[] - res - max(f[][m][], f[][m][])); return ;
}
【题解】洛谷9月月赛加时赛 —— Never·island的更多相关文章
- 【LGR-070】洛谷 3 月月赛-官方题解
本次免费为大家提供[LGR-070]洛谷 3 月月赛的官方题解,点个赞再走呗! 代码就不上了,大家可以到别的博客上去找找!希望这篇博客能对你有所帮助!
- 【洛谷5月月赛】玩游戏(NTT,生成函数)
[洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- 洛谷4月月赛R2
洛谷4月月赛R2 打酱油... A.koishi的数学题 线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...
- 洛谷3月月赛 R1 Step! ZERO to ONE
洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...
- 【LGR-054】洛谷10月月赛II
[LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...
- 【LGR-051】洛谷9月月赛
[LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ...
随机推荐
- 人脸检测库libfacedetection介绍
libfacedetection是于仕琪老师放到GitHub上的二进制库,没有源码,它的License是MIT,可以商用.目前只提供了windows 32和64位的release动态库,主页为http ...
- c++ singleton
http://www.yolinux.com/TUTORIALS/C++Singleton.html
- Qt-第一个QML程序-1-项目工程的建立
这个小程序是我发的第一个完整的QMl程序,这个程序也会持续的更新,一步一步的完善起来,最后会有一个什么样的结果也是不知道,只是把自己目前掌握的QML相关的东西都慢慢的写进来,积累起来 先展示一下运行结 ...
- HDU - 3415(DP + 单调队列)
链接:HDU - 3415 题意:给出一个包含 n 个数的环,求满足长度大于 0 小于等于 k 的最大区间和. 题解:将数组加倍,形成环.求一个前缀和sum.枚举每一个sum[i],以 i 结尾的最大 ...
- 376. Binary Tree Path Sum【LintCode java】
Description Given a binary tree, find all paths that sum of the nodes in the path equals to a given ...
- Python数据分析基础——Numpy tutorial
参考link https://docs.scipy.org/doc/numpy-dev/user/quickstart.html 基础 Numpy主要用于处理多维数组,数组中元素通常是数字,索引值为 ...
- Python replace方法并不改变原字符串
直接给出结论:replace方法不会改变原字符串. temp_str = 'this is a test' print(temp_str.replace('is','IS') print(temp_s ...
- Java中String类
String类 一.String类的用途 对字符串的存储与操作,即包含多个字符的字符数据,这个String类提供了数值不可改变的字符串. String类为什么不可改变的字符串,因为String类是fa ...
- POJ 1113 Wall(计算几何の凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- c# 读取xml文件 编写form
主要思想:xml保存控件的数据,c#读取出来并加以显示. 难点:1.控件有父容器和子控件的关系:2.控件事件的添加. 1.控件有父容器和子控件的关系: 可以用绝对坐标在xml文件中先读取子控件再读取父 ...