#include <stdio.h>
#include <algorithm>
using namespace std;
int n,k;
struct data{
int x,y;
bool hole;
}a[300002];
struct data2{
int first,second;
bool operator()(data2 x,data2 y){
if(x.first != y.first) return (x.first < y.first);
return (x.second < y.second);
}
}ta[150002];
int sa[150002];
int find_hole(int ix,int iy){
int s,mid,e;
s = 1;
e = (n/2)-1;
while(true){
mid = (s+e)/2;
if(a[mid*2].x == ix && a[mid*2].y == iy) return mid*2;
if(a[mid*2].x > ix) e = mid-1;
else s = mid+1;
}
}
int before[150002],next[150002];
int wleft[150002],wright[150002];
int hleft[150002],hright[150002];
int left_node[150002],right_node[150002];
int left_y[150002],right_y[150002];
int ttt[150002];
void Input(){
int i,ix,iy;
//freopen("input.txt","r",stdin);
scanf("%d",&n);
for(i=1; i<=n; i++){
scanf("%d %d",&a[i].x,&a[i].y);
a[i].hole = false;
}
scanf("%d",&k);
for(i=1; i<=k; i++){
scanf("%d %d",&ix,&iy);
a[find_hole(ix,iy)].hole = true;
scanf("%d %d",&ix,&iy);
}
for(i=1; i<n/2; i++) ta[i].first = a[i*2].y;
for(i=1; i<n/2; i++) ta[i].second = i*2;
sort(ta+1,ta+(n/2),data2()); // n*n(???)
for(i=1; i<n/2; i++) sa[i] = ta[i].second;
}
void set_tree(){
int i,index;
int l,r;
for(i=1; i<n/2; i++) hleft[i] = hright[i] = 999999999;
before[1] = next[1] = 0;
for(i=(n/2)-1; i>=1; i--){
ttt[ta[i].second/2] = i;
}
for(i=1; i<n/2; i++){
left_node[i] = i-1;
right_node[i] = i+1;
left_y[i] = a[(i*2)-1].y;
right_y[i] = a[(i*2)+2].y;
}
for(i=(n/2)-1; i>=2; i--){
index = ta[i].second/2;
before[i] = ttt[left_node[index]];
next[i] = ttt[right_node[index]];
if(left_y[index] >= right_y[index] && left_node[index] < (n/2)){
l = left_node[index];
right_node[l] = right_node[index];
right_y[l] = right_y[index];
}else{
r = right_node[index];
left_node[r] = left_node[index];
left_y[r] = left_y[index];
}
}
for(i=2; i<n/2; i++){
if(before[i] != 0 && hright[before[i]] > a[sa[i]].y){
wright[before[i]] = i;
hright[before[i]] = a[sa[i]].y;
}
if(next[i] != 0 && hleft[next[i]] > a[sa[i]].y){
wleft[next[i]] = i;
hleft[next[i]] = a[sa[i]].y;
}
}
}
double watertime;
long long leftwater;
pair<int,double> tmp;
int dx,dy;
double rtime;
long long water;
pair<int,double> aqua(int x){
int hole;
double ltime;
hole = 0;
if(a[sa[x]].hole == true) hole++;
ltime = rtime = 0;
if(wleft[x] != 0){
tmp = aqua(wleft[x]);
hole += tmp.first;
ltime = tmp.second;
}
if(wright[x] != 0){
tmp = aqua(wright[x]);
hole += tmp.first;
rtime = tmp.second;
}
if(next[x] == 0) dx = a[n].x;
else dx = a[sa[next[x]]].x;
if(before[x] != 0) dx -= a[sa[before[x]]+1].x;
dy = a[sa[x]].y - max(a[sa[before[x]]].y,a[sa[next[x]]].y);
water = (long long)dx * (long long)dy;
if(hole == 0){
leftwater += water;
return make_pair(0,0);
}
return make_pair(hole,max(ltime,rtime) + ((double)water / (double)hole));
}
void print(){
printf("%.2f\n",watertime);
printf("%lld",leftwater);
}
int main(void){
Input();
set_tree();
tmp = aqua(1);
watertime = tmp.second;
print();
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
12804 KB |
Output is correct |
2 |
Correct |
0 ms |
12804 KB |
Output is correct |
3 |
Correct |
0 ms |
12804 KB |
Output is correct |
4 |
Correct |
0 ms |
12804 KB |
Output is correct |
5 |
Memory limit exceeded |
12 ms |
131072 KB |
Memory limit exceeded |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
12804 KB |
Output is correct |
2 |
Correct |
0 ms |
12804 KB |
Output is correct |
3 |
Memory limit exceeded |
24 ms |
131072 KB |
Memory limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
12804 KB |
Output is correct |
2 |
Correct |
0 ms |
12804 KB |
Output is correct |
3 |
Memory limit exceeded |
31 ms |
131072 KB |
Memory limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
217 ms |
12804 KB |
Output is correct |
2 |
Correct |
143 ms |
12804 KB |
Output is correct |
3 |
Memory limit exceeded |
155 ms |
131072 KB |
Memory limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |