|
| 1 | +#include<bits/stdc++.h> |
| 2 | + |
| 3 | +using namespace std; |
| 4 | + |
| 5 | +#define ms(x,v) memset(x,(v), sizeof(x)) |
| 6 | +#define msn(x,v,n) memset(x,(v),sizeof(x[0]) * n) |
| 7 | +#define INF 0x3f3f3f3f |
| 8 | + |
| 9 | +typedef long long LL; |
| 10 | + |
| 11 | +typedef LL set_type; |
| 12 | + |
| 13 | +typedef pair<LL,LL> PII; |
| 14 | + |
| 15 | +const int MAXN = 2e5 +10; |
| 16 | + |
| 17 | + |
| 18 | + |
| 19 | +void mutiset_delete_one(multiset<set_type>& se,const set_type val){ |
| 20 | + se.erase(se.find(val)); |
| 21 | +} |
| 22 | + |
| 23 | +void delete_from(const set_type val,multiset<set_type>& dele,multiset<set_type>& inse,LL & update_val,int multiplier){ |
| 24 | + inse.insert(val); |
| 25 | + mutiset_delete_one(dele,val); |
| 26 | + update_val += val * multiplier; |
| 27 | +} |
| 28 | +void solve(){ |
| 29 | + |
| 30 | + int N,K; |
| 31 | + cin >> K >> N; |
| 32 | + vector<PII> X(N); |
| 33 | + for(int i=0 ; i<N ; ++i)cin >> X[i].first; |
| 34 | + for(int i=0 ; i<N ; ++i)cin >> X[i].second; |
| 35 | + sort(X.begin(),X.end()); |
| 36 | + |
| 37 | + multiset<set_type> lower,upper,lower_left,upper_left; |
| 38 | + lower_left.insert(INT32_MAX); |
| 39 | + upper_left.insert(INT32_MAX); |
| 40 | + LL usum = 0,lsum=0; |
| 41 | + for(int i=1; i< X.size() ; ++i)upper.insert(X[i].first + X[i].second); |
| 42 | + int number = 0; |
| 43 | + auto rit = upper.begin(); |
| 44 | + for( ; number < K ; ++number,++rit){ |
| 45 | + usum += *rit; |
| 46 | + } |
| 47 | + upper_left.insert(rit,upper.end()); |
| 48 | + upper.erase(rit,upper.end()); |
| 49 | + LL ans = usum + X[0].second - K * X[0].first; |
| 50 | + |
| 51 | + for(int i = 1 ; i<N ; ++i){ |
| 52 | + set_type center = X[i].first; |
| 53 | + set_type left = - X[i-1].first + X[i-1].second; |
| 54 | + set_type right = X[i].first + X[i].second; |
| 55 | + // insert to left |
| 56 | + if(*(lower_left.begin()) <=left){ |
| 57 | + lower_left.insert(left); |
| 58 | + }else |
| 59 | + { |
| 60 | + lsum += left; |
| 61 | + lower.insert(left); |
| 62 | + delete_from(*(--lower.end()),lower,lower_left,lsum,-1); |
| 63 | + } |
| 64 | + if(*upper_left.begin() > right){ // delete from upper |
| 65 | + mutiset_delete_one(upper,right); |
| 66 | + usum -= right; |
| 67 | + if(upper_left.size() > 1) |
| 68 | + delete_from(*upper_left.begin(),upper_left,upper,usum,1); |
| 69 | + else delete_from(*lower_left.begin(),lower_left,lower,lsum,1); |
| 70 | + }else |
| 71 | + { |
| 72 | + upper_left.erase(upper_left.find(right));//delete only one |
| 73 | + } |
| 74 | + |
| 75 | + |
| 76 | + bool balance = N==K+1; |
| 77 | + while (!balance) |
| 78 | + { |
| 79 | + LL lower_th = *lower_left.begin(); |
| 80 | + LL upper_th = * upper_left.begin(); |
| 81 | + |
| 82 | + if(lower_left.size() > 1 && lower_th < upper_th - 2 *center && upper.size() >0){ |
| 83 | + auto end_it = --upper.end(); |
| 84 | + auto end_val = * end_it; |
| 85 | + if(lower_th < end_val - 2 *center){ |
| 86 | + delete_from(end_val,upper,upper_left,usum,-1); |
| 87 | + delete_from(lower_th,lower_left,lower,lsum,1); |
| 88 | + }else balance = true; |
| 89 | + }else if(lower.size() >0 && upper_left.size() >1){ |
| 90 | + auto end_it = -- lower.end(); |
| 91 | + auto end_val = * end_it; |
| 92 | + if(upper_th < end_val + 2 *center){ |
| 93 | + delete_from(end_val,lower,lower_left,lsum,-1); |
| 94 | + delete_from(upper_th,upper_left,upper,usum,1); |
| 95 | + }else balance = true; |
| 96 | + }else balance = true; |
| 97 | + } |
| 98 | + |
| 99 | + LL cur_ans = lsum + lower.size() * center + usum - upper.size() * center + X[i].second; |
| 100 | + if(ans > cur_ans)ans = cur_ans; |
| 101 | + } |
| 102 | + assert(ans >0); |
| 103 | + cout <<" "<< ans; |
| 104 | +} |
| 105 | + |
| 106 | +int main(int argc, char const *argv[]) |
| 107 | +{ |
| 108 | + |
| 109 | + ios :: sync_with_stdio(0); |
| 110 | + cin.tie(0); |
| 111 | + // cout.tie(0); |
| 112 | + std::cout.precision(8); |
| 113 | + std::cout.setf( std::ios::fixed, std:: ios::floatfield ); |
| 114 | + int T; |
| 115 | + cin >> T; |
| 116 | + |
| 117 | + for(int kase =1; kase <= T ; ++kase) |
| 118 | + { |
| 119 | + cout << "Case #"<<kase << ":"; |
| 120 | + |
| 121 | + solve(); |
| 122 | + cout << '\n'; |
| 123 | + } |
| 124 | + return 0; |
| 125 | +} |
0 commit comments