题目链接:Codeforces - Pashmak and Graph
我比较喜欢暴力,所以采用了暴力解法。
显然可以先对边排序,然后直接dp,分别记录是否相等权值?不,我喜欢暴力。
所以我们开N颗权值线段树暴力转移即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,m,rt[N],lc[N*40],rc[N*40],mx[N*40],cnt,res,up,dp[N];
struct node{int u,v,w;}t[N];
int cmp(node a,node b){return a.w<b.w;}
void change(int &p,int l,int r,int x,int v){
if(!p) p=++cnt;
if(l==r){mx[p]=max(mx[p],v); return ;}
int mid=l+r>>1;
if(x<=mid) change(lc[p],l,mid,x,v);
else change(rc[p],mid+1,r,x,v);
mx[p]=max(mx[lc[p]],mx[rc[p]]);
}
int ask(int p,int l,int r,int ql,int qr){
if(!p||l>r) return 0;
if(l==ql&&r==qr) return mx[p];
int mid=l+r>>1;
if(qr<=mid) return ask(lc[p],l,mid,ql,qr);
else if(ql>mid) return ask(rc[p],mid+1,r,ql,qr);
else return max(ask(lc[p],l,mid,ql,mid),ask(rc[p],mid+1,r,mid+1,qr));
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++) scanf("%d %d %d",&t[i].u,&t[i].v,&t[i].w);
sort(t+1,t+1+m,cmp); up=max(up,t[m].w);
for(int i=1,u,v,w,k;i<=m;i++){
u=t[i].u,v=t[i].v,w=t[i].w;
k=ask(rt[u],1,up,1,w-1)+1; res=max(res,k);
change(rt[v],1,up,w,k);
}
cout<<res;
return 0;
}