C. Ehab and Path-etic MEXs
题意
给两两节点放一个数字(0~n-2 唯一)
给你一棵树,求所有任意两节点相连的路以外的路上的数字的最小值最小
思路
构造
若一个点连了三条边及以上,则这个点的边从最小值开始赋值。其他边从最大点开始赋值。
证明:一个点连了三条边及以上,那么任取uv所在路一定不可能经过该点的所有边,那么显然最大值为这个点所连边的第三小值2。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
ll n;
ll cnt[maxn];
struct node{
ll x,y;
}a[maxn];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<n;i++){
cin>>a[i].x>>a[i].y;
cnt[a[i].x]++;
cnt[a[i].y]++;
}
ll pos=0;
for(int i=1;i<=n;i++){
if(cnt[i]>2){
pos=i;
}
}
int tot=0;
int cnt=n-2;
for(int i=1;i<n;i++){
if(a[i].x==pos||a[i].y==pos){
cout<<tot<<"\n";
tot++;
}else{
cout<<cnt<<"\n";
cnt--;
}
}
return 0;
}
题意
给你个u,v,求最短数组满足,所有数的异或值为u,所有数的和为v。
思路
有一个重要结论: a⊕b=a+b−2(a&b)
将v分为三个部分,u,t,t,t=2v−u
若t可以和u合并则合并。
特判u=v
若u,v的奇偶性不同,则一定不满足。
若u>v,则一定不满足。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll u,v;
cin>>u>>v;
ll x=(v-u)/2;
if(u>v){
cout<<-1;
}
else if(u==v){
if(u>0){
cout<<1<<'\n';
cout<<u<<'\n';
}else{
cout<<0;
}
}
else if((u+v)%2){
cout<<-1;
}
else{
if(((u+x)^x)==u){
cout<<2<<'\n';
cout<<u+x<<" "<<x;
}else{
cout<<3<<'\n';
cout<<u<<" "<<x<<" "<<x;
}
}
return 0;
}