#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
int x[300002],y[300002];
bool check[300002];
long long leftwater;
double wtime;
int find_edge(int sx,int sy){
int left,mid,right;
left = 1;
right = n;
while(true){
mid = (left+right)/2;
if(sx == x[mid] && sy == y[mid]) break;
if(sx < x[mid]) right = mid-1;
else if(x[mid] < sx) left = mid+1;
else{
if(x[mid-1] == sx) return mid-1;
else return mid+1;
}
}
return mid;
}
double dfs(int s,int e,int hole){
int i;
int v,small;
int shole,ehole;
double water;
if(s+1 == e) return 0;
if(hole == 0){
water = 0;
for(i=s+1; i<e-1; i+=2){
water += ((x[i+1]-x[i])*(y[i]-y[s]));
}
leftwater += water;
return 0;
}
small = 999999999;
for(i=s; i<e; i++){
if(check[i] && small > y[i]){
small = y[i];
v = i;
}
}
shole = ehole = 0;
for(i=s; i<v; i++){
if(check[i]) shole++;
}
for(i=v+1; i<e; i++){
if(check[i]) ehole++;
}
water = ((small-y[s])*(x[e]-x[s]))/hole;
y[s] = y[e] = small;
return water+max(dfs(s,v,shole),dfs(v+1,e,ehole));
}
int main(void){
int i,k;
//freopen("input.txt","r",stdin);
scanf("%d",&n);
for(i=1; i<=n; i++){
scanf("%d %d",&x[i],&y[i]);
}
scanf("%d",&k);
for(i=1; i<=k; i++){
scanf("%d %d %d %d",&x[0],&y[0],&x[n+1],&y[n+1]);
check[find_edge(x[0],y[0])] = true;
}
wtime = leftwater = 0;
wtime = dfs(1,n,k);
printf("%.2f\n%lld",wtime,leftwater);
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
3720 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
3720 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
3720 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
163 ms |
3720 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |