結果
| 問題 |
No.1467 Selling Cars
|
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2021-04-04 22:16:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,550 bytes |
| コンパイル時間 | 4,030 ms |
| コンパイル使用メモリ | 222,968 KB |
| 最終ジャッジ日時 | 2025-01-20 11:40:07 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 TLE * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using Int = long long;
const char newl = '\n';
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}
template<typename T=int>
vector<T> read(size_t n){
vector<T> ts(n);
for(size_t i=0;i<n;i++) cin>>ts[i];
return ts;
}
template<typename V>
V compress(V vs){
sort(vs.begin(),vs.end());
vs.erase(unique(vs.begin(),vs.end()),vs.end());
return vs;
}
template<typename T>
map<T, int> dict(const vector<T> &vs){
map<T, int> res;
for(int i=0;i<(int)vs.size();i++)
res[vs[i]]=i;
return res;
}
map<char, int> dict(const string &s){
return dict(vector<char>(s.begin(),s.end()));
}
template<typename T, typename ...Ts>
vector<T> fusion(vector<T> bs,Ts... ts){
auto append=[&](auto vs){for(auto v:vs) bs.emplace_back(v);};
initializer_list<int>{(void(append(ts)),0)...};
return bs;
}
//INSERT ABOVE HERE
template<typename T>
struct Slope{
using P = pair<T, T>;
priority_queue<P, vector<P>, less<P>> L;
priority_queue<P, vector<P>, greater<P>> R;
T offL,offR,entire;
Slope():offL(0),offR(0),entire(0){}
inline T relu(T x){return max<T>(0,x);}
void pushL(T pos,T num){if(num>T(0)) L.emplace(pos-offL,num);}
void pushR(T pos,T num){if(num>T(0)) R.emplace(pos-offR,num);}
T posL(){return L.top().first+offL;}
T posR(){return R.top().first+offR;}
void add_x_minus_a(T a,T cnt=T(1)){
T use(0);
while(use<cnt and not L.empty() and a<=posL()){
T pos=posL(),num=L.top().second;
L.pop();
T tmp=min(cnt-use,num);
pushR(pos,tmp);
pushL(a,tmp);
pushL(pos,relu(num-tmp));
entire+=relu(pos-a)*tmp;
use+=tmp;
}
pushR(a,cnt-use);
}
void add_a_minus_x(T a,T cnt=T(1)){
T use(0);
while(use<cnt and not R.empty() and posR()<=a){
T pos=posR(),num=R.top().second;
R.pop();
T tmp=min(cnt-use,num);
pushL(pos,tmp);
pushR(a,tmp);
pushR(a,relu(num-tmp));
entire+=relu(a-pos)*tmp;
use+=tmp;
}
pushL(a,cnt-use);
}
// f_{new}(x) = f_{old}(x + diff)
void shift(T diff){
offL-=diff;
offR-=diff;
}
// f_{new}(x) = min_{y<=x} f_{old}(y)
void apply_cumulative_min(){
while(!R.empty()) R.pop();
}
T get_val(T x){
T res=entire;
auto vectorize=[](auto pq){
vector<P> vp;
while(!pq.empty()) vp.emplace_back(pq.top()),pq.pop();
return vp;
};
for(auto[pos,num]:vectorize(L)) res+=relu((pos+offL)-x)*num;
for(auto[pos,num]:vectorize(R)) res+=relu(x-(pos+offR))*num;
return res;
}
};
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
int m,n;
cin>>m>>n;
auto as=read(m);
auto bs=read(n);
auto cs=compress(fusion(as,bs));
auto dc=dict(cs);
for(int &a:as) a=dc[a];
for(int &b:bs) b=dc[b];
const int sz = cs.size();
vector<int> num(sz,0);
for(int a:as) num[a]--;
using ll = long long;
ll last=-1;
for(int k=1;k<=m;k++){
for(int b:bs) num[b]++;
int pos=0;
Slope<long long> S;
S.add_a_minus_x(pos,1e9);
for(int i=0;i<sz;i++){
if(num[i]==0) continue;
S.add_x_minus_a(0,cs[i]-pos);
S.add_a_minus_x(0,cs[i]-pos);
pos=cs[i];
S.shift(num[i]);
S.apply_cumulative_min();
}
ll ans=S.get_val(0);
if(last==ans){
for(int t=k;t<=m;t++) cout<<ans<<newl;
break;
}
cout<<(last=ans)<<newl;
}
return 0;
}
beet