Skip to content

Commit 3342000

Browse files
authored
Create 2019-D-C.cpp
1 parent 910add6 commit 3342000

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

kick-start/2019-D-C.cpp

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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

Comments
 (0)