妹子刚学1msRE简单树上差分求调
  • 板块学术版
  • 楼主_anll_
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/16 21:50
  • 上次更新2024/7/17 08:13:25
查看原帖
妹子刚学1msRE简单树上差分求调
556545
_anll_楼主2024/7/16 21:50

rt,RE#34,尝试加过保护机制依然是 RE 不是 WA,数组开大致 2e6 无果,求大佬救救QAQ(玄关!) 题目链接:D题 比赛链接

#include<vector>
#include<iostream>
#include<algorithm>
#define fir first
#define sec second
#define int long long
using namespace std;
const int N=5e4+5;
struct Edge{
	int l,w,nxt;
}edges[N<<1];
int n,m,ans,tt=1,head[N],num[N];
vector<pair<int,int> > co[N];
void add_edge(int f,int l,int w){
	edges[++tt]={l,w,head[f]};
	head[f]=tt;
}
void work(int x,int y,int fa){
	if(fa==x) num[1]++,num[y]--;
	else num[x]++;
}
void dfs(int x,int fa){
	for(int i=head[x];i;i=edges[i].nxt)
		co[x].push_back({edges[i].w,edges[i].l});
	sort(co[x].begin(),co[x].end());
	if(co[x][0].sec!=fa) dfs(co[x][0].sec,x);
	for(int i=1;i<co[x].size();i++){
		if(co[x][i].fir==co[x][i-1].fir)	
			work(co[x][i].sec,x,fa),work(co[x][i-1].sec,x,fa);
		if(co[x][i].sec!=fa) dfs(co[x][i].sec,x);
	}
	co[x].clear();
}
void dfs2(int x,int tot,int fa){
	tot+=num[x];num[x]=tot;ans+=(!tot);
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(l==fa) continue;
		dfs2(l,tot,x);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;int f,l,w;
	for(int i=1;i<n;i++){
		cin>>f>>l>>w;
		add_edge(f,l,w);add_edge(l,f,w);
	}
	dfs(1,0);dfs2(1,0,0);cout<<ans<<endl;
	for(int i=1;i<=n;i++) if(!num[i]) cout<<i<<endl;
	return 0;
}
2024/7/16 21:50
加载中...