博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CodeForces】960 F. Pathwalks 主席树+动态规划
阅读量:6447 次
发布时间:2019-06-23

本文共 1145 字,大约阅读时间需要 3 分钟。

【题目】

【题意】给定n个点m条边的有向图,可能不连通有重边有自环。每条边有编号 i 和边权 wi ,求最长的路径(可以经过重复节点)满足编号和边权都严格递增。n,m,wi<=10^5。

【算法】主席树+DP

【题解】这个和LIS十分类似,只要在考虑LIS的树状数组做法的前提下多考虑节点搭配问题,即f[i]=f[j]+1还需要e[j].v=e[i].u。

所以对每个节点建可持久化线段树,然后DP即可。(当然也可以用可持久化树状数组)

复杂度O(n log n)。

#include
#include
#define lowbit(x) (x&-x)using namespace std;const int maxn=100010;int n,m,f[maxn],rt[maxn],sz;struct tree{
int l,r,mx;}t[maxn*20];void insert(int& k,int l,int r,int x,int y){ if(!k)k=++sz;t[k].mx=max(t[k].mx,y); if(l==r)return; int mid=(l+r)>>1; if(x<=mid)insert(t[k].l,l,mid,x,y); else insert(t[k].r,mid+1,r,x,y);}int query(int k,int l,int r,int x){ if(l==r)return t[k].mx; int mid=(l+r)>>1; if(x<=mid)return query(t[k].l,l,mid,x); else return max(t[t[k].l].mx,query(t[k].r,mid+1,r,x));}int main(){ scanf("%d%d",&n,&m); int ans=0; for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); f[i]=query(rt[u],1,100000,w-1)+1; insert(rt[v],1,100000,w,f[i]); ans=max(ans,f[i]); } printf("%d",ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8744105.html

你可能感兴趣的文章
DataGridView 输入数据验证格式(实例)
查看>>
HDOJ 2151
查看>>
Foundation框架 - 快速创建跨平台的网站页面原型
查看>>
Intel 82599网卡异常挂死原因
查看>>
open-falcon
查看>>
三菱plc输出指示灯不亮怎么办(转载)
查看>>
doc2vec使用说明(一)gensim工具包TaggedLineDocument
查看>>
App测试中ios和Android的区别
查看>>
java.lang.NullPointerException&com.cb.action.LoginAction.execute(LoginAction.java:48)
查看>>
理解Docker :Docker 网络
查看>>
通过Application存取公共数据比如登录信息等..
查看>>
intellij maven配置与使用
查看>>
SpringMVC文件下载与JSON格式
查看>>
Q:图像太大,在opencv上显示不完全
查看>>
修正锚点跳转位置 避免头部fixed固定部分遮挡
查看>>
Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
查看>>
linux下ping不通的解决方法
查看>>
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
irc操作小记
查看>>
JAVA 与 PHP 的不同和相同
查看>>