Codeforces Round #628 (Div. 2)

C. Ehab and Path-etic MEXs

题意

给两两节点放一个数字(0~n-2 唯一)
给你一棵树,求所有任意两节点相连的路以外的路上的数字的最小值最小

思路

构造
若一个点连了三条边及以上,则这个点的边从最小值开始赋值。其他边从最大点开始赋值。
证明:一个点连了三条边及以上,那么任取uv所在路一定不可能经过该点的所有边,那么显然最大值为这个点所连边的第三小值2。

代码

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

代码

#include
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;
}

你可能感兴趣的:(codeforces,构造)