haraduka's diary

やる気が欲しい

ARC41 C問題 ウサギ跳び

簡単なのにかなり時間がかかった。
なぜかWAが少し生えるのが不思議だったが、最初はlen()がintになっていてオーバーフローしているだけだった。long longに直したのでもう大丈夫…

#include<bits/stdc++.h>
using namespace std;
#define len(v) static_cast<long long>(v.size())
#define rep(i, n) for(int i=0; i<(n); i++)
typedef long long ll;
typedef pair<int, int> P;

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    ll N, LEN;
    cin >> N >> LEN;
    vector<ll> L, R;
    char before = 'R';
    ll res = 0;
    vector<ll> A; vector<char> B;
    for(ll i=0; i<N; i++){
        ll n; char c;
        cin >> n >> c;
        if(i == 0 && c == 'L'){
            A.push_back(0);
            B.push_back('R');
        }
        A.push_back(n);
        B.push_back(c);
        if(i == N-1 && c == 'R'){
            A.push_back(LEN+1);
            B.push_back('L');
        }
    }
    A.push_back(LEN+2);
    B.push_back('R');
    for(ll i=0; i<len(A); i++){
        ll n = A[i]; char c = B[i];
        if(before == 'L' && c == 'R'){
            ll r = 0, l = 0;
            for(ll j=0; j<len(R)-1; j++){
                r += R.back()-R[j]-1;
            }
            if(len(R) > 1) r -= (len(R)-1)*(len(R)-2)/2;
            for(ll j=1; j<len(L); j++){
                l += L[j]-L.front()-1;
            }
            if(len(L) > 1) l -= (len(L)-1)*(len(L)-2)/2;
            res += r + l + (L.front()-R.back()-1)*max(len(R), len(L));
            L.clear(); R.clear();
        }
        if(c == 'L'){
            L.push_back(n);
        }else{ //R(右向き)
            R.push_back(n);
        }
        before = c;
    }
    cout << res << endl;
}