\(\mathcal{Description}\)

  Link.

  给定 \(n\) 个区间,第 \(i\) 个为 \([l_i,r_i]\),有权值 \(w_i\)。设一无向图 \(G=(V=\{1,2,\dots,n\},E)\),\((u,v)\in E\Leftrightarrow [l_u,r_u]\cap[l_v,r_v]\not=\varnothing\),求删除若干区间使得 \(G\) 无环的被删除区间权值和的最小值。

  \(n\le2.5\times10^5\)。

\(\mathcal{Solution}\)

  不要学了 DP 就只想 DP,优化不来麻烦推翻重来。

  首先 \(G\) 的合法条件等价于不存在三区间交于一点,这是一个经典费用流流模型,建图方法略。

  当然直接 Dinic 啥的直接挂掉,考虑到只需要增广两次,可以使用势能 Dijkstra + EK 算法求最小费用最大流。概括上来说,令 \(u\) 的势能 \(h_u\) 为累加的 \(d_u\) 之和,使得此时图上 \(w(u,v)+h_u-h_v\) 非负,就能跑 Dijkstra 了。本题只用增广两次,所以在初始 DAG 上求出 \(h\) 后甚至不必更新。

  具体讲解:OneInDark %%%.

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <queue>
#include <cstdio>
#include <iostream> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL;
typedef std::pair<LL, int> PLI;
#define fi first
#define se second template<typename Tp>
inline Tp tmin( const Tp& a, const Tp& b ) { return a < b ? a : b; } const int MAXN = 2.5e5, MAXV = 5e5;
const LL LINF = 1ll << 60;
int n, ecnt = 1, mxp, head[MAXV + 5];
struct Edge { int to, flw; LL cst; int nxt; } graph[( MAXV + MAXN ) * 2 + 5];
LL hgt[MAXV + 5], dis[MAXV + 5];
int pre[MAXV + 5], flw[MAXV + 5]; inline void link( const int s, const int t, const int f, const LL c ) {
graph[++ecnt] = { t, f, c, head[s] }, head[s] = ecnt;
graph[++ecnt] = { s, 0, -c, head[t] }, head[t] = ecnt;
} inline void getHeight() {
hgt[0] = 0;
rep ( u, 0, mxp - 1 ) {
for ( int i = head[u]; i; i = graph[i].nxt ) if ( graph[i].flw ) {
hgt[graph[i].to] = tmin( hgt[graph[i].to], hgt[u] + graph[i].cst );
}
}
} inline bool dijkstra() {
static bool vis[MAXV + 5];
static std::priority_queue<PLI, std::vector<PLI>, std::greater<PLI> > heap;
rep ( i, 0, mxp ) pre[i] = flw[i] = 0, dis[i] = LINF, vis[i] = false; heap.push( { dis[0] = 0, 0 } ), flw[0] = 2;
while ( !heap.empty() ) {
PLI p( heap.top() ); heap.pop();
if ( vis[p.se] ) continue;
vis[p.se] = true; for ( int i = head[p.se], v; i; i = graph[i].nxt ) {
LL d = p.fi + graph[i].cst + hgt[p.se] - hgt[v = graph[i].to];
if ( graph[i].flw && dis[v] > d ) {
heap.push( { dis[v] = d, v } );
pre[v] = i, flw[v] = tmin( flw[p.se], graph[i].flw );
}
}
}
return dis[mxp] != LINF;
} int main() {
std::ios::sync_with_stdio( false ), std::cin.tie( 0 ); std::cin >> n;
rep ( i, 1, n ) {
int s, e; LL w; std::cin >> s >> e >> w, ++e;
link( s, e, 1, -w ), mxp = mxp < e ? e : mxp;
}
rep ( i, 0, mxp - 1 ) link( i, i + 1, 2, 0 ); getHeight();
LL ans = 0;
while ( dijkstra() ) {
for ( int u = mxp; u; u = graph[pre[u] ^ 1].to ) {
graph[pre[u]].flw -= flw[mxp], graph[pre[u] ^ 1].flw += flw[mxp];
}
ans += ( dis[mxp] + hgt[mxp] - hgt[0] ) * flw[mxp];
} std::cout << -ans << '\n';
return 0;
}

Solution -「Gym 102759F」Interval Graph的更多相关文章

  1. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  2. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

  3. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  4. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  5. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  6. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  7. Solution -「Gym 102956A」Belarusian State University

    \(\mathcal{Description}\)   Link.   给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...

  8. Solution -「Gym 102798I」Sean the Cuber

    \(\mathcal{Description}\)   Link.   给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数.   数据组数 \(T\le2.5\times10^5\). ...

  9. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

随机推荐

  1. HDU-2010.水仙花数(C语言描述)

    Problem Description     春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方和 ...

  2. Git 的基本命令的使用

    1.获得Git仓库(克隆一份代码到本地仓库) git clone url 2.更新本地的代码 git pull 3.查看本地修改的文件 git status 4.将本地的修改加到stage中 git ...

  3. BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 一.同步阻塞 (BIO) 同步阻塞IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不 做任何事情会造成不必要的线 ...

  4. 【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错

    golangci-lint.exe版本为1.31.0 执行:golangci-lint.exe run d:\source\github.com\ahfuzhang\go_xxx_server\src ...

  5. MySQL的MyISAM与InnoDB的索引方式

    在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tr ...

  6. axios请求的封装

    /* axios的请求封装 */         //axios的原生写法get,post请求         //第一个参数为请求地址,第二个参数为请求的参数,params是将参数拼接在url的后面 ...

  7. 集合框架-工具类-JDK5.0特性-函数可变参数

    1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...

  8. Linux下安装confluence汉化破解版

    Atlassian Confluence(简称Confluence)是一个专业的wiki程序.它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享.Confluence 不是一个开源软件 ...

  9. 『无为则无心』Python函数 — 39、Python中异常的传播

    目录 1.异常的传播 2.如何处理异常 1.异常的传播 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播.如果函数中没有对异常进行处理,则异常会继续向函数调用者传播.如果函数调 ...

  10. python网络爬虫-python基础(三)

    python安装 Anaconda的python科学计算环境,只需要想普通软件一样安装就可以把python的环境变量.解释器.开发环境都安装到计算机中 除此之外anaconda还提供众多的科学计算的包 ...