library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub beet-aizu/library

:warning: datastructure/prioritysum.cpp

Code

#include<bits/stdc++.h>
using namespace std;
//BEGIN CUT HERE
// return sum of top K element (default: maximum)
template<typename T, T identity, typename V=vector<T>,
         typename C1=less<T>, typename C2=greater<T> >
struct PrioritySum{
  size_t num;
  T sum;
  priority_queue<T, V, C1> pq1;
  priority_queue<T, V, C2> pq2;
  PrioritySum():num(0),sum(identity){}
  PrioritySum(size_t num):num(num),sum(identity){}

  void resolve(){
    assert(size()>=num);
    while(pq2.size()<num){
      sum+=pq1.top();
      pq2.emplace(pq1.top());
      pq1.pop();
    }
    while(pq2.size()>num){
      sum-=pq2.top();
      pq1.emplace(pq2.top());
      pq2.pop();
    }
    if(pq1.empty() or pq2.empty()) return;
    while(C2()(pq1.top(),pq2.top())){
      T t1=pq1.top();pq1.pop();
      T t2=pq2.top();pq2.pop();
      sum+=t1;
      sum-=t2;
      pq1.emplace(t2);
      pq2.emplace(t1);
    }
  }

  T query(){resolve();return sum;}

  void push(const T &x){pq1.emplace(x);}
  void expand(){num++;}
  void shrink(){assert(num);num--;}

  size_t size()const{return pq1.size()+pq2.size();}
};
template<typename T>
using MaximumSum=PrioritySum<T, T(0), vector<T>, less<T>, greater<T> >;
template<typename T>
using MinimumSum=PrioritySum<T, T(0), vector<T>, greater<T>, less<T> >;

//END CUT HERE

struct FastIO{
  FastIO(){
    cin.tie(0);
    ios::sync_with_stdio(0);
  }
}fastio_beet;

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;}

//INSERT ABOVE HERE
signed ARC074_D(){
  using ll = long long;

  int n;
  cin>>n;
  vector<ll> a(3*n);
  for(int i=0;i<3*n;i++) cin>>a[i];

  MaximumSum<ll> ps1(n);
  vector<ll> dp1(3*n);
  for(int i=0;i<3*n;i++){
    if(i>=n) dp1[i]=ps1.query();
    ps1.push(a[i]);
  }

  MinimumSum<ll> ps2(n);
  vector<ll> dp2(3*n);
  for(int i=3*n-1;i>=0;i--){
    ps2.push(a[i]);
    if(i<=2*n) dp2[i]=ps2.query();
  }

  ll ans=dp1[n]-dp2[n];
  for(int i=n;i<=2*n;i++) chmax(ans,dp1[i]-dp2[i]);

  cout<<ans<<endl;
  return 0;
}
/*
  verified on 2019/04/09
  https://atcoder.jp/contests/arc074/tasks/arc074_b
*/

