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