\(\mathcal{Description}\)

  Link.

  给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被选择一个。求前 \(k\) 小的选择代价。

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

\(\mathcal{Solution}\)

  建图,边形如 \(\lang i,i+j,w_i\rang~(j=1,2,3)\),再引入左右两个虚点 \(s,t\),那么每种方案对应从 \(s\) 到 \(t\) 的一条路径,题目即求无负权图上的前 \(k\) 小路径,是道模板题,很可惜我并不会。(

  还是用前 \(k\) 小的一贯套路:用堆维护,每次取当前最优方案扩展。首先在建出以 \(t\) 为根的内向最短路树,考虑用一条非树边 \(\lang u,v,w\rang\) 替换最短路 \(P=\lang s,\cdots,t\rang\) 的一段,则有 \(P'=\lang s,\cdots,u,v,\cdots,t\rang\),且满足 \(w(P')=d_S-d_u+w+d_v\),其中 \(d_u\) 即 \(u\) 到 \(t\) 的最短路。这样我们得到了扩展一次的方法:取 \(s\) 到 \(t\) 最短路的邻接边 \(\lang u,v,w\rang\) 中,\(d_v+w-d_u\) 最小的边替换最短路。

  如果替换多条边呢?可以发现有两种替换方法:

  • 将当前最优的 \(\lang u,v,w\rang\) 替换为新的 \(\lang u,v',w'\rang\);
  • 在当前 \(\lang u,v,w\rang\) 的基础上,取 \(v\) 到 \(t\) 最短路的邻接边扩展。

  那么用可持久化左偏树维护每个点到 \(t\) 的可用邻接边集合即可支持扩展。设图的点数为 \(n\),边数为 \(m\),整个复杂度则为 \(\mathcal O((m+k)\log m)\),本题则有 \(\mathcal O((n+k)\log n)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#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;
typedef std::pair<int, int> PII;
#define fi first
#define se second const int MAXN = 2.5e5;
int n, m, pre[MAXN + 5], root[MAXN + 5];
LL dis[MAXN + 5];
std::vector<PII> oriG[MAXN + 5], revG[MAXN + 5]; struct PersistentLeftistTree {
static const int MAXND = 3e7;
int node, ch[MAXND + 5][2], rds[MAXND + 5];
PLI val[MAXND + 5]; // (cost, end point). inline int newnd( const PLI& v ) {
val[++node] = v, ch[node][0] = ch[node][1] = 0, rds[node] = 1;
return node;
} inline int merge( int x, int y ) {
if ( !x || !y ) return x | y;
if ( val[x] > val[y] ) std::swap( x, y );
int u = newnd( val[x] );
ch[u][0] = ch[x][0], ch[u][1] = merge( ch[x][1], y );
if ( rds[ch[u][1]] > rds[ch[u][0]] ) std::swap( ch[u][0], ch[u][1] );
return rds[u] = rds[ch[u][1]] + 1, u;
}
} plt; inline void link( const int s, const int t, const int w ) {
oriG[s].push_back( { t, w } ), revG[t].push_back( { s, w } );
// std::cerr << s << ' ' << t << ' ' << w << '\n';
} inline void dijkstra() {
static std::priority_queue<PLI, std::vector<PLI>, std::greater<PLI> > heap;
memset( dis, 0x3f, sizeof dis );
heap.push( { dis[n + 1] = 0, n + 1 } );
while ( !heap.empty() ) {
PLI p( heap.top() ); heap.pop();
if ( dis[p.se] < p.fi ) continue;
for ( const PII& e: revG[p.se] ) {
if ( dis[e.fi] > p.fi + e.se ) {
heap.push( { dis[e.fi] = p.fi + e.se, e.fi } );
pre[e.fi] = p.se;
}
}
}
} inline void solve() {
per ( u, n, 0 ) {
root[u] = root[pre[u]];
for ( const PII& v: oriG[u] ) {
if ( pre[u] != v.fi ) {
root[u] = plt.merge( root[u],
plt.newnd( { dis[v.fi] + v.se - dis[u], v.fi } ) );
}
}
} static std::priority_queue<PLI, std::vector<PLI>, std::greater<PLI> > heap;
std::cout << dis[0] << '\n';
if ( root[0] ) heap.push( { plt.val[root[0]].fi, root[0] } );
while ( --m ) {
if ( heap.empty() ) { std::cout << "-1\n"; continue; }
PLI p( heap.top() ); heap.pop();
std::cout << dis[0] + p.fi << '\n'; int u;
if ( ( u = plt.merge( plt.ch[p.se][0], plt.ch[p.se][1] ) ) ) {
heap.push( { p.fi - plt.val[p.se].fi + plt.val[u].fi, u } );
}
if ( ( u = root[plt.val[p.se].se] ) ) {
heap.push( { p.fi + plt.val[u].fi, u } );
}
}
} int main() {
std::ios::sync_with_stdio( false ), std::cin.tie( 0 ); std::cin >> n >> m;
rep ( i, 1, n ) {
int w; std::cin >> w;
rep ( j, 1, 3 ) {
if ( i + j <= n || ( i + j == n + 1 && j < 3 ) ) {
link( i, i + j, w );
}
}
}
link( 0, 1, 0 );
if ( n > 1 ) link( 0, 2, 0 ); dijkstra();
// rep ( i, 0, n + 1 ) std::cout << dis[i] << ' ' << pre[i] << '\n';
solve();
return 0;
}

