#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int MOD = 30013;
int a[100005], b[100005], c[100005], d[100005];
map <int, int> u;
pair <int, int> niz[200005];
int dp[100005];
int brn[100005];
struct drvo{
int val;
int br;
} seg[1200005];
void upd(int node, int l, int r, int x, int val){
if(l > x || r < x) return;
if(l == r){
seg[node].val = dp[val];
seg[node].br = brn[val];
return;
}
int mid = (l+r)/2;
upd(node*2, l, mid, x, val);
upd(node*2+1, mid+1, r, x, val);
seg[node].val = max(seg[node*2].val, seg[node*2+1].val);
seg[node].br = 0;
if(seg[node].val == seg[node*2].val){
seg[node].br += seg[node*2].br;
}
if(seg[node].val == seg[node*2+1].val){
seg[node].br += seg[node*2+1].br;
}
seg[node].br %= MOD;
}
pair <int, int> query(int node, int l, int r, int tl, int tr){
if(l > tr || tl > r) return {0, 1};
if(tl <= l && r <= tr){
return {seg[node].val, seg[node].br};
}
int mid = (l+r)/2;
pair <int, int> a1 = query(node*2, l, mid, tl, tr);
pair <int, int> b1 = query(node*2+1, mid+1, r, tl, tr);
int mn = max(a1.first, b1.first);
int s = 0;
if(a1.first == mn) s += a1.second;
if(b1.first == mn) s += b1.second;
s %= MOD;
return {mn, s};
}
int main(){
ios_base::sync_with_stdio(false);
cout.precision(10);
cout << fixed;
int n;
cin >> n;
vector <int> vec;
for(int i=1; i<=n; i++){
cin >> a[i] >> b[i] >> c[i] >> d[i];
vec.push_back(a[i]);
vec.push_back(b[i]);
//vec.push_back(c[i]);
//vec.push_back(d[i]);
}
sort(vec.begin(), vec.end());
int cnt = 0;
for(auto c : vec){
if(!u[c]) u[c] = ++cnt;
}
for(int i=1; i<=n; i++){
a[i] = u[a[i]];
b[i] = u[b[i]];
//c[i] = u[c[i]];
//d[i] = u[d[i]];
niz[i] = {c[i] , i};
niz[i+n] = {d[i], i+n};
}
sort(niz+1, niz+1+2*n);
for(int i=1; i<=2*n; i++){
if(niz[i].second > n){
//cout << b << " " << niz[i].second - n << endl;
upd(1, 1, cnt+5, b[niz[i].second - n], niz[i].second - n);
}
else{
int k = niz[i].second;
//cout << a[k] << " " << k << endl;
pair <int, int> rs = query(1, 1, cnt+5, 1, a[k]);
dp[k] = rs.first + 1;
brn[k] = rs.second;
if(dp[k] == 1) brn[k] = 1;
}
}
int res = 0;
int mx = 1;
for(int i=1; i<=n; i++){
mx = max(mx, dp[i]);
}
for(int i=1; i<=n; i++){
//cout << dp[i] << " ";
if(dp[i] == mx){
res += brn[i];
if(res > MOD) res -= MOD;
}
}
cout << mx << " " << res;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
3 ms |
504 KB |
Output is correct |
4 |
Correct |
3 ms |
504 KB |
Output is correct |
5 |
Correct |
5 ms |
760 KB |
Output is correct |
6 |
Correct |
7 ms |
892 KB |
Output is correct |
7 |
Correct |
9 ms |
1016 KB |
Output is correct |
8 |
Correct |
12 ms |
1400 KB |
Output is correct |
9 |
Correct |
23 ms |
2296 KB |
Output is correct |
10 |
Correct |
47 ms |
4216 KB |
Output is correct |
11 |
Correct |
61 ms |
4984 KB |
Output is correct |
12 |
Correct |
134 ms |
9440 KB |
Output is correct |
13 |
Correct |
166 ms |
10868 KB |
Output is correct |
14 |
Correct |
205 ms |
14316 KB |
Output is correct |
15 |
Correct |
233 ms |
14984 KB |
Output is correct |
16 |
Correct |
267 ms |
15700 KB |
Output is correct |
17 |
Correct |
263 ms |
16588 KB |
Output is correct |
18 |
Correct |
254 ms |
17020 KB |
Output is correct |
19 |
Correct |
273 ms |
17472 KB |
Output is correct |
20 |
Correct |
305 ms |
18412 KB |
Output is correct |