# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
57034 |
2018-07-13T16:32:09 Z |
polyfish |
Krov (COCI17_krov) |
C++14 |
|
1500 ms |
132096 KB |
//I love armpit fetish
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int64_t _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int64_t _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "data"
const int INF = 1010000000;
//const int64_t INF = 10;
const int MAX_N = 100002;
class range_sum_tree {
public:
struct node {
int cnt;
int64_t sum;
node *leftChild, *rightChild;
node() {
sum = 0;
cnt = 0;
leftChild = NULL;
rightChild = NULL;
}
void create_children() {
if (leftChild==NULL) {
leftChild = new node();
rightChild = new node();
}
}
} *root;
range_sum_tree() {
root = new node();
}
void upd(int pos, int add_sum, int add_cnt, int l, int r, node *cur) {
//cerr << l << ' ' << r << '\n';
if (pos<l || pos>r)
return;
if (pos==l && r==pos) {
cur->sum += add_sum;
cur->cnt += add_cnt;
return;
}
int mid = (1LL * l + r) / 2;
cur->create_children();
upd(pos, add_sum, add_cnt, l, mid, cur->leftChild);
upd(pos, add_sum, add_cnt, mid+1, r, cur->rightChild);
cur->sum = cur->leftChild->sum + cur->rightChild->sum;
cur->cnt = cur->leftChild->cnt + cur->rightChild->cnt;
}
int64_t get_sum(int u, int v, int l, int r, node *cur) {
if (v<l || u>r)
return 0;
if (u<=l && r<=v)
return cur->sum;
int mid = (1LL * l + r) / 2;
cur->create_children();
return get_sum(u, v, l, mid, cur->leftChild)
+ get_sum(u, v, mid+1, r, cur->rightChild);
}
int get_cnt(int u, int v, int l, int r, node *cur) {
if (v<l || u>r)
return 0;
if (u<=l && r<=v)
return cur->cnt;
int mid = (1LL * l + r) / 2;
cur->create_children();
return get_cnt(u, v, l, mid, cur->leftChild)
+ get_cnt(u, v, mid+1, r, cur->rightChild);
}
void upd(int pos, int add_sum, int add_cnt) {
upd(pos+INF, add_sum, add_cnt, 1, 2*INF, root);
}
int64_t get_sum(int u, int v) {
return get_sum(u+INF, v+INF, 1, 2*INF, root);
}
int get_cnt(int u, int v) {
return get_cnt(u+INF, v+INF, 1, 2*INF, root);
}
} L, R;
int n, x[MAX_N];
void enter() {
cin >> n;
for (int i=1; i<=n; ++i)
cin >> x[i];
}
int64_t calc(int roof, int h_roof) {
int64_t res = 0;
res += 1LL * (h_roof - roof) * L.get_cnt(-INF, h_roof - roof) - L.get_sum(-INF, h_roof - roof);
res += L.get_sum(h_roof - roof + 1, INF) - 1LL * (h_roof - roof) * L.get_cnt(h_roof - roof + 1, INF);
res += 1LL * (h_roof + roof) * R.get_cnt(-INF, h_roof + roof) - R.get_sum(-INF, h_roof + roof);
res += R.get_sum(h_roof + roof + 1, INF) - 1LL * (h_roof + roof) * R.get_cnt(h_roof + roof + 1, INF);
return res;
}
int64_t ternary_search(int pos) {
int l = max(pos-1, n-pos)+1, r = INF;
while (r-l+1>=3) {
int midL = l + (r - l + 1) / 3;
int midR = r - (r - l + 1) / 3;
if (calc(pos, midL) > calc(pos, midR))
l = midL;
else
r = midR;
}
int64_t res = 1e18;
for (int i=l; i<=r; ++i)
res = min(res, calc(pos, i));
return res;
}
int64_t solve() {
int64_t res = 1e18;
for (int i=1; i<=n; ++i)
R.upd(x[i]+i, x[i]+i, 1);
for (int i=1; i<=n; ++i) {
L.upd(x[i]-i, x[i]-i, 1);
R.upd(x[i]+i, -x[i]-i, -1);
res = min(res, ternary_search(i));
}
return res;
}
int main() {
//#define OFFLINE_JUDGE doraemon
#ifdef OFFLINE_JUDGE
freopen(FILE_NAME".inp", "r", stdin);
freopen(FILE_NAME".out", "w", stdout);
#endif
ios::sync_with_stdio(0); cin.tie(0);
enter();
cout << solve();
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
352 ms |
9848 KB |
Output is correct |
2 |
Correct |
422 ms |
11064 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
429 ms |
11064 KB |
Output is correct |
2 |
Correct |
432 ms |
11064 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
554 ms |
15356 KB |
Output is correct |
2 |
Correct |
619 ms |
15832 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
820 ms |
27936 KB |
Output is correct |
2 |
Correct |
810 ms |
27936 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1098 ms |
27936 KB |
Output is correct |
2 |
Correct |
883 ms |
27936 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1554 ms |
52096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1572 ms |
52096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1585 ms |
52096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1571 ms |
52096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1580 ms |
132096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |