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
)
a \oplus b=a+b-2(a\&b)
a⊕b=a+b−2(a&b)
将
v
分
为
三
个
部
分
,
u
,
t
,
t
,
t
=
v
−
u
2
将v分为三个部分,u,t,t, t=\frac{v-u}{2}
将v分为三个部分,u,t,t,t=2v−u
若
t
可
以
和
u
合
并
则
合
并
。
若t可以和u合并则合并。
若t可以和u合并则合并。
特
判
u
=
v
特判u=v
特判u=v
若
u
,
v
的
奇
偶
性
不
同
,
则
一
定
不
满
足
。
若u,v的奇偶性不同,则一定不满足。
若u,v的奇偶性不同,则一定不满足。
若
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;
}