【题解】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;
}

浙公网安备 33010602011771号