【题解】洛谷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 ...
随机推荐
- CF 1042 E. Vasya and Magic Matrix
E. Vasya and Magic Matrix http://codeforces.com/contest/1042/problem/E 题意: 一个n*m的矩阵,每个位置有一个元素,给定一个起点 ...
- 使用QUIC
QUIC是Google新开发的一个基于UDP的协议,它提供了像TCP一样的传输可靠性保证,可以实现数据传输的0-RTT延迟,灵活的设计使我们可以对它的拥塞控制及流量控制做更多的定制,它还提供了传输的安 ...
- 客户端SDK测试思路
本文来自网易云社区 作者:万春艳 是什么 客户端SDK是为第三方开发者提供的软件开发工具包,包括SDK接口.开发文档和Demo示例等.SDK和应用之间是什么关系呢?以云信即时消息服务为例,如下图所示, ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(上)
第1章.基础篇(上) Abstract:文档树.节点操作.属性操作.样式操作.事件 DOM (Document Object Model) - 文档对象模型 以对象的方式来表示对应的html,它有一系 ...
- bug 调试
系统性能分析中,CPU.内存和 IO 是主要关注项.----系统层面 1. 对于 CPU,如果是常见的 Linux,可以先用 top 命令查看负载状况. top -H -p [pid] pstree ...
- halcon安装提示could not write updated path to HKLM
halcon安装提示could not write updated path to HKLM 我们在安装Halcon软件时,会弹出如上图错误信息,这个错误信息提示软件无法写入本地注册表,造成这个原因有 ...
- Python+Opencv实现把图片转为视频
1. 安装Opencv包 在Python命令行输入如下命令(如果你使用的Anaconda,直接进入Anaconda Prompt键入命令即可.如果你不知道Anaconda是什么,可以参考王树义老师的文 ...
- UVa 1586 - Molar Mass - ACM/ICPC Seoul 2007 - C语言
关键在于判断数字是两位数还是单位数,其他部分没有难度. #include"stdio.h" #include"string.h" #include"c ...
- java鼠标操控小程序
最近在做一个软工的屏幕监控软件,已经实现了屏幕图片的传输,但是没有鼠标,才发现键盘上的PtrScSysRq键所截到图是没有鼠标信息的.== 暂时只需实现鼠标的移动事件,用robot.mouseMove ...