Submission #551948

#TimeUsernameProblemLanguageResultExecution timeMemory
551948QwertyPiTeam Contest (JOI22_team)C++14
100 / 100
171 ms22008 KiB
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second using namespace std; typedef pair<int, int> pii; const int N = 1.5e5 + 5; const int inf = 3e8 + 13; int n, L; struct tp{ int a, b, c; bool operator< (const tp& o) const{ return a < o.a || a == o.a && b < o.b || a == o.a && b == o.b && c < o.c; } }; tp A[N]; int mx[3][N]; vector<tp> teams; int ans = -1; set<pii> S; int cur_b = -inf, cur_c = -inf; void add(int b, int c){ // cout << "add " << b << ' ' << c << endl; auto ptr = S.lower_bound({b, c}); // for(auto i : S) cout << i.fi << ' ' << i.se << '*'; cout << endl; if(ptr != S.end() && (ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){ pii pa = *ptr; // cout << pa.fi << ' ' << pa.se << endl; // for(auto i : S) cout << i.fi << ' ' << i.se << '*'; cout << endl; while(*S.begin() != pa) S.erase(S.begin()); // for(auto i : S) cout << i.fi << ' ' << i.se << '*'; cout << endl; while(S.begin() != S.end()){ auto ptr = S.begin(); if(!(ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){ break; } S.erase(S.begin()); cur_b = max(cur_b, max(ptr->fi, b)); cur_c = max(cur_c, max(ptr->se, c)); } }else if(ptr != S.begin() && (prev(ptr)->fi > b && prev(ptr)->se < c || prev(ptr)->fi < b && prev(ptr)->se > c)){ pii pa = *prev(ptr); // cout << pa.fi << ' ' << pa.se << endl; // for(auto i : S) cout << i.fi << ' ' << i.se << '*'; cout << endl; while(*S.begin() != pa) S.erase(S.begin()); // for(auto i : S) cout << i.fi << ' ' << i.se << '*'; cout << endl; while(S.begin() != S.end()){ auto ptr = S.begin(); if(!(ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){ break; } S.erase(S.begin()); cur_b = max(cur_b, max(ptr->fi, b)); cur_c = max(cur_c, max(ptr->se, c)); } }else{ if(b >= cur_b && c >= cur_c){ S.insert({b, c}); }else if((b < cur_b && c > cur_c) || (b > cur_b && c < cur_c)){ cur_b = max(b, cur_b), cur_c = max(c, cur_c); } } } int qry(int b, int c){ // cout << "qry " << b << ' ' << c << ' ' << cur_b << ' ' << cur_c << endl; if(cur_b <= b || cur_c <= c) return -inf; return cur_b + cur_c; } void check(int i, int j, int k){ if(A[i].a > A[j].a && A[i].a > A[k].a && A[j].b > A[i].b && A[j].b > A[k].b && A[k].c > A[i].c && A[k].c > A[j].c) ans = max(ans, A[i].a + A[j].b + A[k].c); } int32_t main(){ ios_base::sync_with_stdio(false); int n; cin >> n; set<tp> S; for(int i = 0; i < n; i++){ int a, b, c; cin >> a >> b >> c; S.insert({a, b, c}); } n = 0; for(auto i : S){ A[n++] = i; } // cout << n << endl; // for(int i = 0; i < n; i++){ // cout << A[i].a << ' ' << A[i].b << ' ' << A[i].c << endl; // } S.insert({inf, inf}); int l = 0, r = -1; while(l < n){ while(r + 1 < n && A[r + 1].a == A[l].a) r++; for(int i = l; i <= r; i++){ ans = max(ans, A[i].a + qry(A[i].b, A[i].c)); } for(int i = l; i <= r; i++){ add(A[i].b, A[i].c); } l = r + 1; } cout << ans << endl; }

Compilation message (stderr)

team.cpp: In member function 'bool tp::operator<(const tp&) const':
team.cpp:15:30: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   15 |   return a < o.a || a == o.a && b < o.b || a == o.a && b == o.b && c < o.c;
      |                     ~~~~~~~~~^~~~~~~~~~
team.cpp:15:65: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   15 |   return a < o.a || a == o.a && b < o.b || a == o.a && b == o.b && c < o.c;
      |                                            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
team.cpp: In function 'void add(int, int)':
team.cpp:31:36: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   31 |  if(ptr != S.end() && (ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){
      |                        ~~~~~~~~~~~~^~~~~~~~~~~~~~
team.cpp:39:21: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   39 |    if(!(ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){
      |         ~~~~~~~~~~~~^~~~~~~~~~~~~~
team.cpp:46:50: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   46 |  }else if(ptr != S.begin() && (prev(ptr)->fi > b && prev(ptr)->se < c || prev(ptr)->fi < b && prev(ptr)->se > c)){
      |                                ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
team.cpp:54:21: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   54 |    if(!(ptr->fi > b && ptr->se < c || ptr->fi < b && ptr->se > c)){
      |         ~~~~~~~~~~~~^~~~~~~~~~~~~~
#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...