Codeforces - Pashmak and Graph

题目链接: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;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104281794
今日推荐