P1220关路灯双log

加强版。课上讲到的经典例题,以下的时空 \(\mathcal O(n\log^2 V)\) 做法(\(V\) 为路灯位置值域)理论上是人尽皆知的,但是全网搜不到这么搞的题解,估计是这题太久远了。传统区间 DP 无法规避两维状态的问题在于,每次折返/拓展时要用新增时间计算两侧灯消耗的额外能量。考虑压缩状态,能否每次只计算一侧灯的消耗?直观来看,画出人关路灯的 \(t-x\) 图像(横轴为数轴上位置,纵轴时间;图丑见谅):

令第 \(i\) 盏灯坐标 \(a_i\),图像与 \(x=a_i\) 有交的最低纵坐标 \(y_i\),总能量消耗即为 \(\sum w_iy_i\)。那么考虑如图把图像与 \(x\) 轴围成的区域拆成最下方的两个三角(基础能耗)以及每次折返造成的平行四边形(额外能耗),模拟整个走路过程,在折返时把额外能耗加上以该点为顶点的平四“面积”(\(h\times \sum w_i\))。

这是一个最短路问题。定义 \(f_i\) 表示,在熄灭 \(i\) 时获得分身,能够从 \(i\) 同时前往 \(1\)\(n\) 并熄灭一路上的所有灯,造成额外能耗的最小值,答案即为 \(\min(f_1,f_n)\) 加上基础能耗。定义比较抽象,但是结合图像和贡献方式是好理解的,如图中 \(f_b\)\(f_a+\Diamond_2\) 转移而来,其值为 \(\Diamond_1+\Diamond_2\)。那么最短路边权式子容易写出:

\[W(i,j)=2(a_j-a_i)\sum_{k<i}w_k\quad(i\le c,j>c) \]

\(i\ge c,j<c\) 的情况同理。边有 \(\Theta(n^2)\) 条不能直接跑,但还是考虑 Dijkstra 的过程,初始确定 \(f_c=0\),每次取出 \(f_{\min}\) 进行松弛。首先 \(\min\) 从哪来?显然 \(f_i>f_{i+1}(i<c),f_i>f_{i-1}(i>c)\),那么你实际上就是对 \(f_c,\cdots,f_1\)\(f_c,\cdots,f_n\) 做归并,维护两个指针分别向左向右跑即可。其次如何松弛?上面式子就是在平面上加一条线段 \(\large y=\left(2\sum_{k<i}w_k\right)x-2a_i\sum_{k<i}w_k\),用它去更新所有线段中与 \(x=a_j\) 最靠下的交点,那么上李超线段树即可。

因为值域大要动态开点,所以空间也是 \(\log^2\) 的略显难受。不过线段的左右端点只有两种情况,应该有更优的实现。核心思路就是将两边目前必需的能耗写进一维状态,从而做到一次决策只用计算一边,虽然转移函数仍然是二元的,但是和另外一边呈线性关系,就可以转化为平面上的问题。另外,不知道能不能扩展到ABC219H。

