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

浙公网安备 33010602011771号