首页 > 其他分享 >CF960F Pathwalks | 线段树优化DP

CF960F Pathwalks | 线段树优化DP

时间:2023-04-27 12:22:06浏览次数:51  
标签:Pathwalks Max CF960F int DP ans root 线段 dp

题目
设\(dp[x,w]\)为以结点\(x\)为结尾,且最后一条边边权为\(w\)的最长路径长度。
考虑根据顺序加边,对于边\((u,v)\),更新

\[dp[v,w] = \max_{w' < w}\{dp[u,w']\} + 1 \]

对于每个节点,建一棵线段树,维护\(dp[x]\),这样每次更新\(dp[v,w]\)就相当于在\(dp[u]\)所对应的线段树中查询\([0,w - 1]\)的最大值(注意,左端点是0),并且将更新好的答案update到\(dp[v]\)所对应树中。
因为每个点都开一个线段树开不下,考虑动态开点。

# include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n,m; 
struct node
{
	int ls,rs,Max;
}T[N * 20];
int tot = 0;
int rt[N];
int maxl;
void update(int &root,int l,int r,int x,int d)
{
	if(!root) root = ++tot;
	if(l == r)
	{
		T[root].Max = max(T[root].Max,d);
		return;
	}
	int mid = (l + r) >> 1; 
	if(x <= mid) update(T[root].ls,l,mid,x,d);
	else update(T[root].rs,mid + 1,r,x,d);
	T[root].Max = max(T[T[root].ls].Max,T[T[root].rs].Max);
	return;
}
int query(int root,int l,int r,int s,int t)
{
	if(root == 0) return 0;
	if(l <= s && t <= r) return T[root].Max;
	int mid = (s + t) >> 1,ans = 0;
	if(l <= mid) ans = query(T[root].ls,l,r,s,mid);
	if(r > mid) ans = max(ans,query(T[root].rs,l,r,mid + 1,t));
	return ans;
}
int main(void)
{
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= m; i++)
	{
		int u,v,w; scanf("%d%d%d",&u,&v,&w);
		int cur = query(rt[u],0,w - 1,0,1e5) + 1; 
		maxl = max(maxl,cur);
		update(rt[v],0,1e5,w,cur);
	}
	printf("%d\n",maxl);
	return 0;
}

标签:Pathwalks,Max,CF960F,int,DP,ans,root,线段,dp
From: https://www.cnblogs.com/luyiming123blog/p/17358578.html

相关文章

  • DP 概论
    对于一个题目,我们有暴力搜索算法。而dp就是尽可能将同一类的东西合并到一个状态上。如何检查dp的正确性?检查集合内部转移是否一致。检查方案数是否正确。状压dp有好几种状态压缩的方式:记录“选了哪些东西”这样的信息,可以用一个长度为\(n\)的01串,对应一个十进制......
  • 【DP】LeetCode 740. 删除并获得点数
    题目链接740.删除并获得点数思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......
  • C# 获取系统DPI缩放比例以及分辨率大小
    一般方法System.Windows.Forms.Screen类//获取当前主屏幕分辨率intscreenWidth=Screen.PrimaryScreen.Bounds.Width;intscreenHeight=Screen.PrimaryScreen.Bounds.Height;//获取指定屏幕分辨率ScreensecondaryScreen=Screen.AllScreens[1];intsecondaryScree......
  • 区间dp
    区间dp前情提要先赞后看,必成习惯一、区间dp-常见的也常考的dp1.区间dp是什么?区间动态规划是用dp的状态来表示和一段区间有关的性质,比如说dp[i][j]表示解决区间[i,j]上的子问题的最小代价或最大收益,然后利用区间子问题之间的关系递推求解。2.区间dp怎么写?区间dp常见的有......
  • LengthFieldPrepender和LengthFieldBasedFrameDecoder
    1,使用LengthFieldPrepender编码,LengthFieldBasedFrameDecoder解码的netty传输......
  • 【DP】LeetCode 213. 打家劫舍 II
    题目链接213.打家劫舍II思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即n......
  • 本地图文直接复制到WordPress编辑器中
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......
  • 黑客利用WordPress 插件暗中建立后门网站
    东方联盟网络安全组织在上周发布的一份报告中透露,有人观察到威胁行为者利用一个合法但过时的WordPress插件暗中建立后门网站,作为正在进行的活动的一部分。有问题的插件是EvalPHP,由名为flashpixx的开发人员发布。它允许用户插入PHP代码页和WordPress网站的帖子,每次在网......
  • modprobe和insmod的区别
    在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。modprobe和insmod的区别是什么呢?1.modprobe可以解决loadmodule时的依赖关系,比如loadmoudleA就必须先loadmouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文......
  • DDP运行报错(单卡无错):ERROR:torch.distributed.elastic.multiprocessing.api:failed (e
    使用DDP时出现错误,但是单卡跑无错误。错误记录如下:RuntimeError:Expectedtohavefinishedreductionintheprioriterationbeforestartinganewone.Thiserrorindicatesthatyourmodulehasparametersthatwerenotusedinproducingloss.Youcanenableunu......