Submission #709836

#TimeUsernameProblemLanguageResultExecution timeMemory
709836uroskTeam Contest (JOI22_team)C++14
0 / 100
1 ms340 KiB
#define here cerr<<"===========================================\n" #define dbg(x) cerr<<#x<<": "<<x<<endl; #include "bits/stdc++.h" //#include <ext/pb_ds/tree_policy.hpp> //#include <ext/pb_ds/assoc_container.hpp> #define ld double #define ll long long #define llinf 100000000000000000LL // 10^17 #define pb push_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pll pair<ll,ll> #define pld pair<ld,ld> #define all(a) a.begin(),a.end() #define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;} #define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;} #define daj_mi_malo_vremena ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0); using namespace std; //using namespace __gnu_pbds; /* ll add(ll x,ll y){ x+=y; if(x<0){ x%=mod; x+=mod; }else{ if(x>=mod) x%=mod; } return x; } ll mul(ll a,ll b){ ll ans = (a*b)%mod; if(ans<0) ans+=mod; return ans; } typedef tree<int,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; typedef tree<int,null_type,less_equal<ll>,rb_tree_tag,tree_order_statistics_node_update> ordered_multiset; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll rnd(ll l,ll r){ return uniform_int_distribution<ll>(l,r)(rng); } */ #define maxn 150005 ll n,m; struct tip{ ll x,y,z; }; bool cmp(tip a,tip b){return a.x<b.x;} tip a[maxn]; ll p[maxn]; struct segtree{ vector<ll> t,ls,rs; ll n,tsz = 0,root = 0; segtree(){} void init(ll &v,ll tl,ll tr){ if(!v) v = ++tsz; t[v] = -llinf; if(tl==tr) return; ll mid = (tl+tr)/2; init(ls[v],tl,mid); init(rs[v],mid+1,tr); } void init(ll n_){ n = n_; tsz = 0; t.assign(2*n+10,0); ls.assign(2*n+10,0); rs.assign(2*n+10,0); init(root,1,n); } void upd(ll v,ll tl,ll tr,ll i,ll x){ if(tl==tr){t[v] = max(t[v],x);return;} ll mid = (tl+tr)/2; if(i<=mid) upd(ls[v],tl,mid,i,x); else upd(rs[v],mid+1,tr,i,x); t[v] = max(t[ls[v]],t[rs[v]]); } ll get(ll v,ll tl,ll tr,ll l,ll r){ if(l>r||tl>tr||l>tr||tl>r) return -llinf; if(tl>=l&&tr<=r) return t[v]; ll mid = (tl+tr)/2; return max(get(ls[v],tl,mid,l,r),get(rs[v],mid+1,tr,l,r)); } } ty,tz; void tc(){ cin >> n; for(ll i = 1;i<=n;i++) cin >> a[i].x >> a[i].y >> a[i].z; set<ll> s; map<ll,ll> val; for(ll i = 1;i<=n;i++){ s.insert(a[i].x); s.insert(a[i].y); s.insert(a[i].z); } for(ll x : s) val[x] = ++m; ty.init(m); tz.init(m); sort(a+1,a+1+n,cmp); ll ans = -llinf; ll last = 1; a[n+1].x = -llinf; p[0] = -llinf; for(ll j = 1;j<=n+1;j++){ if(a[j].x!=a[j-1].x){ for(ll i = last;i<j;i++){ ll cur = max(ty.get(1,1,m,1,val[a[i].y]-1) + a[i].y, tz.get(1,1,m,1,val[a[i].z]-1) + a[i].z); ty.upd(1,1,m,val[a[i].y],a[i].z); tz.upd(1,1,m,val[a[i].z],a[i].y); p[i] = max(p[i-1],cur); } ans = max(ans,p[j-1]+a[j].x); last = j; }else ans = max(ans,p[last-1]+a[j].x); } if(ans<=0) ans = -1; cout<<ans<<endl; } int main(){ daj_mi_malo_vremena int t; t = 1; while(t--){ tc(); } return 0; } /** 5 3 1 4 2 3 1 1 5 5 4 4 2 5 2 3 8 1 1 1 1 1 5 1 5 1 5 1 1 1 5 5 5 1 5 5 5 1 5 5 5 **/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...