voidsolve(){ int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int n; cin >> n; vector<int> data(n); for (auto& i: data) cin >> i; int sum = 0; for (auto& i: data) sum += i; int seg = 0, ans = 0; for (auto& i: data) { if (sum < 0) { if (seg == 0) seg = 1; ans += seg * i; } else { ++seg; ans += seg * i; } sum -= i; } cout << ans << endl; } }
如果某个点与开始点的欧几里得距离是奇数,我将其归为一类 A,另外的点为另外一类 B。那么显然,同一个类内的点相互走并不会变化结果的奇偶性。 但是不同类的路径就会变化奇偶性。非常巧的是,因为每个点都会被进入一次和出去一次, 所以理论如果要回到开始点,那么最终一定是偶数,因为一旦进入 A 类,就一定要回去 B 类,即每个 A 类的点会产生两条路径,也就是最终没有变化奇偶性
那么我们可以得到,如果 A 类点作为最后一个点,那么路径就是奇数的,否则就是偶数,然后再根据博弈再去模拟即可
voidsolve(){ int _; cin >> _; for (int ts = 0; ts < _; ++ts) { int n, sx, sy; cin >> n >> sx >> sy; set<int> data[2]; for (int i = 0; i < n; ++i) { int u, v; cin >> u >> v; constint cost = abs(u - sx) + abs(v - sy); data[cost % 2].insert(i + 1); }
if (data[0].size() >= data[1].size()) { // chose first cout << "First" << endl; for (int i = 0; i < n; ++i) { if (data[1].empty()) { auto iter = data[0].begin(); cout << *iter << endl; data[0].erase(iter); } else { auto iter = data[1].begin(); cout << *iter << endl; data[1].erase(iter); }
++i; if (i < n) { // read int tmp; cin >> tmp; data[0].erase(tmp); data[1].erase(tmp); } } } else { // chose second cout << "Second" << endl; for (int i = 0; i < n; ++i) { int tmp; cin >> tmp; data[0].erase(tmp); data[1].erase(tmp); ++i;
if (i < n) { if (data[0].empty()) { auto iter = data[1].begin(); cout << *iter << endl; data[1].erase(iter); } else { auto iter = data[0].begin(); cout << *iter << endl; data[0].erase(iter); } } } } } }