# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
9834 |
2014-09-30T08:57:02 Z |
Qwaz |
허수아비 (JOI14_scarecrows) |
C++14 |
|
712 ms |
93272 KB |
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int MAX = 200020;
typedef long long ll;
struct point {
int x, y, index;
};
bool compareX(const point &p, const point &q){
return p.x < q.x;
}
int n;
point data[MAX];
void input(){
scanf("%d", &n);
int i;
for(i = 0; i<n; i++)
scanf("%d%d", &data[i].x, &data[i].y);
sort(data, data+n, compareX);
for(i = 0; i<n; i++)
data[i].index = i;
}
ll ans;
set < int > st;
void solve(int s, int e){
if(s+1 >= e)
return;
int i, j, m = (s+e) >> 1;
vector < int > minYList;
//x, y가 자신보다 작으면서 y가 최대로 큰 허수아비를 찾는다
st.clear();
for(i = m; i<e; i++){
set < int >::iterator it;
it = st.lower_bound(data[i].y);
if(it == st.begin()) minYList.push_back(-1);
else {
it--;
minYList.push_back(*it);
}
st.insert(data[i].y);
}
solve(s, m);
solve(m, e);
point stack[MAX];
int top;
j = s;
top = 0;
for(i = m; i<e; i++){
while(j < m && data[j].y < data[i].y){
while(top && data[j].x > stack[top-1].x)
top--;
stack[top++] = data[j++];
}
int minY = minYList[data[i].index-m];
int p = 0, q = top, r;
while(p < q){
r = (p+q) >> 1;
if(stack[r].y > minY)
q = r;
else
p = r+1;
}
ans += top-p;
}
i = s;
j = m;
//Merge
point list[MAX];
int lFull = 0;
while(1){
if(i == m && j == e) break;
if((i < m && data[i].y < data[j].y) || j == e)
list[lFull++] = data[i++];
else
list[lFull++] = data[j++];
}
for(i = s; i<e; i++)
data[i] = list[i-s];
}
int main(){
input();
solve(0, n);
printf("%lld\n", ans);
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
45620 KB |
Output is correct |
2 |
Correct |
0 ms |
45624 KB |
Output is correct |
3 |
Correct |
0 ms |
45620 KB |
Output is correct |
4 |
Correct |
0 ms |
45624 KB |
Output is correct |
5 |
Correct |
0 ms |
45628 KB |
Output is correct |
6 |
Correct |
0 ms |
45624 KB |
Output is correct |
7 |
Correct |
0 ms |
45624 KB |
Output is correct |
8 |
Correct |
0 ms |
45628 KB |
Output is correct |
9 |
Correct |
0 ms |
45624 KB |
Output is correct |
10 |
Correct |
0 ms |
40936 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
4 ms |
64504 KB |
Output is correct |
2 |
Correct |
4 ms |
64504 KB |
Output is correct |
3 |
Correct |
8 ms |
64496 KB |
Output is correct |
4 |
Correct |
8 ms |
64496 KB |
Output is correct |
5 |
Correct |
8 ms |
64492 KB |
Output is correct |
6 |
Correct |
8 ms |
64504 KB |
Output is correct |
7 |
Correct |
8 ms |
64504 KB |
Output is correct |
8 |
Correct |
8 ms |
64504 KB |
Output is correct |
9 |
Correct |
8 ms |
64508 KB |
Output is correct |
10 |
Correct |
4 ms |
64508 KB |
Output is correct |
11 |
Correct |
12 ms |
64508 KB |
Output is correct |
12 |
Correct |
8 ms |
64372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
432 ms |
90900 KB |
Output is correct |
2 |
Correct |
708 ms |
93264 KB |
Output is correct |
3 |
Correct |
508 ms |
90908 KB |
Output is correct |
4 |
Correct |
456 ms |
90908 KB |
Output is correct |
5 |
Correct |
516 ms |
90908 KB |
Output is correct |
6 |
Correct |
580 ms |
91640 KB |
Output is correct |
7 |
Correct |
664 ms |
92348 KB |
Output is correct |
8 |
Correct |
704 ms |
93180 KB |
Output is correct |
9 |
Correct |
428 ms |
90904 KB |
Output is correct |
10 |
Correct |
532 ms |
90904 KB |
Output is correct |
11 |
Correct |
608 ms |
90912 KB |
Output is correct |
12 |
Correct |
652 ms |
93268 KB |
Output is correct |
13 |
Correct |
712 ms |
93268 KB |
Output is correct |
14 |
Correct |
412 ms |
90900 KB |
Output is correct |
15 |
Correct |
600 ms |
90908 KB |
Output is correct |
16 |
Correct |
712 ms |
93272 KB |
Output is correct |
17 |
Correct |
376 ms |
85692 KB |
Output is correct |
18 |
Correct |
672 ms |
92344 KB |
Output is correct |
19 |
Correct |
676 ms |
90912 KB |
Output is correct |
20 |
Correct |
672 ms |
90912 KB |
Output is correct |