Codeforces Round 1077 Div2 部分题目题解

比赛传送门:Codeforces Round 1077 Div2

ABC 赛时切了。

D 题解

对着样例猜测,容易发现有解满足 \(p=x\)\(q=y\),然后根据这个贪心即可。

#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
inline int read(){
	char c=getchar();
	int f=1,ans=0;
	while(c<48||c>57) f=(c==45?f=-1:1),c=getchar();
	while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
	return ans*f;
}
inline int get(int x,int p){
	if (x==0) return 0;
	int k; 
	for (int i=0;i<30;i++) if ((x>>i)&1) k=i;
	int ans=1e18;
	for (int i=k+1;i<31;i++) if ((p>>i)&1^1) ans=min(ans,(1ll<<i)-x);
	int sum=0;
	for (int i=0;i<k;i++) if ((p>>i)&1^1) sum+=(1ll<<i);
	ans=min(ans,x-sum);
	if ((p>>k)&1) return ans;
	sum=(1ll<<k);
	ans=min(ans,abs(sum-x));
	for (int i=k-1;i>=0;i--) 
		if ((x>>i)&1){
			int cnt=0;
			for (int j=i-1;j>=0;j--) if ((p>>j)&1^1) cnt+=(1ll<<j);
			ans=min(ans,abs(sum+cnt-x));
			if ((p>>i)&1^1) sum+=(1ll<<i),ans=min(ans,abs(sum-x));
			else break;
		}
		else{
			if ((p>>i)&1^1) ans=min(ans,abs(sum+(1ll<<i)-x));
		}
	ans=min(ans,abs(sum-x)); 
	return ans;
}
inline void solve(){
	int x=read(),y=read();
	int xx=get(x,y),yy=get(y,x);
	if (xx<=yy){
		if (((x+xx)&y)==0) printf("%lld %lld\n",x+xx,y);
		else printf("%lld %lld\n",x-xx,y);
	}
	else{
		if ((x&(y+yy))==0) printf("%lld %lld\n",x,y+yy);
		else printf("%lld %lld\n",x,y-yy); 
	}
}
main(){
	int T=read();
	while(T--) solve();
    return 0;
}
posted @ 2026-01-30 19:32  OTn53_qwq  阅读(36)  评论(0)    收藏  举报