This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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;
long long twater;
double water;
if(s+1 == e) return 0;
if(hole == 0){
twater = 0;
for(i=s+1; i<e; i+=2){
if(y[i] == y[i+1]) twater += ((x[i+1]-x[i])*(y[i]-y[s]));
}
leftwater += twater;
return 0;
}
small = 999999999;
for(i=s+1; i<e; i+=2){
if(small > y[i]){
small = y[i];
v = i;
}
}
shole = ehole = 0;
for(i=s+1; i<v; i+=2){
if(check[i]) shole++;
}
for(i=v+2; i<e; i+=2){
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 |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |