P2483-[模板]k短路/[SDOI2010]魔法猪学院【主席树,堆】

正题

题目链接:https://www.luogu.com.cn/problem/P2483


题目大意

给出一个nnn个点mmm条边的一张带权有向图,求一个最大的kkk使得1∼n1\sim n1n的前kkk短路径长度和不超过EEE

2≤n≤5000,1≤m≤2×105,1≤E≤1072\leq n\leq 5000,1\leq m\leq 2\times 10^5,1\leq E\leq 10^72n5000,1m2×105,1E107


解题思路

我们先把从nnn出发的一棵反向最短路树跑出来,注意这里的最短路树是真的一棵树,我们从DAGDAGDAG中随便提一些边出来构成一棵树,以nnn为根。

然后考虑我们将其他的路径中不在树上的路径拿出来,那么这些边肯定满足前一条边的终点ttt肯定在后一条边起点sss的子树中。

如果我们能确定这样一个有序的边集就相当于确定了这样一条唯一的路径。

然后考虑一条边(x,y,w)(x,y,w)(x,y,w)的边权视为disy−disx+wdis_y-dis_x+wdisydisx+w,这样最终的路径长度就是dis1dis_1dis1加上这些边的权值和。

然后考虑怎么去扩展我们的方案,假设我们现在的边集EEE的倒数第一个和最后一个分别是(x′,y′,w′),(x,y,w)(x',y',w'),(x,y,w)(x,y,w),(x,y,w)

那么我们有两种扩展方式:

  1. 在最后加一条边,这条边的起点一点得是yyyyyy的祖先。
  2. 替换最后一条边,这条边必须是起点是y′y'y或其祖先中恰好比当前这条边权大的边。

因为有重复边权,我们还是给每条边一个具体的顺序。

然后用堆维护最后两条边的状态就好了,主席树维护每个点其祖先的所有出边的一棵权值线段树。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10,M=N<<5;
const double eps=1e-8;
struct edge{int x,y;bool ban;double w;
}e[N];
struct node{int to,next,w;
}a[N];
int n,m,tot,ans,ls[N],ban[N],fa[N],rt[N];
double f[N],k;bool v[N];map<int,int> u[N];
vector<int> T[N],ot[N];
priority_queue<pair<double,int> >_q;
priority_queue<pair<double,pair<int,int> > >q;
struct SegTree{int cnt,w[M],ls[M],rs[M];int Change(int x,int L,int R,int pos){int p=++cnt;w[p]=w[x]+1;if(L==R)return p;int mid=(L+R)>>1;if(pos<=mid)ls[p]=Change(ls[x],L,mid,pos),rs[p]=rs[x];else rs[p]=Change(rs[x],mid+1,R,pos),ls[p]=ls[x];return p;}int Ask(int x,int L,int R,int k){if(k>R||!w[x])return 0;if(L==R)return L;int mid=(L+R)>>1;if(k>mid)return Ask(rs[x],mid+1,R,k);int ans=Ask(ls[x],L,mid,k);if(!ans)ans=Ask(rs[x],mid+1,R,k);return ans;}
}S;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void dij(){for(int i=1;i<n;i++)f[i]=1e100;_q.push(mp(0,n));while(!_q.empty()){int x=_q.top().second;_q.pop();if(v[x])continue;v[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(f[x]+e[a[i].w].w<f[y]){f[y]=f[x]+e[a[i].w].w;ban[y]=a[i].w;fa[y]=x;_q.push(mp(-f[y],y));}}}return;
}
bool cmp(edge x,edge y)
{return x.w<y.w;}
void dfs(int x){for(int i=0;i<ot[x].size();i++)rt[x]=S.Change(rt[x],1,m,ot[x][i]);for(int i=0;i<T[x].size();i++)rt[T[x][i]]=rt[x],dfs(T[x][i]);return;
}
void solve(){int x=S.Ask(rt[1],1,m,0);q.push(mp(-f[1]-e[x].w,mp(1,x)));while(!q.empty()){double w=-q.top().first;int x=q.top().second.first;int y=q.top().second.second;q.pop();if(k+eps<w){ans++,ans--;return;}k-=w;ans++;int p=S.Ask(rt[e[y].y],1,m,1);if(p)q.push(mp(-w-e[p].w,mp(e[y].y,p)));p=S.Ask(rt[x],1,m,y+1);if(p)q.push(mp(-w+e[y].w-e[p].w,mp(x,p)));}
}
int main()
{
//	freopen("P2483_3.in","r",stdin);scanf("%d%d%lf",&n,&m,&k);for(int i=1;i<=m;i++){scanf("%d%d%lf",&e[i].x,&e[i].y,&e[i].w);addl(e[i].y,e[i].x,i);}dij();if(k<f[1])return puts("0")&0;k-=f[1];ans++;for(int i=1;i<n;i++)e[ban[i]].ban=1;for(int i=1;i<n;i++)T[fa[i]].push_back(i);for(int i=1;i<=m;i++)if(!e[i].ban&&e[i].x!=n)e[i].w=f[e[i].y]+e[i].w-f[e[i].x];else swap(e[i],e[m]),m--,i--;sort(e+1,e+1+m,cmp);for(int i=1;i<=m;i++)ot[e[i].x].push_back(i);dfs(n);solve();printf("%d\n",ans);return 0;
}

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

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

相关文章

.NET Core开发日志——OData

简述OData&#xff0c;即Open Data Protocol&#xff0c;是由微软在2007年推出的一款开放协议&#xff0c;旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。类库在.NET Core中想要使用OData功能的话需要添加Microsoft.AspNetCore.OData包。dotnet add package M…

数论四之综合训练——Magic Pairs,Crime Management,Top Secret,组合数问题

数论综合训练Magic PairsproblemsolutioncodeCF107D Crime ManagementproblemsolutioncodeUVA12183 Top SecretproblemsolutioncodeP3746 [六省联考2017]组合数问题problemsolutioncodeMagic Pairs problem 已知A0xB0y≡0(modn)A_0xB_0y\equiv 0\pmod nA0​xB0​y≡0(modn)恒…

P6776-[NOI2020]超现实树

正题 题目链接:https://www.luogu.com.cn/problem/P6776 题目大意 定义一次操作为将一棵树的叶子换成另一棵树。 定义一棵树TTT的grow(T)grow(T)grow(T)表示所有树TTT能够通过操作变成的树的集合。 现在给出mmm棵树TiT_iTi​&#xff0c;定义SSS为所有grow(Ti)grow(T_i)grow…

CodeForces:749(div1)750(div2)

文章目录前言CF450A Jzzhu and ChildrenDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF450B Jzzhu and SequencesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF449A Jzzhu …

Steins;Game Gym - 102798J(未解决)

Steins;Game Gym - 102798J 题意&#xff1a; 给定n堆石子a&#xff0c;每堆石子被染成了黑色或者白色&#xff0c;现在两个人轮流进行以下的其中一个操作&#xff1a; 1、从石子数量最少的一个黑色石堆中拿走若干石子 2、从任意一个白色石堆中拿走若干石子 两个人都采取最优…

ML.NET 0.10特性简介

IDataView被单独作为一个类库包IDataView组件为表格式数据提供了非常高效的处理方式&#xff0c;尤其是用于机器学习和高级分析应用。它被设计为可以高效地处理高维数据和大型数据集。并且也适合处理属于更大的分布式数据集中的单个数据区块结点。在ML.NET 0.10中&#xff0c;I…

模板:模拟退火

文章目录前言解析流程示例代码trick所谓模拟退火&#xff0c;就是通过代码模拟退火 &#xff08;逃&#xff09; 前言 终于学了这个神奇的骗分算法 几次在大赛中都发现这算法是真的有学的必要 FFC可能真的要想想自己的题目对OI界的导向作用了 但学完以后还是感觉挺有意思的&a…

讨“动态规划“檄

我一直遵循着人不犯我我不犯人的原则&#xff0c;但是鉴于动态规划(dp)三番两次的挑衅&#xff0c;我忍无可忍决定发起反击&#xff0c;特写本文记录一下。 (本文整理一下以前做过的dp问题&#xff0c;并且把之前囤的大量dp都做做) acwing提高组 第一章 动态规划 背包模型题目集…

数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

容斥的神[HAOI2008]硬币购物problemsolutioncodeCF559C Gerald and Giant Chessproblemsolutioncode[SCOI2010]幸运数字problemsolutioncodeCF997C Sky Full of Starsproblemsolutioncode已经没有什么好害怕的了problemsolutioncode[JLOI2015]骗我呢problemsolutioncode容斥要么…

P4769-[NOI2018]冒泡排序【组合数学,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4769 题目大意 有一个冒泡排序的算法 输入&#xff1a;一个长度为 n 的排列 p[1...n] 输出&#xff1a;p 排序后的结果。 for i 1 to n dofor j 1 to n - 1 doif(p[j] > p[j 1])交换 p[j] 与 p[j 1] 的值然后给出一…

NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

前言我们都知道&#xff0c;API网关是工作在应用层上网关程序&#xff0c;为何要这样设计呢&#xff0c;而不是将网关程序直接工作在传输层、或者网络层等等更底层的环境呢&#xff1f;让我们先来简单的了解一下TCP/IP的五层模型。&#xff08;图片出自http://www.cnblogs.com/…

模板:长链剖分

所谓长链剖分&#xff0c;就是对长链进行剖分 &#xff08;逃&#xff09; 前言 很优雅的算法 利用对指针进行魔法操作将 n2n^2n2 的 dp 优化成线性 线性啊&#xff01;&#xff01;&#xff01; 解析 CF1009F Dominant Indices 给定一棵以 111 为根&#xff0c;nnn 个节点…

acwing 327. 玉米田

327. 玉米田 题意&#xff1a; m * n的土地&#xff0c;有的土地不育&#xff0c;有的可以种植&#xff0c;要求相邻的土地不能同时种植玉米&#xff0c;问有多少种种植方式 题解&#xff1a; 状压dp&#xff0c;先存每一行可能的状态&#xff0c;然后状态转移&#xff0c;…

Windows 10《描图》应用现已开源

点击上方蓝字关注“汪宇杰博客”《描图》是我最早的Windows 10应用&#xff0c;发布至今已3年多&#xff0c;积累了全球数百万用户&#xff0c;广受好评。现已开源。这款应用为不少小朋友带去了欢乐&#xff0c;体验绘画的乐趣&#xff0c;也帮助过专业用户复刻数百幅古代绘画。…

数论六之计算几何干货——计算几何模板解释全集 及 模板检验训练场

文章目录点和向量及运算直线和线段求解点到直线的距离/点在直线上求解点到线段的距离/点在线段上求解两条线段是否相交求解两直线的交点多边形求解多边形面积求解多边形重心求解判断定点与多边形的位置关系凸包graham扫描法graham扫描法加强版圆求解圆与直线的交点求解圆与圆的…

P7740-[NOI2021]机器人游戏【dp,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P7740 题目描述 题目大意摸了 小 R 有 mmm&#xff08;1≤m≤10001 \le m \le 10001≤m≤1000&#xff09;个机器人和 mmm 张纸带&#xff0c;第 iii&#xff08;1≤i≤m1 \le i \le m1≤i≤m&#xff09;个机器人负责对第 …

CodeForces:54

文章目录前言CF54A PresentsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCF54B Cutting Jigsaw PuzzleDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF54C First Digit LawDescription\text{Desc…

[NOIP2016 提高组] 愤怒的小鸟

[NOIP2016 提高组] 愤怒的小鸟 题意&#xff1a; 有n只猪&#xff0c;给出猪的坐标(xi,yi),问最少用几个形如 yax^2bx 的曲线可以保证所有猪在曲线上&#xff0c;满足a<0,a,b为实数 n<18, 题解&#xff1a; 两个方法&#xff1a;爆搜或者状压dp 状压dp 看n<18也…

P5208-[WC2019] I 君的商店【交互,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P5208 题目大意 有一个长度为nnn的010101序列aaa&#xff0c;你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。 交互库只会告诉你S≤TS\leq TS≤T或者…

模板:后缀数组(SA)

文章目录前言解析后缀排序优化1&#xff1a;基数排序优化2&#xff1a;简化第一次排序优化3&#xff1a;提前break完整代码LCP与height所谓后缀数组&#xff0c;就是存储后缀的数组 &#xff08;逃&#xff09; 前言 为什么一个算法&#xff0c;如此难以理解却依然是成为一个…