#include <cstdio>
#include <algorithm>
#define ll long longusing namespace std;const int N=5141;int O;struct lin{ll k,b;ll val(int x){return k*(x>O?x-O:O-x)+b;}
};namespace sgt{struct node{int ls,rs;#define ls(x) t[x].ls#define rs(x) t[x].rs}t[N*100];lin g[N*100];int tot=1;int req(int &x){return x?x:x=++tot;}void dnf(int now,int ln,int rn,lin f){if(!g[now].k) return g[now]=f,void();int mid=ln+rn>>1;if(f.val(mid)<g[now].val(mid)) swap(f,g[now]);if(ln==rn) return ;if(f.val(ln)<g[now].val(ln)) dnf(req(ls(now)),ln,mid,f);if(f.val(rn)<g[now].val(rn)) dnf(req(rs(now)),mid+1,rn,f);}void upd(int now,int ln,int rn,int l,int r,lin f){if(l<=ln&&rn<=r) return dnf(now,ln,rn,f);int mid=ln+rn>>1;if(l<=mid) upd(req(ls(now)),ln,mid,l,r,f);if(r>mid) upd(req(rs(now)),mid+1,rn,l,r,f);}ll qry(int now,int ln,int rn,int k){ll res=g[now].k?g[now].val(k):1e18;if(ln==rn) return res;int mid=ln+rn>>1;if(k<=mid) res=min(res,qry(ls(now),ln,mid,k));else res=min(res,qry(rs(now),mid+1,rn,k));return res;}
}using namespace sgt;int a[N];ll w[N];//#include "xzr.hpp"int main()
{//wxd;//Xzr;int n,o;scanf("%d%d",&n,&o);for(int i=1;i<=n;++i) scanf("%d%lld",a+i,w+i);O=a[o];long long ans=0;int V=a[n];for(int i=1;i<o;++i) ans+=(O-a[i])*w[i],w[i]+=w[i-1];for(int i=n;i>o;--i) ans+=(a[i]-O)*w[i],w[i]+=w[i+1];upd(1,1,V,O,V,{2*w[o-1],0});upd(1,1,V,1,O,{2*w[o+1],0});for(int l=o-1,r=o+1;l||r<=n;){ll L=l?qry(1,1,V,a[l]):1e18,R=r<=n?qry(1,1,V,a[r]):1e18;if(L<R) upd(1,1,V,O,V,{2*w[l-1],2*(O-a[l])*w[l-1]+L}),--l;else upd(1,1,V,1,O,{2*w[r+1],2*(a[r]-O)*w[r+1]+R}),++r;}printf("%lld",ans+min(qry(1,1,V,a[1]),qry(1,1,V,a[n])));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879578.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xshell 8 Build 0066绿色特别版发布:功能强大且永久免费使用

软件介绍 Xshell 8 Build 0066 绿色特别版是一款强大且实用的远程连接与管理工具集。Xshell 本身就是备受赞誉的 Linux 远程连接工具,以及强大的 SSH 终端管理器,能帮助用户轻松管理远程服务器。而这个绿色特别版在原版基础上进行了深度优化和处理,由 zdBryan 精心打造。它基…

浏览器事件循环

宏任务浏览器执行的异步代码 eg:JS执行脚本事件、setTimeout/setInterval,ajax请求完成事件、用户交互事件等微任务Js引擎执行的异步代码 eg:Promise对象.then()的回调注意:Promise本身是同步的JS内代码执行流程 执行script脚本事件宏任务里面的同步代码,遇到宏任务/微任务…

《ESP32-S3使用指南—IDF版 V1.6》第四章 认识ESP-IDF

第四章 认识ESP-IDF 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK…

使用大模型

https://github.com/deepseek-ai/awesome-deepseek-integration/blob/main/docs/zotero/README_cn.md--- 她说, 她是仙,她不是神

spring之hellospring

高耦合的代码 我想要写一段程序,该程序有dao层和service层,dao层有接口UserDao,定义了一个方法叫做sayHello(),并且在dao层定义两个类MysqlDao和OracleDao,他们都实现了UserDao接口,并且实现了sayHello()方法,如图和代码所示 UserDao接口的代码如下package com.loubin.…

java调用deepseek

崩溃了几天的deepseek 接口官网今天终于好了:https://api-docs.deepseek.com/zh-cn/,打开一看貌似没有集成JAVA开发如下图,只有curl.python,nodejs三种形式既然可以curl形式调用接口理论上任何编程语言都可以调用。 第一步:引入pom依赖jar,习惯了使用okhttp<dependency>…

绩效考核:我做了很多上级却看不见怎么办?

“作为员工,我的每一天都是非常忙碌的,但是负责最后一环产出结果的不是我,得到称赞的总是别人。年终绩效考核也都是一些简单的指标项,没有办法体现出我日常的付出,绩效结果永远都是普通。” 上面这段话是众多员工的心声,然而他们不知道的是,作为管理者也很头疼这个问题。…

借助deepseek完成python的Deoldfiy黑白照着色工具

最近deepseek火热,试试看能否协助完成制作一款工具,用于给黑白照片着色。打开deepseek,注册完后,输入需求,给我推荐了deoldify,制作过程总结为以下几步: 1. Python环境搭建直接忽略 2.Deoldfiy依赖库下载安装,训练模型models下载(需要梯子) 3. 运行查看效果代码执行…

手搓指数函数实现

1.概况 最近博主有使用指数函数的需求,需要一条在第一象限、底数为10的曲线。但是由于芯片资源有限,所以无法使用数学库。不能调用数学库里面的指数函数。于是就在网上找了一圈,发现毫无质量。 1.只考虑到了整数次幂的简单情况。 2.要么就是调用数学库,没有一个有用的。 于…

淘宝详情页批量抓取组合商品价格

需求:客户需要抓取淘宝商品的不同组合价格,步骤如下图通过切换分类获取相应的价格 客户需求我们可以这样实现:循环点击产品分类,点击一次相应获取一次商品价格 1、首先商品价格,我们发现不同的商品参加活动不一,导致商品价格样式有多种如下2、商品价格样式的多样性使得价…

EvalPlanner:基于“计划-执行”双阶段的大语言模型评估框架

大语言模型(LLM)评估系统在生成思维链(Chain-of-Thought, CoT)序列时,需要系统地捕捉评估过程中的推理步骤。但是由于缺乏人工标注的CoT训练数据,以及预定义评估提示在复杂任务中的局限性,构建高质量的LLM评估模型面临重大挑战。另外手动调整评估指令的方法在面对多样化和复…

[网摘实践]基于本地部署DeepSeek+VSCode+Cline编写代码

前面的本地部署部分,我已经搭建好了。可以参考:https://www.cnblogs.com/haochuang/p/18700495 这里只是在本地基于模型搭建代码编写相关组件 使用deepseek-r1 + Vscode + Cline/Continue 构建本地代码编辑器 这个落地方案是实现本地代码编辑器,但是具体的效果见仁见智,pro…