#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int,int> pi;
struct pt{int x,y;}pos[200005];
int cmp1(pt a, pt b){return a.x<b.x;}
int cmp2(pt a, pt b){return a.y<b.y;}
int a[200005],n;
int lim, tree[270000];
void initTree(int n){
for(lim = 1; lim <= n; lim <<= 1);
memset(tree,0,sizeof(tree));
}
void add(int x){
while (x <= lim) {
tree[x]++;
x += x & -x;
}
}
int sum(int x){
int res = 0;
while (x) {
res += tree[x];
x -= x & -x;
}
return res;
}
long long f(int s, int e){
if(s == e) return 0;
int m = (s+e)/2;
long long res = f(s,m) + f(m+1,e);
initTree(n+1);
set<pi> s_left, s_right, s_right_old;
set<pi>::iterator it;
for (int i=m; i>=s; i--) {
it = s_left.upper_bound(pi(a[i],0));
int lim;
if(it == s_left.end()) lim = n+1;
else lim = (*it).first - 1;
s_left.insert(pi(a[i],lim));
}
for (int i=m+1; i<=e; i++) {
it = s_right_old.upper_bound(pi(a[i],0));
int lim;
if(it == s_right_old.begin()) lim = -1;
else{
it--;
lim = (*it).first;
}
s_right_old.insert(pi(a[i],lim));
}
for (it = s_right_old.begin(); it != s_right_old.end(); it++) {
pi x = *it;
swap(x.first,x.second);
s_right.insert(x);
}
s_left.insert(pi(1e9,1e9));
s_right.insert(pi(1e9,1e9));
for (int i=s; i<=e; i++) {
if((*s_left.begin()).first < (*s_right.begin()).first){
it = s_left.begin();
res += sum((*it).second) - sum((*it).first - 1);
s_left.erase(it);
}
else{
it = s_right.begin();
add((*it).second);
s_right.erase(it);
}
}
return res;
}
int main(){
scanf("%d",&n);
for (int i=0; i<n; i++) {
scanf("%d %d",&pos[i].x,&pos[i].y);
}
sort(pos,pos+n,cmp2);
for (int i=0; i<n; i++) {
pos[i].y = i+1;
}
sort(pos,pos+n,cmp1);
for (int i=0; i<n; i++) {
a[i] = pos[i].y;
}
long long r = f(0,n-1);
printf("%lld",r);
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
28 ms |
4612 KB |
Output is correct |
2 |
Correct |
24 ms |
4612 KB |
Output is correct |
3 |
Correct |
24 ms |
4612 KB |
Output is correct |
4 |
Correct |
28 ms |
4612 KB |
Output is correct |
5 |
Correct |
32 ms |
4612 KB |
Output is correct |
6 |
Correct |
28 ms |
4612 KB |
Output is correct |
7 |
Correct |
28 ms |
4612 KB |
Output is correct |
8 |
Correct |
28 ms |
4612 KB |
Output is correct |
9 |
Correct |
28 ms |
4612 KB |
Output is correct |
10 |
Correct |
20 ms |
4612 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
380 ms |
4876 KB |
Output is correct |
2 |
Correct |
384 ms |
4876 KB |
Output is correct |
3 |
Correct |
380 ms |
4876 KB |
Output is correct |
4 |
Correct |
380 ms |
4876 KB |
Output is correct |
5 |
Correct |
384 ms |
4876 KB |
Output is correct |
6 |
Correct |
384 ms |
4876 KB |
Output is correct |
7 |
Correct |
384 ms |
4876 KB |
Output is correct |
8 |
Correct |
384 ms |
4876 KB |
Output is correct |
9 |
Correct |
376 ms |
4876 KB |
Output is correct |
10 |
Correct |
388 ms |
4876 KB |
Output is correct |
11 |
Correct |
384 ms |
4876 KB |
Output is correct |
12 |
Correct |
316 ms |
4876 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4000 ms |
8040 KB |
Program timed out |
2 |
Halted |
0 ms |
0 KB |
- |