Submission #144781

# Submission time Handle Problem Language Result Execution time Memory
144781 2019-08-17T17:26:36 Z Sorting trapezoid (balkan11_trapezoid) C++14
100 / 100
295 ms 24568 KB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5 + 7;
const int mod = 30013;
const int inf = 1e9;

struct line{
	int first, second, idx;
	bool type;

	line(){}
};

bool cmp(line lvalue, line rvalue){
	return lvalue.first < rvalue.first;
}

struct fenwick_tree{
	pair<int, int> arr[MAXN];

	fenwick_tree(){
		for(int i = 0; i < MAXN; ++i){
			arr[i] = {0, 0};
		}
	}

	void update(int idx, pair<int, int> val){
		for(; idx < MAXN; idx += (idx & -idx)){
			if(val.first > arr[idx].first){
				arr[idx] = val;
			}
			else{
				if(val.first == arr[idx].first){
					arr[idx].second += val.second;
					arr[idx].second %= mod;
				}
			}
		}
	}

	pair<int, int> query(int idx){
		pair<int, int> ans = {1, 1};
		for(; idx >= 1; idx -= (idx & -idx)){
			if(arr[idx].first + 1 > ans.first){
				ans = {arr[idx].first + 1, max(arr[idx].second, 1)};
			}
			else{
				if(arr[idx].first + 1 == ans.first){
					ans.second += arr[idx].second;
					ans.second  %=  mod;
				}
			}
		}

		return ans;
	}
};

fenwick_tree f;

pair<int, int> dp[MAXN];
line t[MAXN];
set<int> st;
map<int, int> mp;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n;

	cin >> n;

	for(int i = 0; i < n; ++i){
		cin >> t[2 * i].first >> t[2 * i + 1].first >> t[2 * i].second >> t[2 * i + 1].second;
		st.insert(t[2 * i].second);
		st.insert(t[2 * i + 1].second);
	}

	int cnt = 1;
	for(int x: st){
		mp[x] = cnt++; 
	}

	for(int i = 0; i < 2 * n; i++){
		t[i].second = mp[t[i].second];
	}

	t[2 * n].first = inf;
	t[2 * n + 1].first = inf + 1;
	t[2 * n].second = 2 * n + 1;
	t[2 * n + 1].second = 2 * n + 2;

	for(int i = 0; i < 2 * n + 2; ++i){
		if(i & 1){
			t[i].type = false;
		}
		else{
			t[i].type = true;
		}
		t[i].idx = i / 2;
	}

	sort(t, t + 2 * n + 2, cmp);
	for(int i = 0; i < 2 * n + 2; ++i){
		if(t[i].type){
			dp[t[i].idx] = f.query(t[i].second);
			//cout << i << " iiii " << dp[cnt1 - 1].first << " " << dp[cnt1 - 1].second << " - " << cnt1 - 1 << endl;
		}
		else{
			//cout << "update " << t[i].second << " " << dp[cnt2].first << "," << dp[cnt2].second << endl;
			f.update(t[i].second, dp[t[i].idx]);
		}	
	}

	cout << dp[n].first - 1 << " " << dp[n].second << "\n";

	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1912 KB Output is correct
2 Correct 4 ms 1912 KB Output is correct
3 Correct 4 ms 2040 KB Output is correct
4 Correct 5 ms 2168 KB Output is correct
5 Correct 7 ms 2300 KB Output is correct
6 Correct 8 ms 2552 KB Output is correct
7 Correct 10 ms 2808 KB Output is correct
8 Correct 14 ms 3064 KB Output is correct
9 Correct 24 ms 4216 KB Output is correct
10 Correct 47 ms 6520 KB Output is correct
11 Correct 58 ms 7544 KB Output is correct
12 Correct 140 ms 13324 KB Output is correct
13 Correct 164 ms 15604 KB Output is correct
14 Correct 182 ms 17880 KB Output is correct
15 Correct 253 ms 19068 KB Output is correct
16 Correct 249 ms 20032 KB Output is correct
17 Correct 257 ms 21368 KB Output is correct
18 Correct 268 ms 22520 KB Output is correct
19 Correct 250 ms 23504 KB Output is correct
20 Correct 295 ms 24568 KB Output is correct