Solution -「Gym 102979L」 Lights On The Road的更多相关文章

  1. Solution -「Gym 102979E」Expected Distance

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

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

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

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

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

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

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

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

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

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

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

  7. Solution -「Gym 102798K」Tree Tweaking

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

  8. Solution -「Gym 102798E」So Many Possibilities...

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...

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

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

随机推荐

  1. [ vue ] 监听v-model数据的变化,只要有变化就改变vuex的state值

    场景描述: 1. 注册弹出框是用 v-model 绑定数据  showRegisterModal  实现的,点击遮罩层框架会把  showRegisterModal=false 2.REGISTER按 ...

  2. nginx 超时时间配置说明

    做excel文件导入时 报 504 错误 是nginx网关超时导致 下面几个参数貌似没效果,反正我配置不起作用 这是有问题的配置属性 ,注意   于是我换了配置 ,放在http块里 ,配置生效了 #读 ...

  3. 修正了Model1模式,进入如今盛行的的Model2模式,也就是MVC模式

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513668601843548675/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...

  4. vue3.0+vite+ts项目搭建--基础配置(二)

    集成vue-router 使用yarn yarn add vue-router@next --save 安装完成之后在src目录下创建文件夹router/index.ts,创建完成之后需要在Vue-R ...

  5. SYCOJ#1077、01字符串

    题目-01字符串 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 ...

  6. 接口神器之 Json Server 详细指南

    简介 json-server 是一款小巧的接口模拟工具,一分钟内就能搭建一套 Restful 风格的 api,尤其适合前端接口测试使用. 只需指定一个 json 文件作为 api 的数据源即可,使用起 ...

  7. Vulnhub系列:Os-hackNos

    0x01环境搭建 靶机链接: https://www.vulnhub.com/entry/hacknos-os-hacknos,401/发布日期: 2019.11.27靶机描述: 描述 难度:容易中级 ...

  8. 18张图,详解SpringBoot解析yml全流程

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,项目里有一个需求,需要一个开关控制代码中是否执行一段逻辑,于是理所当然的在yml文件中配置了一个属性作为开关,再配合nacos就可 ...

  9. 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加

    如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.

  10. iPhone12和iPhone12pro的区别有什么?

    阅读全部 说法一 iPhone12和iPhone12pro的区别有:颜色.价格.运行内存.拍照.屏幕最高亮度.电池容量.材质.重量等,具体对比如下: 颜色:iPhone12五色可选,青春绚丽:iPho ...