Submission #72480

#TimeUsernameProblemLanguageResultExecution timeMemory
72480IDxTree (#118)Hill Reconstruction (FXCUP3_hill)C++17
32 / 100
1572 ms42928 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef long long ll; const int inf=2e9, MX=300010; struct edge{ ll x=1, y=0; bool operator > (const edge &e) const { return y*e.x>e.y*x; } bool operator == (const edge &e) const { return y*e.x==e.y*x; } }; struct node1{ int idx; edge e; bool operator < (const node1 &nd) const { return idx<nd.idx; } }; struct node2{ int idx; edge e; bool operator > (const node2 &nd) const { return e>nd.e || (e==nd.e && idx>nd.idx); } }; set<node1> S1; set<node2, greater<node2>> S2; int n; ll X[MX], Y[MX]; ll c; int gcd(int x, int y){ if(y==0) return x; return gcd(y,x%y); } ll area(int l, int r){ return (X[r]-X[l])*(Y[l]+Y[r]); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>c; c*=2; for(int i=1; i<=n; i++) cin>>X[i]; for(int i=1; i<=n; i++) cin>>Y[i]; for(int i=1; i<n; i++){ edge e; e.x=X[i+1]-X[i]; e.y=Y[i+1]-Y[i]; S1.insert({i,e}); S2.insert({i,e}); } while(true){ node2 a=*S2.begin(); int i=a.idx; edge e=a.e; if(i==1) break; node1 b=*prev(S1.find({i,e})); int j=b.idx; edge f=b.e; int k=n; auto it=S1.find({i,e}); if(next(it)!=S1.end()) k=next(it)->idx; ll now=area(j,k)-area(j,i)-area(i,k); if(now>c) break; // cout<<"POINTS: "<<j<<' '<<i<<' '<<k<<'\n'; c-=now; S1.erase({i,e}), S2.erase({i,e}); S1.erase({j,f}), S2.erase({j,f}); edge g; g.x=e.x+f.x, g.y=e.y+f.y; S1.insert({j,g}), S2.insert({j,g}); // cout<<S1.size()<<", "<<S2.size()<<'\n'; } { edge ans=S2.begin()->e; int x=ans.x, y=ans.y, g=gcd(x,y); cout<<y/g<<"/"<<x/g<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...