Submission #144074

#TimeUsernameProblemLanguageResultExecution timeMemory
144074liwiBuilding Bridges (CEOI17_building)C++11
0 / 100
158 ms96632 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; #define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0) char _; #define complete_unique(a) a.erase(unique(a.begin(),a.end()),a.end()) #define all(a) a.begin(),a.end() #define println printf("\n"); #define readln(x) getline(cin,x); #define pb push_back #define endl "\n" #define INT_INF 0x3f3f3f3f #define LL_INF 0x3f3f3f3f3f3f3f3f #define MOD 1000000007 #define MOD2 1190492669 #define SEED 131 #define mp make_pair #define fastio cin.tie(0); cin.sync_with_stdio(0); #define MAXN 100005 #define MAXV 1000005 typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef unordered_map<int,int> umii; typedef pair<int,int> pii; typedef pair<double,double> pdd; typedef pair<ll,ll> pll; typedef pair<int,pii> triple; typedef int8_t byte; mt19937 g1(time(0)); int randint(int a, int b){return uniform_int_distribution<int>(a, b)(g1);} ll randlong(ll a,ll b){return uniform_int_distribution<long long>(a, b)(g1);} ll gcd(ll a, ll b){return b == 0 ? a : gcd(b, a % b);} ll lcm(ll a, ll b){return a*b/gcd(a,b);} ll fpow(ll b, ll exp, ll mod){if(exp == 0) return 1;ll t = fpow(b,exp/2,mod);if(exp&1) return t*t%mod*b%mod;return t*t%mod;} ll divmod(ll i, ll j, ll mod){i%=mod,j%=mod;return i*fpow(j,mod-2,mod)%mod;} struct node{ int l,r; pll bst; }; struct MinLiChaoTree{ node seg[4*MAXV]; inline ll calc(int rt, int m){return seg[rt].bst.first*m+seg[rt].bst.second;} inline ll calc(pll bst, int m){return bst.first*m+bst.second;} inline ld inter(pll f, pll s){return 1.0*(s.second-f.second)/(f.first-s.first);} void build(int l, int r, int rt){ seg[rt].l = l, seg[rt].r = r, seg[rt].bst = mp(0,LL_INF); if(l == r) return; int mid = (l+r)/2; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); } void add_line(int rt, pll line){ if(seg[rt].l == seg[rt].r){ if(calc(line,seg[rt].l) <= calc(rt,seg[rt].l)) seg[rt].bst = line; return; } int mid = (seg[rt].l+seg[rt].r)/2; if(calc(rt,seg[rt].l) < calc(line,seg[rt].l) && calc(rt,seg[rt].r) < calc(line,seg[rt].r)){ seg[rt].bst = line; return; } ld x = inter(line,seg[rt].bst); if(x <= mid){ if(calc(line,mid) <= calc(rt,mid)) swap(line,seg[rt].bst); add_line(rt<<1,line); }else{ if(calc(line,mid) <= calc(rt,mid)) swap(line,seg[rt].bst); add_line(rt<<1|1,line); } } ll get(int rt, int pos){ if(seg[rt].l == seg[rt].r) return calc(rt,pos); int mid = (seg[rt].l+seg[rt].r)/2; if(pos <= mid) return min(calc(rt,pos),get(rt<<1,pos)); return min(calc(rt,pos),get(rt<<1|1,pos)); } }; int len; ll dp[MAXN],H[MAXN],W[MAXN]; MinLiChaoTree t; int main(){ scanf("%d",&len); for(int i=1; i<=len; i++) scanf(" %lld",&H[i]); for(int i=1; i<=len; i++){ scanf(" %lld",&W[i]); W[i]+=W[i-1]; } t.build(1,1000000,1); t.add_line(1,mp(-2LL*H[1],H[1]*H[1]-W[1])); for(int i=2; i<=len; i++){ dp[i] = t.get(1,(int)H[i])+H[i]*H[i]+W[i-1]; t.add_line(1,mp(-2LL*H[i],dp[i]+H[i]*H[i]-W[i])); } printf("%lld\n",dp[len]); }

Compilation message (stderr)

building.cpp: In function 'int main()':
building.cpp:97:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&len);
  ~~~~~^~~~~~~~~~~
building.cpp:99:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %lld",&H[i]);
   ~~~~~^~~~~~~~~~~~~~~
building.cpp:101:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %lld",&W[i]);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...