有趣有趣~ヾ(✿゚▽゚)ノ真的很有意思的一道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的更多相关文章

  1. 【LGR-070】洛谷 3 月月赛-官方题解

    本次免费为大家提供[LGR-070]洛谷 3 月月赛的官方题解,点个赞再走呗! 代码就不上了,大家可以到别的博客上去找找!希望这篇博客能对你有所帮助!

  2. 【洛谷5月月赛】玩游戏(NTT,生成函数)

    [洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ...

  3. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  4. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  5. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  6. 洛谷4月月赛R2

    洛谷4月月赛R2 打酱油... A.koishi的数学题  线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...

  7. 洛谷3月月赛 R1 Step! ZERO to ONE

    洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...

  8. 【LGR-054】洛谷10月月赛II

    [LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...

  9. 【LGR-051】洛谷9月月赛

    [LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ...

随机推荐

  1. 5 多进程copy文件

    1.如何进行开发? 2.版本1:程序大框架 #1.创建一个文件夹 #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 3.版本2:创建一个文件夹 1 ...

  2. java.lang.RuntimeException: HRegionServer Aborted

    java.lang.RuntimeException: HRegionServer Aborted 当我们启动hbase集群的时候,刚启动时每个节点上的进程都显示正常,过一会其他两个节点上的HRegi ...

  3. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  4. SpringBoot学习:获取yml和properties配置文件的内容

    项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...

  5. libevent学习五(Helper functions and types for Libevent)

    基础类型   #ifdef WIN32 #define evutil_socket_t intptr_t #else #define evutil_socket_t int #endif ev_ssi ...

  6. android分析windowManager、window、viewGroup之间关系(一)

    本文将主要介绍addview方法,在windowManager.window.viewGroup中的实现原理.首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数wind ...

  7. 接口文档神器--apiui的使用

    接口开发,最麻烦的就是写文档了,曾经我也因为写接口文档苦不堪言:自从使用了apiui接口文档神器,工作效率和文档清晰得到了不止一个档次的提升. 下面介绍一下这个神器的使用: 把文件下载下来,放在网站根 ...

  8. spring boot 报错 Error creating bean with name

    Application 启动类 要和父目录平级

  9. 机器学习介绍(introduction)-读书笔记-

    一,什么是机器学习 第一个机器学习的定义来自于 Arthur Samuel.他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域.Samuel 的定义可以回溯到 50 年代,他编写了一个 ...

  10. leetcode个人题解——#24 Swap Nodes in Pairs

    因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...