首页 > 其他分享 >P6302 [NOI2019] 回家路线 加强版

P6302 [NOI2019] 回家路线 加强版

时间:2023-08-27 11:22:14浏览次数:42  
标签:2000001 加强版 决策 P6302 times tail INF NOI2019

P6302 [NOI2019] 回家路线 加强版

斜率优化好题。

观察后猜想应该是 dp。经过思考发现如果以点为状态,在时间这一维上是存在后效性的,而如果开二维数组 \(f_{i,j}\) 表示在第 \(j\) 个时刻到了 \(i\) 个点过不去加强版,考虑以列车为状态。

题目有两个限制,一是出发点和结束点的限制,即上一辆车的 \(y\) 是下一辆车的 \(x\),二是时间的限制,即上一辆车的 \(q\) 要不大于下一辆车的 \(p\)。

对于第一条,考虑采用类似柠檬的处理方式,每一个节点开一个 vector 维护决策,转移第 \(i\) 辆车的时候直接从 \(x_i\) 的决策中转移。

而对于第二条,先按照 \(p_i\) 排序,但是这样有可能会导致 \(p_{i-1}\) 小但是 \(q_{i-1}\) 非常大,后一个虽然 \(p_i\) 相对变大但是 \(q_i\) 可能小于前一个的 \(q_{i-1}\),这样添加决策是无序的,转移的限制也没有解决。

注意到随着 \(p_i\) 的增大,决策集合只变大不缩小,所以可以再按照 \(q_i\) 排序,使用双指针的思想,每次转移前先把可用的决策扔进决策集合(这些决策一定在前面转移好了),这样就解决了时间的限制。

设 \(f_i\) 表示坐了第 \(i\) 辆车的最小烦躁值,容易得到转移方程

\[f_i=min(f_j+A\times (p_i-q_j)^2+B\times (p_i-q_j)+C) \]

有包含 \(i,j\) 的平方项,很像斜率优化的标准形式,拆开,移项,整理得到:

\[f_j+A\times q_j^2-B\times q_j=2Ap_iq_j+f_i-C-A\times p_i^2 \]

单调队列维护下凸壳即可。

注意计算斜率时可能会出现横坐标相等的情况,需要特判为 \(INF\) 或 \(-INF\)。

代码比较烂,请见谅。。

int n,m,A,B,C,ans=INF,pos[2000001],oth[2000001],f[2000001],sum[2000001],head[2000001],tail[2000001];
vector<int> ve[2000001];
struct Node{int x,y,p,q,id;}a[2000001],b[2000001];
bool cmp1(Node nd1,Node nd2){return nd1.p<nd2.p;}
bool cmp2(Node nd1,Node nd2){return nd1.q<nd2.q;}
#define sqr(x) ((x)*(x))
#define Y(i) (f[oth[i]]+A*sqr(b[i].q)-B*b[i].q)
#define X(i) (2*A*b[i].q)
#define K(i,j) (X(i)==X(j)?Y(i)>Y(j)?INF:-INF:1.0*(Y(i)-Y(j))/(X(i)-X(j)))
#define dty(i,j) (Y(i)-Y(j))
#define dtx(i,j) (X(i)-X(j))
inline void mian()
{
	read(n,m,A,B,C),memset(f,-1,sizeof(f)),f[0]=0,f[2000000]=inf,oth[2000000]=2000000;
	for(int i=1;i<=m;++i)read(a[i].x,a[i].y,a[i].p,a[i].q),a[i].id=i,++sum[a[i].y],b[i]=a[i];
	sort(a+1,a+1+m,cmp1),sort(b+1,b+1+m,cmp2);
	for(int i=1;i<=n;++i)ve[i].resize(sum[i]+3),i==1?0:ve[i][head[i]=tail[i]=1]=2000000;
	for(int i=1;i<=m;++i)pos[a[i].id]=i;
	for(int i=1;i<=m;++i)oth[i]=pos[b[i].id];
	head[1]=tail[1]=1;
	for(int i=1,j=0;i<=m;++i)
	{
		while(j<m&&b[j+1].q<=a[i].p)
		{
			++j;
			while(head[b[j].y]<tail[b[j].y]&&K(ve[b[j].y][tail[b[j].y]],ve[b[j].y][tail[b[j].y]-1])>K(j,ve[b[j].y][tail[b[j].y]]))--tail[b[j].y];
			ve[b[j].y][++tail[b[j].y]]=j;
		}
		while(head[a[i].x]<tail[a[i].x]&&K(ve[a[i].x][head[a[i].x]+1],ve[a[i].x][head[a[i].x]])<=(ld)a[i].p)
		++head[a[i].x];
		f[i]=f[oth[ve[a[i].x][head[a[i].x]]]]+A*sqr(a[i].p-b[ve[a[i].x][head[a[i].x]]].q)+B*(a[i].p-b[ve[a[i].x][head[a[i].x]]].q)+C;
		if(a[i].y==n)ans=min(ans,f[i]+a[i].q);
	}
	write(ans,'\n');
}

