Luogu P8925 「GMOI R1-T2」Light 题解

P8925 「GMOI R1-T2」Light

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

左边第 \(1\) 个像到 \(O\) 点的距离 :\(L\times2=2L\)

右边第 \(1\) 个像到 \(O\) 点的距离 :\(R\times2=2R\)

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

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

递推得到:

左边第 \(n\) 个像到 \(O\) 点的距离 :右边第 \(n-1\) 个像到 \(O\) 点的距离加上 \(2L\)

右边第 \(n\) 个像到 \(O\) 点的距离 :左边第 \(n-1\) 个像到 \(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...\) ,很明显两个一周期。利用向下取整的特性,得到式子:

\[\lfloor\frac{n+1}{2}\rfloor\times2 \]

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

\[\lfloor\frac{n}{2}\rfloor\times2 \]

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

\[\lfloor\frac{n+1}{2}\rfloor\times2L+\lfloor\frac{n}{2}\rfloor\times2R \]

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

\[-(\lfloor\frac{n+1}{2}\rfloor\times2L+\lfloor\frac{n}{2}\rfloor\times2R) \]

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

\[\lfloor\frac{n+1}{2}\rfloor\times2R+\lfloor\frac{n}{2}\rfloor\times2L \]

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 @ 2025-02-12 08:27  w9095  阅读(20)  评论(0)    收藏  举报