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

浙公网安备 33010602011771号