Submission #16730

#TimeUsernameProblemLanguageResultExecution timeMemory
16730suhgyuho_william수족관 2 (KOI13_aqua2)C++98
0 / 100
60 ms3720 KiB
#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; i<=e; i++){ 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(check[i] && 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...