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