제출 #1282375

#제출 시각아이디문제언어결과실행 시간메모리
1282375c4lTeam Contest (JOI22_team)C++20
55 / 100
2116 ms653524 KiB
#include <bits/stdc++.h> // #define int long long using namespace std; struct mem{ int x, y, z; }; mem a[150001]; vector<int> luu[300005]; vector<int> tr[300005]; vector<int> trz[300005]; int inf = -1e9; int n; struct pst{ struct Node{ int val; int l, r; Node(int v){ val = v; l = -1, r= -1; } }; vector<Node> luu; void clear(){ luu.clear(); } int build(int start, int end){ if(start==end){ Node tmp(inf); luu.push_back(tmp); return luu.size()-1; }else{ int mid = (start+end)/2; Node tmp(inf); int t = build(start, mid); int p = build(mid+1, end); tmp.l = t, tmp.r = p; luu.push_back(tmp); return luu.size()-1; } } int update(int start, int end, int p, int x, int id){ if(start==end){ Node tmp(0); tmp.val = luu[id].val; tmp.val = max(tmp.val, x); luu.push_back(tmp); return luu.size()-1; }else{ int mid = (start+end)/2; Node tmp(0); tmp.val = luu[id].val; tmp.l = luu[id].l, tmp.r = luu[id].r; if(p<=mid){ int tr = update(start, mid, p, x, luu[id].l); tmp.l = tr; }else{ int tr = update(mid+1, end, p, x, luu[id].r); tmp.r = tr; } tmp.val = max(luu[tmp.l].val, luu[tmp.r].val); luu.push_back(tmp); return luu.size()-1; } } int query(int start, int end, int l, int r, int id){ if(start > r or end<l)return inf; if(l<=start and end<=r){ return luu[id].val; } int mid = (start+end)/2; return max(query(start, mid, l, r, luu[id].l), query(mid+1,end, l, r, luu[id].r)); } }; pst cay[300005]; vector<int> seg[300005]; vector<int> pf[300005], lz[300005]; //X void merge(vector<int> &a, vector<int> &b, vector<int> &c, int node){ int i = 1, j = 1; while(i<a.size() and j<b.size()){ if(a[i] < b[j]){ c.push_back(a[i]); trz[node].push_back(trz[2*node][i]); pf[node].push_back(pf[2*node][i]); i++; }else{ c.push_back(b[j]); trz[node].push_back(trz[2*node+1][j]); pf[node].push_back(pf[2*node+1][j]); j++; } } while(i<a.size()){ c.push_back(a[i]); trz[node].push_back(trz[2*node][i]); pf[node].push_back(pf[2*node][i]); i++; } while(j<b.size()){ c.push_back(b[j]); pf[node].push_back(pf[2*node+1][j]); trz[node].push_back(trz[2*node+1][j]); j++; } } void merge2(vector<int> &a, vector<int> &b, vector<int> &c){ int i = 1, j = 1; while(i<a.size() and j<b.size()){ if(a[i] < b[j]){ c.push_back(a[i]); i++; }else{ c.push_back(b[j]); j++; } } while(i<a.size()){ c.push_back(a[i]); i++; } while(j<b.size()){ c.push_back(b[j]); j++; } } void reset(){ for (int i = 1;i<2*n;++i){ tr[i].clear(); trz[i].clear(); luu[i].clear(); pf[i].clear(); lz[i].clear(); seg[i].clear(); cay[i].clear(); } } void build(){ for (int i = 1;i<=n;++i){ tr[i+n-1].push_back(-1); trz[i+n-1].push_back(-1); luu[i+n-1].push_back(-1); pf[i+n-1].push_back(-1); lz[i+n-1].push_back(-1); pf[i+n-1].push_back(a[i].x); tr[i+n-1].push_back(a[i].y); luu[i+n-1].push_back(a[i].z); trz[i+n-1].push_back(a[i].z); lz[i+n-1].push_back(a[i].z); int m=tr[i+n-1].size()-1; int root = cay[i+n-1].build(1, m); seg[i+n-1].push_back(root); for (int j = 1;j<=m;++j){ int p = lower_bound(luu[i+n-1].begin(), luu[i+n-1].end(), trz[i+n-1][j])-luu[i+n-1].begin(); int nr = cay[i+n-1].update(1, m, p, pf[i+n-1][j], seg[i+n-1].back()); seg[i+n-1].push_back(nr); } } for (int i = n-1;i>=1;--i){ tr[i].push_back(-1); trz[i].push_back(-1); luu[i].push_back(-1); pf[i].push_back(-1); lz[i].push_back(-1); merge(tr[2*i], tr[2*i+1], tr[i], i); merge2(luu[2*i], luu[2*i+1], luu[i]); int m=tr[i].size()-1; int root = cay[i].build(1, m); seg[i].push_back(root); for (int j = 1;j<=m;++j){ int p = lower_bound(luu[i].begin(), luu[i].end(), trz[i][j])-luu[i].begin(); int nr = cay[i].update(1, m, p, pf[i][j], seg[i].back()); seg[i].push_back(nr); } for (int j = 1;j<=m;++j){ lz[i].push_back(trz[i][j]); lz[i][j] = max(lz[i][j], lz[i][j-1]); } } } int q1(int l, int r, int y){ l = l+n-1, r = r+n-1; int res = -1; while(l<=r){ if(l&1){ int p = lower_bound(tr[l].begin(), tr[l].end(), y)-tr[l].begin()-1; res = max (res, lz[l][p]); l++; } if(!(r&1)){ int p = lower_bound(tr[r].begin(), tr[r].end(), y)-tr[r].begin()-1; res = max (res, lz[r][p]); r--; } l/=2; r/=2; } return res; } int q2(int l, int r, int y, int z){ l = l+n-1, r = r+n-1; int res = inf; while(l<=r){ if(l&1){ int p = lower_bound(tr[l].begin(), tr[l].end(), y)-tr[l].begin()-1; int m = tr[l].size()-1; int q = lower_bound(luu[l].begin(), luu[l].end(), z)-luu[l].begin()-1; int sol = cay[l].query(1, m, 1, q, seg[l][p]); res = max(res, sol); l++; } if(!(r&1)){ int p = lower_bound(tr[r].begin(), tr[r].end(), y)-tr[r].begin()-1; int m = tr[r].size()-1; int q = lower_bound(luu[r].begin(), luu[r].end(), z)-luu[r].begin()-1; int sol = cay[r].query(1, m, 1, q, seg[r][p]); res = max(res, sol); r--; } l/=2; r/=2; } return res; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); // freopen("team_contest.inp","r",stdin); // freopen("team_contest.out","w",stdout); cin >> n; for (int i = 1;i<=n;++i){ cin >> a[i].x >> a[i].y >> a[i].z; } sort(a+1, a+n+1, [](mem p, mem q){ return p.x < q.x; }); for (int i = 1;i<=n;++i){ // cout << a[i].x << ' ' << a[i].y << ' ' << a[i].z << '\n'; } int tro = 1; // return 0; build(); // return 0; int res = -1; for (int i = 2;i<=n;++i){ while(tro<=n and a[tro].x<=a[i].x){ tro++; } int mz = q1(1, i-1, a[i].y); if(mz > a[i].z){ int sol = q2(tro, n, a[i].y, mz); if(sol!=inf){ res = max(res, a[i].y + mz + sol); } } } // return 0; // cout << res << '\n'; reset(); for (int i = 1;i<=n;++i){ swap(a[i].y, a[i].z); } tro = 1; build(); // return 0; // int res = 0; for (int i = 2;i<=n;++i){ while(tro<=n and a[tro].x<=a[i].x){ tro++; } int mz = q1(1, i-1, a[i].y); if(mz > a[i].z){ int sol = q2(tro, n, a[i].y, mz); if(sol!=inf){ res = max(res, a[i].y + mz + sol); // cout << res << ' ' << mz << ' ' << i << '\n'; } } } cout << res; }
#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...