Submission #72516

#TimeUsernameProblemLanguageResultExecution timeMemory
72516IDxTree (#118)Hill Reconstruction (FXCUP3_hill)C++17
100 / 100
1253 ms41484 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 nd.e>e || (e==nd.e && idx<nd.idx); } bool operator==(const node2 &nd) const { return !(*this < nd) && !(nd < *this); } }; set<node1> S1; struct pq { priority_queue<node2> pq1, pq2; void insert(node2 x) { pq1.push(x); } void erase(node2 x) { pq2.push(x); while (!pq2.empty() && pq1.top() == pq2.top()) { pq1.pop(); pq2.pop(); } } node2 get() const { return pq1.top(); } } 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(){ scanf("%d%lld", &n, &c); c*=2; for(int i=1; i<=n; i++) scanf("%lld", &X[i]); for(int i=1; i<=n; i++) scanf("%lld", &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.get(); 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}); auto it2 = next(it); if(it2!=S1.end()) k=it2->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.get().e; int x=ans.x, y=ans.y, g=gcd(x,y); printf("%d/%d\n", y/g,x/g); } return 0; }

Compilation message (stderr)

hill.cpp: In function 'int main()':
hill.cpp:68:6: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 scanf("%d%lld", &n, &c); 
 ~~~~~^~~~~~~~~~~~~~~~~~
hill.cpp:70:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%lld", &X[i]);
                          ~~~~~^~~~~~~~~~~~~~~
hill.cpp:71:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%lld", &Y[i]);
                          ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...