signed CGR002_F(){
  using ll = long long;
  using P = pair<ll, ll>;
  int n;
  cin>>n;
  vector<vector<P> > G(n);
  for(int i=1;i<n;i++){
    ll a,b,c;
    cin>>a>>b>>c;
    a--;b--;
    G[a].emplace_back(b,c);
    G[b].emplace_back(a,c);
  }

  auto cmp=[&](P a,P b){
             return G[a.first].size()>G[b.first].size();
           };
  for(auto &v:G)
    sort(v.begin(),v.end(),cmp);

  vector<vector<int> > alive(n),death(n);
  for(int i=0;i<n;i++){
    for(int j=0;j<=(int)G[i].size();j++)
      alive[j].emplace_back(i);
    death[G[i].size()].emplace_back(i);
  }

  vector<MinimumSum<ll> > ms(n);

  vector<int> par(n,-1),cst(n,0),children(n,0);
  auto dfs=
    [&](int v,int p,auto func)->void{
      for(auto e:G[v]){
        ll u=e.first,c=e.second;
        if(u==p) continue;
        par[u]=v;
        cst[u]=c;
        children[v]++;
        func(u,v,func);
      }
    };
  dfs(0,-1,dfs);

  const ll INF = 1e18;

  vector<int> used(n,0),dead(n,0);
  auto dfs2=
    [&](int v,int p,int t,auto func)->P{
      used[v]=1;
      vector<ll> res;
      ll sum=0;
      for(auto e:G[v]){
        ll u=e.first,c=e.second;
        if(u==p) continue;
        if(dead[u]) break;
        P tmp=func(u,v,t,func);
        sum+=tmp.second;
        res.emplace_back((tmp.first+c)-tmp.second);
      }
      sort(res.begin(),res.end());

      ll x=INF,y=INF,z=0;
      int num=children[v]-t;
      assert(num>=-1);
      for(int i=0;i<=(int)res.size();i++){
        int j=max(num-i,0);
        if(j<=(int)ms[v].size()){
          while((int)ms[v].num<j) ms[v].expand();
          while((int)ms[v].num>j) ms[v].shrink();
          chmin(x,sum+z+ms[v].query());
        }
        int k=max(num-i+1,0);
        if(k<=(int)ms[v].size()){
          while((int)ms[v].num<k) ms[v].expand();
          while((int)ms[v].num>k) ms[v].shrink();
          chmin(y,sum+z+ms[v].query());
        }
        if(i<(int)res.size()) z+=res[i];
      }
      return P(x,y);
    };

  for(int t=0;t<n;t++){
    if(t) cout<<" ";
    ll res=0;
    for(int v:alive[t]){
      if(used[v]) continue;
      int u=v;
      while(~par[u] and !dead[par[u]]) u=par[u];
      P tmp=dfs2(u,par[u],t,dfs2);
      res+=min(tmp.first+cst[u],tmp.second);
    }

    cout<<res;
    for(int v:alive[t]) used[v]=0;
    for(int v:death[t]){
      dead[v]=1;
      for(auto e:G[v])
        if(e.first==par[v])
          ms[e.first].push(e.second);
    }
  }
  cout<<endl;
  return 0;
}
/*
  verified on 2019/04/10
  https://codeforces.com/contest/1119/problem/F
*/

signed main(){
  //ARC074_D();
  //CGR002_F();
  return 0;
}
#line 1 "datastructure/prioritysum.cpp"
#include<bits/stdc++.h>
using namespace std;
//BEGIN CUT HERE
// return sum of top K element (default: maximum)
template<typename T, T identity, typename V=vector<T>,
         typename C1=less<T>, typename C2=greater<T> >
struct PrioritySum{
  size_t num;
  T sum;
  priority_queue<T, V, C1> pq1;
  priority_queue<T, V, C2> pq2;
  PrioritySum():num(0),sum(identity){}
  PrioritySum(size_t num):num(num),sum(identity){}

  void resolve(){
    assert(size()>=num);
    while(pq2.size()<num){
      sum+=pq1.top();
      pq2.emplace(pq1.top());
      pq1.pop();
    }
    while(pq2.size()>num){
      sum-=pq2.top();
      pq1.emplace(pq2.top());
      pq2.pop();
    }
    if(pq1.empty() or pq2.empty()) return;
    while(C2()(pq1.top(),pq2.top())){
      T t1=pq1.top();pq1.pop();
      T t2=pq2.top();pq2.pop();
      sum+=t1;
      sum-=t2;
      pq1.emplace(t2);
      pq2.emplace(t1);
    }
  }

  T query(){resolve();return sum;}

  void push(const T &x){pq1.emplace(x);}
  void expand(){num++;}
  void shrink(){assert(num);num--;}

  size_t size()const{return pq1.size()+pq2.size();}
};
template<typename T>
using MaximumSum=PrioritySum<T, T(0), vector<T>, less<T>, greater<T> >;
template<typename T>
using MinimumSum=PrioritySum<T, T(0), vector<T>, greater<T>, less<T> >;

//END CUT HERE

struct FastIO{
  FastIO(){
    cin.tie(0);
    ios::sync_with_stdio(0);
  }
}fastio_beet;

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;}

//INSERT ABOVE HERE
signed ARC074_D(){
  using ll = long long;

  int n;
  cin>>n;
  vector<ll> a(3*n);
  for(int i=0;i<3*n;i++) cin>>a[i];

  MaximumSum<ll> ps1(n);
  vector<ll> dp1(3*n);
  for(int i=0;i<3*n;i++){
    if(i>=n) dp1[i]=ps1.query();
    ps1.push(a[i]);
  }

  MinimumSum<ll> ps2(n);
  vector<ll> dp2(3*n);
  for(int i=3*n-1;i>=0;i--){
    ps2.push(a[i]);
    if(i<=2*n) dp2[i]=ps2.query();
  }

  ll ans=dp1[n]-dp2[n];
  for(int i=n;i<=2*n;i++) chmax(ans,dp1[i]-dp2[i]);

  cout<<ans<<endl;
  return 0;
}
/*
  verified on 2019/04/09
  https://atcoder.jp/contests/arc074/tasks/arc074_b
*/

signed CGR002_F(){
  using ll = long long;
  using P = pair<ll, ll>;
  int n;
  cin>>n;
  vector<vector<P> > G(n);
  for(int i=1;i<n;i++){
    ll a,b,c;
    cin>>a>>b>>c;
    a--;b--;
    G[a].emplace_back(b,c);
    G[b].emplace_back(a,c);
  }

  auto cmp=[&](P a,P b){
             return G[a.first].size()>G[b.first].size();
           };
  for(auto &v:G)
    sort(v.begin(),v.end(),cmp);

  vector<vector<int> > alive(n),death(n);
  for(int i=0;i<n;i++){
    for(int j=0;j<=(int)G[i].size();j++)
      alive[j].emplace_back(i);
    death[G[i].size()].emplace_back(i);
  }

  vector<MinimumSum<ll> > ms(n);

  vector<int> par(n,-1),cst(n,0),children(n,0);
  auto dfs=
    [&](int v,int p,auto func)->void{
      for(auto e:G[v]){
        ll u=e.first,c=e.second;
        if(u==p) continue;
        par[u]=v;
        cst[u]=c;
        children[v]++;
        func(u,v,func);
      }
    };
  dfs(0,-1,dfs);

  const ll INF = 1e18;

  vector<int> used(n,0),dead(n,0);
  auto dfs2=
    [&](int v,int p,int t,auto func)->P{
      used[v]=1;
      vector<ll> res;
      ll sum=0;
      for(auto e:G[v]){
        ll u=e.first,c=e.second;
        if(u==p) continue;
        if(dead[u]) break;
        P tmp=func(u,v,t,func);
        sum+=tmp.second;
        res.emplace_back((tmp.first+c)-tmp.second);
      }
      sort(res.begin(),res.end());

      ll x=INF,y=INF,z=0;
      int num=children[v]-t;
      assert(num>=-1);
      for(int i=0;i<=(int)res.size();i++){
        int j=max(num-i,0);
        if(j<=(int)ms[v].size()){
          while((int)ms[v].num<j) ms[v].expand();
          while((int)ms[v].num>j) ms[v].shrink();
          chmin(x,sum+z+ms[v].query());
        }
        int k=max(num-i+1,0);
        if(k<=(int)ms[v].size()){
          while((int)ms[v].num<k) ms[v].expand();
          while((int)ms[v].num>k) ms[v].shrink();
          chmin(y,sum+z+ms[v].query());
        }
        if(i<(int)res.size()) z+=res[i];
      }
      return P(x,y);
    };

  for(int t=0;t<n;t++){
    if(t) cout<<" ";
    ll res=0;
    for(int v:alive[t]){
      if(used[v]) continue;
      int u=v;
      while(~par[u] and !dead[par[u]]) u=par[u];
      P tmp=dfs2(u,par[u],t,dfs2);
      res+=min(tmp.first+cst[u],tmp.second);
    }

    cout<<res;
    for(int v:alive[t]) used[v]=0;
    for(int v:death[t]){
      dead[v]=1;
      for(auto e:G[v])
        if(e.first==par[v])
          ms[e.first].push(e.second);
    }
  }
  cout<<endl;
  return 0;
}
/*
  verified on 2019/04/10
  https://codeforces.com/contest/1119/problem/F
*/

signed main(){
  //ARC074_D();
  //CGR002_F();
  return 0;
}
Back to top page