Luogu P8925 「GMOI R1-T2」Light 题解

P8925 「GMOI R1-T2」Light

让我们好好观察样例解释的这一张图:

左边第 1 个像到 O 点的距离 :L×2=2L

右边第 1 个像到 O 点的距离 :R×2=2R

左边第 2 个像到 O 点的距离 :右边第 1 个像到达 L 的距离是 2R+L 。而这样子距离 O 还差一个 L ,最终结果就是 2L+2R

右边第 2 个像到 O 点的距离 :同理可得 2R+2L

递推得到:

左边第 n 个像到 O 点的距离 :右边第 n1 个像到 O 点的距离加上 2L

右边第 n 个像到 O 点的距离 :左边第 n1 个像到 O 点的距离加上 2R

然后我们打出一张表:

左边第 n 个像到 O 点的距离 右边第 n 个像到 O 点的距离
1 2L+0R 2R+0L
2 2L+2R 2R+2L
3 4L+2R 4R+2L
4 4L+4R 4R+4L

最后找一找系数的规律:

对于左边第 n 个像到 O 点的距离,L 的系数是 2,2,4,4... ,很明显两个一周期。利用向下取整的特性,得到式子:

n+12×2

R 的系数是 0,2,2,4... ,除了第一个外,两个一周期,也可以利用向下取整的特性,得到式子:

n2×2

最后再乘以各项变量就行了:

n+12×2L+n2×2R

注意,由于算的是距离,最后的答案需要取相反数输出:

(n+12×2L+n2×2R)

对于右边第 n 个像到 O 点的距离,同理得到:

n+12×2R+n2×2L

AC代码:

#include <bits/stdc++.h>
using namespace std;
long long t,l,r;
int main()
{
	scanf("%lld",&t);
	scanf("%lld%lld",&l,&r);
	for(long long i=0;i<t;i++)
	    {
	    	char a;
	    	long long b;
	    	getchar();
	    	scanf("%c%lld",&a,&b);
	    	if(a=='L')printf("%lld\n",-(b+1)/2*2*l-b/2*2*r);
	    	else if(a=='R')printf("%lld\n",(b+1)/2*2*r+b/2*2*l);
		}
	return 0;
}

AC记录

posted @   w9095  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示