solution-p8925

· · 题解

分析

以样例 1 为例,在题面的解释中有这么一个图

很明显 O'(L)\sim O 的距离是 L\sim O 距离的两倍, O'(R)\sim O 的距离也是 R\sim O 距离的两倍。那么设 (O'(R))'(L)\sim O 的距离为 K ,那么 K=(O'(R))'(L)\sim L+L\sim O=O'(R)\sim =O+O'(L)\sim O=2\times (O\sim L+ O\sim R)

同理,设(O'(L))'(R)\sim O 的距离为 M , M=2\times (O\sim R+ O\sim L)

这时再仔细看下图片,就可以找到其中的规律,我们设 L\sim O 的距离为 X , O\sim R 的距离为 Y , 依靠上边的结论并观察可以得到下图:

使用题目中的给定数据最终得到:当 k 为偶数且输入字符为 \tt L 时距离点 O 的距离为 , (l+r)\times (k-1)+2\times l , 当 k 为偶数且输入字符为 \tt R 时距离点 O 的距离为 , (l+r)\times (k-1)+2\times r ,当 k 为奇数时距离点 O 的距离为 (l+r)\times k

AC 代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
int t,l,r;
signed main(){
    cin>>t>>l>>r;
    while(t--){
        int k;
        char lr;
        cin>>lr>>k;
        if(lr=='L'){
            if(k%2==1){
                cout<<0-((l+r)*(k-1)+2*l)<<'\n';
            }
            else cout<<0-(l+r)*k<<'\n';
        }
        else{
            if(k%2==1){
                cout<<(l+r)*(k-1)+2*r<<'\n';
            }
            else cout<<(l+r)*k<<'\n';
        }
    }
    return 0;
}