网站后台如何做文件下载连接/b2b电商平台有哪些
题目链接: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;
}