http://codeforces.com/contest/819/problem/B
傾きと切片を持って適当にやればいい…がvectorの形で保持したらTLEぎりぎりになってしまった。
累積和でやりましょう。
あとmodの条件もいろいろ勘違いして結構バグらせた。
modは1違うだけで値が劇的に変わったりするので、油断しない。
int N; int A[MAX_N]; vector<int> M[MAX_N * 2], B[MAX_N * 2]; ll ans[MAX_N * 2]; void solve() { cin >> N; rep(i, 0, N) { cin >> A[i]; M[N - i].push_back(-1); B[N - i].push_back(A[i] - 1); M[N + A[i] - 1 - i].push_back(2); B[N + A[i] - 1 - i].push_back(0); M[2 * N - i].push_back(-1); B[2 * N - i].push_back(-(N - A[i] + 1)); } ll res = 0, m = 0; rep(i, 1, 2 * N + 1) { res += m; rep(j, 0, (int)B[i].size()) { res += B[i][j]; m += M[i][j]; } ans[i] = res; } ll tmp = inf; int at = -1; rep(i, 1, N + 1) { ll t = ans[i] + ans[i + N]; if(tmp > t) { tmp = t; at = i; } } cout << tmp << " " << at % N << "\n"; }