This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
typedef struct node* pnode;
const ll INF = 1e18;
const int MAXN = 1e5 + 10;
struct node{
pnode l, r;
ii key;
int prior, size;
ll sum;
node(ii _key){
key = _key;
prior = rand();
l = r = NULL;
size = 1;
sum = key.first;
}
};
int sz(pnode t){return t ? t->size : 0;}
ll sm(pnode t){return t ? t->sum : 0;}
void upd(pnode t){
if(!t) return;
t->size = sz(t->l) + 1 + sz(t->r);
t->sum = sm(t->l) + t->key.first + sm(t->r);
}
void split(pnode t, pnode &l, pnode &r, ii key){
if(!t){
l = r = NULL;
return;
}
if(key < t->key){
split(t->l, l, t->l, key);
r = t;
}
else{
split(t->r, t->r, r, key);
l = t;
}
upd(t);
}
void merge(pnode &t,pnode l,pnode r){
if(l == NULL){
t = r;
}
else if(r == NULL){
t = l;
}
else if(l->prior > r->prior){
merge(l->r,l->r,r);
t = l;
}
else{
merge(r->l,l,r->l);
t = r;
}
upd(t);
}
void insert(pnode &t, ii key){
//printf("Oi 1\n");
pnode aux = new node(key);
pnode l, r;
//printf("Oi 2\n");
split(t, l, r, key);
//printf("Oi 3\n");
merge(t, l, aux);
//printf("Oi 4\n");
merge(t, t, r);
}
void remove(pnode &t, ii key){
pnode l, mid, r;
split(t, l, r, ii(key.first, key.second - 1));
split(r, mid, r, key);
merge(t, l, r);
}
ii kth(pnode t, int k){
if(t == NULL) return ii(INF, INF);
if(sz(t->l) + 1 == k) return t->key;
if(k <= sz(t->l)) return kth(t->l, k);
return kth(t->r, k - sz(t->l) - 1);
}
ll doQuery(pnode t){
ii mediana = kth(t, (sz(t)+1)/2);
ll xm = mediana.first;
pnode l, r;
split(t, l, r, mediana);
ll tot1 = sz(l)*xm - sm(l);
ll tot2 = sm(r) - sz(r)*xm;
merge(t, l, r);
return tot1 + tot2;
}
int A[MAXN], B[MAXN], K, N;
ii C[MAXN];
int main(){
ll best = INF;
scanf("%d %d",&N,&K);
if(K == N){
printf("0\n");
return 0;
}
for(int i = 1;i<=N;i++){
scanf("%d", &A[i]);
}
for(int i = 1;i <= N;i++){
scanf("%d", &B[i]);
C[i] = ii(A[i] - B[i], i);
}
sort(C+1, C+N+1);
pnode raiz = NULL;
int L = N - K;
for(int i = 1;i <= L;i++){
//printf("Add i %d\n",i);
insert(raiz, C[i]);
}
best = min(best, doQuery(raiz));
for(int i = L + 1;i<=N;i++){
insert(raiz, C[i]);
remove(raiz, C[i-L]);
best = min(best, doQuery(raiz));
}
printf("%lld\n",best);
return 0;
}
Compilation message (stderr)
simfonija.cpp: In function 'int main()':
simfonija.cpp:143:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&N,&K);
~~~~~^~~~~~~~~~~~~~~
simfonija.cpp:151:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &A[i]);
~~~~~^~~~~~~~~~~~~
simfonija.cpp:154:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &B[i]);
~~~~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |