Submission #34417853


Source Code Expand

#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 ...Ts>
decltype(auto) zip(vector<Ts>... args){
  vector<decltype(make_tuple(args[0]...))> res;
  Int n=min({args.size()...});
  res.reserve(n);
  for(Int i=0;i<n;i++) res.emplace_back(args[i]...);
  return res;
}

template <typename T_, typename F_>
struct SegmentTree{
  using T = T_;
  using F = F_;
  Int n;
  F f;
  T ti;
  vector<T> dat;

  SegmentTree(F f,T ti):f(f),ti(ti){}

  void init(Int n_){
    n=1;
    while(n<n_) n<<=1;
    dat.assign(n<<1,ti);
  }

  void build(const vector<T> &v){
    Int n_=v.size();
    init(n_);
    for(Int i=0;i<n_;i++) dat[n+i]=v[i];
    for(Int i=n-1;i;i--)
      dat[i]=f(dat[(i<<1)|0],dat[(i<<1)|1]);
  }

  void set_val(Int k,T x){
    dat[k+=n]=x;
    while(k>>=1)
      dat[k]=f(dat[(k<<1)|0],dat[(k<<1)|1]);
  }

  T query(Int a,Int b){
    if(a>=b) return ti;
    T vl=ti,vr=ti;
    for(Int l=a+n,r=b+n;l<r;l>>=1,r>>=1) {
      if(l&1) vl=f(vl,dat[l++]);
      if(r&1) vr=f(dat[--r],vr);
    }
    return f(vl,vr);
  }

  template<typename C>
  Int max_right(Int s,C &check,T &acc,Int k,Int l,Int r){
    if(l+1==r){
      acc=f(acc,dat[k]);
      return check(acc)?-1:k-n;
    }
    Int m=(l+r)>>1;
    if(m<=s) return max_right(s,check,acc,(k<<1)|1,m,r);
    if(s<=l and check(f(acc,dat[k]))){
      acc=f(acc,dat[k]);
      return -1;
    }
    Int vl=max_right(s,check,acc,(k<<1)|0,l,m);
    if(~vl) return vl;
    return max_right(s,check,acc,(k<<1)|1,m,r);
  }

  // max t s.t. check(query(s,t))
  // O(\log N)
  template<typename C>
  Int max_right(Int s,C &check){
    assert(s<n and check(ti) and not check(query(s,n)));
    T acc=ti;
    return max_right(s,check,acc,1,0,n);
  }
};

template<typename SegmentTree>
struct SegmentTree2D{
  using T = typename SegmentTree::T;
  using F = typename SegmentTree::F;
  const F f;
  const T ti;
  SegmentTree2D(F f_,T ti_):f(f_),ti(ti_){}

  vector<pair<Int, Int>> vp;
  void preupdate(Int p,Int q){
    vp.emplace_back(p,q);
  }

  void compress(vector<Int> &vs){
    sort(vs.begin(),vs.end());
    vs.erase(unique(vs.begin(),vs.end()),vs.end());
  }

  Int idx(Int v,const vector<Int> &vs){
    return lower_bound(vs.begin(),vs.end(),v)-vs.begin();
  }

  Int sz;
  vector<Int> ps;
  vector<vector<Int>> I,L,R;
  vector<SegmentTree> seg;
  void build(){
    for(auto[p,q]:vp) ps.emplace_back(p);
    compress(ps);

    sz=1;
    while(sz<(Int)ps.size()) sz<<=1;

    I.resize(sz<<1);
    for(auto[p,q]:vp) I[sz+idx(p,ps)].emplace_back(q);
    for(Int k=(Int)I.size()-1;k>=sz;k--) compress(I[k]);

    L.resize(sz);
    R.resize(sz);
    for(Int k=sz-1;k>0;k--){
      auto& cur=I[k];
      const auto& lft=I[(k<<1)|0];
      const auto& rgh=I[(k<<1)|1];
      cur.resize(lft.size()+rgh.size());
      merge(lft.begin(),lft.end(),rgh.begin(),rgh.end(),cur.begin());
      cur.erase(unique(cur.begin(),cur.end()),cur.end());
      L[k].resize(cur.size()+1);
      R[k].resize(cur.size()+1);
      Int tl=0,tr=0;
      for(Int i=0;i<(Int)cur.size();i++){
        while(tl<(Int)lft.size() and lft[tl]<cur[i]) tl++;
        while(tr<(Int)rgh.size() and rgh[tr]<cur[i]) tr++;
        L[k][i]=tl;R[k][i]=tr;
      }
      L[k][cur.size()]=lft.size();
      R[k][cur.size()]=rgh.size();
    }
    for(Int k=0;k<(Int)I.size();k++){
      seg.emplace_back(f,ti);
      seg.back().build(vector<T>(I[k].size(),ti));
    }
  }

  void update(Int p,Int q,T v,Int k,Int l,Int r){
    if(r<=p||p+1<=l) return;
    if(p<=l&&r<=p+1) return seg[k].set_val(q,v);
    Int m=(l+r)>>1;
    update(p,L[k][q],v,(k<<1)|0,l,m);
    update(p,R[k][q],v,(k<<1)|1,m,r);
    T res=ti;
    const auto& cur=I[k];
    const auto& lft=I[(k<<1)|0];
    const auto& rgh=I[(k<<1)|1];
    if(L[k][q]<(Int)lft.size() and cur[q]==lft[L[k][q]])
      res=f(res,seg[(k<<1)|0].query(L[k][q],L[k][q]+1));
    if(R[k][q]<(Int)rgh.size() and cur[q]==rgh[R[k][q]])
      res=f(res,seg[(k<<1)|1].query(R[k][q],R[k][q]+1));
    seg[k].set_val(q,res);
  }

  void update(Int p,Int q,T v){
    update(idx(p,ps),idx(q,I[1]),v,1,0,sz);
  }

  T query(Int pa,Int pb,Int qa,Int qb,Int k,Int l,Int r){
    if(r<=pa||pb<=l) return ti;
    if(pa<=l&&r<=pb) return seg[k].query(qa,qb);
    Int m=(l+r)>>1;
    return f(query(pa,pb,L[k][qa],L[k][qb],(k<<1)|0,l,m),
             query(pa,pb,R[k][qa],R[k][qb],(k<<1)|1,m,r));
  }

  // [pa, pb) x [qa, qb)
  T query(Int pa,Int pb,Int qa,Int qb){
    return query(idx(pa,ps),idx(pb,ps),idx(qa,I[1]),idx(qb,I[1]),1,0,sz);
  }
};

//INSERT ABOVE HERE
signed main(){
  cin.tie(0);
  ios::sync_with_stdio(0);

  Int n;
  cin>>n;
  vector<Int> ts(n),xs(n),ys(n),as(n);
  for(Int i=0;i<n;i++) cin>>ts[i]>>xs[i]>>ys[i]>>as[i];

  {
    auto zs=zip(ys,ts,xs,as);
    sort(zs.begin(),zs.end());
    for(Int i=0;i<n;i++) tie(ys[i],ts[i],xs[i],as[i])=zs[i];
  }
  vector<Int> bs(n),cs(n);
  for(Int i=0;i<n;i++){
    bs[i]=ts[i]-ys[i]+xs[i];
    cs[i]=ts[i]-ys[i]-xs[i];
  }
  // i->j <=> v[i]<=v[j] for all (ts,ys,bs,cs)

  auto f=[&](Int a,Int b){return max(a,b);};
  SegmentTree2D<SegmentTree<Int, decltype(f)>> seg(f,0);
  for(Int i=0;i<n;i++){
    seg.preupdate(bs[i],cs[i]);
  }
  seg.build();

  Int ans=0;
  for(Int i=0;i<n;i++){
    if(ts[i]<xs[i]+ys[i]) continue;
    Int res=as[i]+seg.query(0,bs[i]+1,0,cs[i]+1);
    seg.update(bs[i],cs[i],res);
    chmax(ans,res);
  }
  cout<<ans<<newl;

  return 0;
}

Submission Info

Submission Time
Task Ex - Snuke Panic (2D)
User beet
Language C++ (GCC 9.2.1)
Score 600
Code Size 5753 Byte
Status AC
Exec Time 890 ms
Memory 123240 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 38
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_30.txt, random_31.txt, random_32.txt, random_33.txt, random_34.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
min.txt AC 6 ms 3596 KiB
random_01.txt AC 890 ms 119100 KiB
random_02.txt AC 113 ms 25800 KiB
random_03.txt AC 877 ms 121816 KiB
random_04.txt AC 382 ms 60872 KiB
random_05.txt AC 882 ms 120552 KiB
random_06.txt AC 665 ms 102480 KiB
random_07.txt AC 864 ms 119864 KiB
random_08.txt AC 305 ms 55340 KiB
random_09.txt AC 877 ms 119800 KiB
random_10.txt AC 24 ms 8332 KiB
random_11.txt AC 879 ms 120532 KiB
random_12.txt AC 359 ms 58148 KiB
random_13.txt AC 890 ms 122580 KiB
random_14.txt AC 198 ms 34212 KiB
random_15.txt AC 870 ms 120784 KiB
random_16.txt AC 158 ms 30144 KiB
random_17.txt AC 890 ms 119768 KiB
random_18.txt AC 64 ms 16032 KiB
random_19.txt AC 888 ms 119888 KiB
random_20.txt AC 136 ms 27576 KiB
random_21.txt AC 814 ms 123240 KiB
random_22.txt AC 342 ms 58652 KiB
random_23.txt AC 797 ms 120840 KiB
random_24.txt AC 21 ms 6368 KiB
random_25.txt AC 809 ms 120176 KiB
random_26.txt AC 450 ms 69012 KiB
random_27.txt AC 804 ms 123012 KiB
random_28.txt AC 15 ms 6044 KiB
random_29.txt AC 811 ms 121668 KiB
random_30.txt AC 340 ms 57616 KiB
random_31.txt AC 31 ms 9048 KiB
random_32.txt AC 32 ms 9036 KiB
random_33.txt AC 50 ms 12996 KiB
random_34.txt AC 30 ms 7960 KiB
sample_01.txt AC 2 ms 3600 KiB
sample_02.txt AC 3 ms 3624 KiB
sample_03.txt AC 2 ms 3584 KiB