제출 #469392

#제출 시각아이디문제언어결과실행 시간메모리
469392denkendoemeerBuilding Bridges (CEOI17_building)C++14
100 / 100
111 ms9668 KiB
#include<bits/stdc++.h> #define ll long long using namespace std; struct line { int tip; double x; ll s,y; }; bool operator < (const line &a,const line &b) { if (a.tip+b.tip>0) return a.x<b.x; return a.s>b.s; } set<line>st; typedef set<line>::iterator sti; bool hasp(sti it) { return it!=st.begin(); } bool hasn(sti it) { return it!=st.end() && next(it)!=st.end(); } double inter(const sti a,const sti b) { return (double)(a->y-b->y)/(b->s-a->s); } void calcx(sti it) { if (hasp(it)){ line aux=*it; aux.x=inter(prev(it),it); st.insert(st.erase(it),aux); } } bool rem(sti it) { if (hasp(it) && hasn(it) && inter(it,next(it))<=inter(prev(it),next(it))) return 1; return 0; } void add(ll s,ll y) { sti it=st.lower_bound((line){0,0,s,y}); if (it!=st.end() && it->s==s){ if (it->y<=y) return ; st.erase(it); } it=st.insert((line){0,0,s,y}).first; if (rem(it)){ st.erase(it); return ; } while(hasp(it) && rem(prev(it))) st.erase(prev(it)); while(hasn(it) && rem(next(it))) st.erase(next(it)); if (hasn(it)) calcx(next(it)); calcx(it); } ll query(ll x) { auto it=st.upper_bound((line){1,(double)x,0,0}); it--; return it->s*x+it->y; } ll h[100005],w[100005]; int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); int n,i; ll cur,s=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lld",&h[i]); for(i=1;i<=n;i++) scanf("%lld",&w[i]); s+=w[1]; add(-2*h[1],h[1]*h[1]-w[1]); for(i=2;i<=n;i++){ cur=query(h[i])+h[i]*h[i]-w[i]; s+=w[i]; add(-2*h[i],cur+h[i]*h[i]); } printf("%lld\n",s+cur); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

building.cpp: In function 'int main()':
building.cpp:78:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
building.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         scanf("%lld",&h[i]);
      |         ~~~~~^~~~~~~~~~~~~~
building.cpp:82:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |         scanf("%lld",&w[i]);
      |         ~~~~~^~~~~~~~~~~~~~
building.cpp:90:11: warning: 'cur' may be used uninitialized in this function [-Wmaybe-uninitialized]
   90 |     printf("%lld\n",s+cur);
      |     ~~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...