【题解】AT_arc156_c [ARC156C] Tree and LCS

\(link\)
中位蓝

壹:下界

结论:最小相似度恒为 \(1\)

证明:假设最小相似度为 \(2\) ,一定有 \(x\)\(y\) 满足偏序,此时交换权值即可,可以拓展到相似度为 \(k\)

贰:操作

排列 \(LCS\) 等于重标号后的 \(LIS\) ,此时一个序列中的端点为极值

使 \(LIS\) 尽量小,即依次交换极值

我们实际操作可以依次找出两个叶子节点,然后交换权值删去

可是这样做有可能会引入非序列的数,但是这样并不会使 \(LCS\) 变大

参:代码

#include<bits/stdc++.h>
using namespace std;
const int N=5010;
vector<int> mp[N];
int nw[N];
int ind[N];
int main(){
	int n;cin>>n;
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		mp[a].push_back(b);
		mp[b].push_back(a);
		ind[a]++;
		ind[b]++;
	}
	for(int i=1;i<=n;i++) nw[i]=i;
	queue<int> q;
	for(int i=1;i<=n;i++){
		if(mp[i].size()==1) q.push(i);
	}
	while(q.size()){
		int u=q.front();q.pop();
		if(q.empty()) break;
		int u1=q.front();q.pop();
		//cout<<u<<" "<<u1<<"\n";
		swap(nw[u],nw[u1]);
		for(auto v:mp[u]){
			ind[v]--;
			if(ind[v]==1) q.push(v);
		}
		for(auto v:mp[u1]){
			ind[v]--;
			if(ind[v]==1) q.push(v);
		}		
	}
	for(int i=1;i<=n;i++) cout<<nw[i]<<" ";
	return 0;
}
posted @ 2026-03-28 08:27  Ming3398  阅读(1)  评论(0)    收藏  举报