Submission #549430

#TimeUsernameProblemLanguageResultExecution timeMemory
549430keta_tsimakuridzeTeam Contest (JOI22_team)C++14
100 / 100
1638 ms271120 KiB
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define f first
#define s second
#define endl "\n"

const int N = 5e5 + 5, mod = 1e9 + 7, inf = 1e9; //!
int t, tree[4 * N][2], cur, val[N], rr2[N][2];
pair<int,pii> p[N];
set<pii> s[4 * N][2];
void upd(int u, int id, int l,int r,int t,int val) {
	if(l > id || r < id) return;
	if(l == r) {
		tree[u][t] = max(tree[u][t], val);
		return;
	}
	int mid = (l + r) / 2;
	upd(2 * u, id, l, mid, t, val); upd(2 * u + 1, id, mid + 1,r, t, val);
	for(int k = 0; k < 2; k++) tree[u][k] = max(tree[2 * u][k], tree[2 * u + 1][k]);
}
int get(int u,int st,int en,int l,int r,int t) {
	if(l > en || r < st) return 0;
	if(st <= l && r <= en) return tree[u][t];
	int mid = (l + r) / 2;
	return max(get(2 * u, st, en, l, mid, t), get(2 * u + 1, st, en, mid + 1, r, t));
}

void updSum(int u,int id, int l,int r, int t, int val1, int val2) {
	if(l > id || r < id) return;
	int f = 0;
	if(s[u][t].size() && s[u][t].upper_bound({val1, 0}) != s[u][t].end() ) {
		if((*s[u][t].upper_bound({val1, 0})).s >= val1 + val2)f = 1;
		else 			
		if((*s[u][t].upper_bound({val1, 0})).f == val1) {
				s[u][t].erase((*s[u][t].upper_bound({val1, 0})));
		}
	}
	if(!f) s[u][t].insert({val1, val2 + val1});
	while(!f && s[u][t].size() && s[u][t].upper_bound({val1 - 1, inf}) != s[u][t].begin()) {
		pii p = *--s[u][t].upper_bound({val1 - 1, inf});
		if(p.s > val1 + val2) break;
		s[u][t].erase(p);
	}
	for(set<pii> :: iterator it = s[u][t].begin(); it != s[u][t].end(); it++) {
		if((*it).f < val1 && (*it).s <= val1 + val2) {
			s[u][t].erase(*it);
			it--;
		}
	}
	if(l == r) return;
	int mid = (l + r) / 2;
	updSum(2 * u, id, l, mid, t, val1, val2); updSum(2 * u + 1, id, mid + 1,r, t, val1, val2);
}
int getSum(int u,int st, int en, int l,int r,int t,int val1) {
	if(l > en || r < st) return -inf;
	if(st <= l && r <= en) {
		if(s[u][t].upper_bound({val1 + 1, 0}) == s[u][t].end()) return -inf;
		return (*s[u][t].upper_bound({val1 + 1, 0})).s;
	}
	int mid = (l + r) / 2;
	return max(getSum(2 * u, st, en, l, mid, t, val1), getSum(2 * u + 1, st, en, mid + 1, r, t, val1));
}
void add(pair<int, pii> p) {
	int a = p.s.f, b = p.s.s;
	int mxa = get(1, 1, a - 1, 1, cur, 0); 
	int mxb = get(1, 1, b - 1, 1, cur, 1); 
	upd(1, a, 1, cur, 0, b);
	upd(1, b, 1, cur, 1, a);
	if(mxa <= b) mxa = 0; if(mxb <= a) mxb = 0;
//	rr2[a][0] = max(rr2[a][0], mxa);
//	rr2[b][1] = max(rr2[b][1], mxb);
	if(mxa)
	updSum(1, a, 1, cur, 0, val[mxa], val[a]); 
	if(mxb)
	updSum(1, b, 1, cur, 1, val[mxb], val[b]);
}
int getSum2(int u,int st, int en, int l,int r,int t,int val1) {
	int ans = -inf;
	for(int i = st; i <= en; i++) {
		if(val1 < val[rr2[i][t]]) 
		ans = max(ans, val[rr2[i][t]] + val[i]);
	}
	return ans;
}
main() {
	ios_base::sync_with_stdio(false),
	cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	vector<int> x;
	map<int,int> id;
	for(int i = 1; i <= n; i++) {
		cin >> p[i].f >> p[i].s.f >> p[i].s.s;
		x.push_back(p[i].f); x.push_back(p[i].s.f); x.push_back(p[i].s.s);
	}
	sort(x.begin(),x.end());
	cur = 0;
	for(int i = 0; i < x.size(); i++) {
		if(!i || x[i] != x[i - 1]) ++cur;
		id[x[i]] = cur;
		val[cur] = x[i];
	}
	for(int i = 1; i <= n; i++) {
		p[i].f = id[p[i].f];
		p[i].s.f = id[p[i].s.f];
		p[i].s.s = id[p[i].s.s];
	}
	val[0] = -inf;
	sort(p + 1, p + n + 1);
	int last = 0, ans = -inf;
	for(int i = 1; i <= n; i++) {
		
		int x = 0;
		
		x = max(getSum(1, p[i].s.s + 1, cur, 1, cur, 1, val[p[i].s.f]), getSum(1, p[i].s.f + 1, cur, 1, cur, 0, val[p[i].s.s]));
		ans = max(ans, x + val[p[i].f]);
		if(p[i].f != p[i + 1].f) {
			for(int j = last + 1; j <= i; j++) {

				add(p[j]);
			}
			last = i;
		}
	}
	ans = max(ans, -1);
	cout << ans;
}

Compilation message (stderr)

team.cpp: In function 'void add(std::pair<int, std::pair<int, int> >)':
team.cpp:71:2: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   71 |  if(mxa <= b) mxa = 0; if(mxb <= a) mxb = 0;
      |  ^~
team.cpp:71:24: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   71 |  if(mxa <= b) mxa = 0; if(mxb <= a) mxb = 0;
      |                        ^~
team.cpp: At global scope:
team.cpp:87:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   87 | main() {
      | ^~~~
team.cpp: In function 'int main()':
team.cpp:100:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |  for(int i = 0; i < x.size(); i++) {
      |                 ~~^~~~~~~~~~
#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...