ARC103_B 题解
本篇题解有其它题解都没有的正确性证明部分,希望大家能给个赞,谢谢!
题意简述
初始位置设置在 L
、R
、U
、D
四种字符构成,分别表示左、右、上、下),使得从
题目分析
ARC 的 B 题竟然是个紫的,好家伙
十分神奇的构造题。先判断无解的情况:设某一步走之前的坐标是
那么如果坐标的
由于一个数
但这样有两个问题:由于每一步必须走,但是
所以我们换一种思路,反过来从
这种方法的正确性其他题解貌似一笔带过了,在这里我稍微说一下我的思路:对最后的
使用反证法,分类讨论:
-
若
,但 ,那么反推操作之前的 。若这一步是对 进行操作,那么有 ,则 ,与选择绝对值大的进行操作矛盾!因此这一步只能是对 进行操作,即 。若 ,由 知 , 应该 才对,矛盾!因此我们得到 。那么再往前一步的 仍然有 (证明过程类似)以及 ……因此得到 。考虑第一步操作,应有 ,然而由刚刚得到的结论却有 ,矛盾!因此这种情况不成立。 -
若
,那么类似上面的过程,由每次选择 中绝对值更大的进行操作以及操作方向向 两个性质,我们仍然可以得到每次操作满足 或者 。这样我们虽然不能确定 和 的具体大小范围,但是可以确定 。那么仍然考虑最初的 和 ,应有 。但由刚刚的结论知 ,则有 ,矛盾!
综上,
代码实现
#include<bits/stdc++.h> using namespace std; int n,k,m; long long x[1010],y[1010],c[42]; bool fg; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld%lld",&x[i],&y[i]); k=max(k,max((int)log2(abs(x[i])-1),(int)log2(abs(y[i])-1))+1);//判断最大的 2^k 需要到多大 if(i==1) fg=(x[i]+y[i])&1ll;//记录 x+y 的奇偶性 else if(((x[i]+y[i])&1ll)!=fg)//x+y 奇偶性不同,无解 { printf("-1"); return 0; } } for(long long i=k;i>=0;i--) c[++m]=1ll<<i;//c[i] 直接取 2^k,2^(k-1)…4,2,1 if(!fg)//x+y 为偶数,再添加一个 1 c[++m]=1; printf("%d\n",m); for(int i=1;i<=m;i++) printf("%lld ",c[i]); printf("\n"); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(abs(x[i])>abs(y[i]))//取绝对值更大的那个 x[i]>=0?(printf("R"),x[i]-=c[j]):(printf("L"),x[i]+=c[j]);//向 0 的方向走 else y[i]>=0?(printf("U"),y[i]-=c[j]):(printf("D"),y[i]+=c[j]); } printf("\n"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端