Codeforces Round #421B: Mister B and PR Shifts

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