标签:2000001,加强版,决策,P6302,times,tail,INF,NOI2019
From: https://www.cnblogs.com/WrongAnswer90-home/p/17660004.html

相关文章

  • P5904 [POI2014] HOT-Hotels 加强版
    自然的想法是枚举共同的交点,然后进行换根dp,复杂度可以做到\(\mathcalO(n^2)\),可以通过简单版,但是显然过不了\(10^5\)的数据,考虑进行优化。记\((x,y,z)\)为满足要求的点,即满足\(a=b+c\),树形dp原则是子树内的信息无后效性,尽量把子树内的信息合并在一起。所以\(a-b=c\),......
  • P6604 [HNOI2016] 序列 加强版
    链接:P6604[HNOI2016]序列加强版首先,像这种题可以转化为计算贡献,即计算每一个元素成为最小值的次数。这个次数怎么求呢?显然单调栈模板,对于每一个数计算左边和右边第一个比它小的数\(l[i]\)和\(r[i]\)。CODE1:for(inti=1;i<=n;i++){ while(k&&a[i]<a[sta[k]]){ k--; ......
  • 洛谷 U321190 麻将 加强加强版 题解
    Description给定一副\(k\)张牌的麻将牌,求能「听」哪些牌。对于所有数据,\(1\leqk\leq2\times10^5\)。link:https://www.luogu.com.cn/problem/U321190Solution算法零枚举「听」的牌,用状压DP或者贪心判断。时间复杂度\(\mathcal{O}(2^n\text{poly}(n))\)或\(\mathca......
  • 洛谷 P4931 [MtOI2018] 情侣?给我烧了!(加强版)
    洛谷传送门设\(f_i\)为\(i\)对情侣完全错位的方案数,那么答案为:\[\binom{n}{k}\frac{n!}{(n-k)!}2^kf_{n-k}\]分别代表选择\(k\)对情侣,选择它们的位置,情侣可以换位。\(f_i\)有递推公式:\[f_i=4i(i-1)(f_{i-1}+2(i-1)f_{i-2})\]考虑选出两个人,另外......
  • P6109 [Ynoi2019] rprmq1
    LuoguP6109[Ynoi2009]rprmq1LuoguP6109题目背景我谔谔本题读入量约13MB,输出量约7MB,请选择合适的输入输出方法题目描述有一个\(n\timesn\)的矩阵\(a\),初始全是\(0\),有\(m\)次修改操作和\(q\)次查询操作,先进行所有修改操作,然后进行所有查询操作。一次修改......
  • P5471 [NOI2019] 弹跳
    我只会签到题.jpg。显然可以使用二维线段树优化建图拿到一定的部分分,但是这并不优秀。考虑从值域上来入手dijkstra。看做是装置间的最短路顺带更新节点,那么我们可以写一个树套树来维护这一些待更新的点,因为dist是递增的,所以可以更新后删去这些点,然后就可以\(n\logn\)的空......
  • GLM 大加强,清华团队推出 GLM 联网加强版 WebGLM!
    夕小瑶科技说原创作者|小戏、ZenMoore大模型生成答案不可靠?一种很直接的思路就是结合传统的搜索引擎的“知识”来对大模型进行一次检索增强。其实早在InstructGPT面世以前,OpenAI就发布了可以用作搜索结果聚合的模型WebGPT,WebGPT基于GPT-3试图模仿人类的“搜索行为”......
  • P5372 SNOI2019 积木
    P5372SNOI2019积木不难想到图论建模(也没啥别的思路了),考虑用一张图刻画网格板上的任意一种状态:图有\(n\timesm\)个点,形成点阵,和网格板对应。网格板上,一个积木对应一条边,积木占据的两个格子,对应这条边连接的两个点。比如第一个样例中,起始时的网格板状态:33nnnuuuo<>......
  • P5391 [Cnoi2019]青染之心
    P5391[Cnoi2019]青染之心洛谷:P5391[Cnoi2019]青染之心Solution把每次(add)询问看成一个节点,原问题相当于以dfs序给定一棵树,对每个节点求其到根的一条链上做一遍完全背包的答案。考虑直接树形转移,时间复杂度为\(O(qV)\),可以接受。但空间复杂度就不行了。最无脑的dp设计就......
  • [Ynoi2019 模拟赛] Yuno loves sqrt technology I
    题目Link分块,首先预处理所有整块之间的答案,这部分用类似莫队二离的手法可以改成\(O(n)\)次插入和\(O(n\sqrt{n})\)查询,然后根号平衡一手做到\(O(n\sqrt{n})\);空间自然也是能线性的。当然更直白的说法是,直接预处理\(f(i,j)\)表示前\(i\)块中\(>j\)的元素个数。然后考......