#include<algorithm>#include<cstring>#include<iostream>#include<tuple>#include<vector>intmain(){intn,m;std::cin>>n>>m;std::vector<int>a(n+1);for(inti=1;i<=n;++i)std::cin>>a[i];// Calculate h(k) = max_x f(x) - k * g(x).// Meanwhile, obtain the maximum value g(x) of the optimizer x.autocalc=[&](intk)->std::pair<longlong,int>{longlongdp[2]={0,-0x3f3f3f3f3f3f3f3f};intopt[2]={0,0};for(inti=1;i<=n;++i){longlongtmp_dp[2];inttmp_opt[2];if(dp[0]>dp[1]){tmp_dp[0]=dp[0];tmp_opt[0]=opt[0];}elseif(dp[1]>dp[0]){tmp_dp[0]=dp[1];tmp_opt[0]=opt[1];}else{tmp_dp[0]=dp[0];tmp_opt[0]=std::max(opt[0],opt[1]);}tmp_dp[1]=dp[0]+a[i]-k;tmp_opt[1]=opt[0]+1;std::memcpy(dp,tmp_dp,sizeof(dp));std::memcpy(opt,tmp_opt,sizeof(opt));}longlongval;intopt_m;if(dp[0]>dp[1]){val=dp[0];opt_m=opt[0];}elseif(dp[1]>dp[0]){val=dp[1];opt_m=opt[1];}else{val=dp[0];opt_m=std::max(opt[0],opt[1]);}return{val,opt_m};};// WQS binary search.longlongval,tar_val;intopt_m,tar_k;std::tie(val,opt_m)=calc(0);if(opt_m<=m){// Have already reached the peak.tar_k=0;tar_val=val;}else{// Find the maximum k such that g(x) >= m.intll=0,rr=1000000;while(ll<=rr){intmm=(ll+rr)/2;std::tie(val,opt_m)=calc(mm);if(opt_m>=m){tar_k=mm;tar_val=val;ll=mm+1;}else{rr=mm-1;}}}longlongres=tar_val+(longlong)tar_k*m;std::cout<<res<<std::endl;return0;}
#include<algorithm>#include<iostream>#include<tuple>#include<type_traits>#include<vector>// Golden section search on integer domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_integral<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+static_cast<T>((rr-ll)*(1-phi));Tmr=ll+static_cast<T>((rr-ll)*phi);autofl=func(ml),fr=func(mr);while(ml<mr){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+static_cast<T>((rr-ll)*(1-phi));fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+static_cast<T>((rr-ll)*phi);fr=func(mr);}}Tbest_x=ll;autobest_val=func(ll);for(Ti=ll+1;i<=rr;++i){autoval=func(i);if(val>best_val){best_val=val;best_x=i;}}return{best_x,best_val};}intmain(){intn,m;std::cin>>n>>m;std::vector<int>a(n+1);for(inti=1;i<=n;++i)std::cin>>a[i];// Calculate h(k) = max_x f(x) + k * g(x).autocalc=[&](intk)->longlong{longlongdp[2]={0,-0x3f3f3f3f3f3f3f3f};for(inti=1;i<=n;++i){std::tie(dp[0],dp[1])=std::make_pair(std::max(dp[0],dp[1]),dp[0]+a[i]+k);}returnstd::max(dp[0],dp[1]);};// Solve the dual problem to find v(m).// Implemented as a minimization problem by adding negative signs.// Only consider tangent lines of negative slopes to ignore the part// of the curve after the peak.autores=-golden_section_search(-1000000,0,[&](intk)->longlong{return-calc(k)+(longlong)k*m;}).second;std::cout<<res<<std::endl;return0;}
#include<algorithm>#include<array>#include<iostream>#include<numeric>#include<tuple>#include<vector>classDisjointSet{std::vector<int>fa,sz;intfind(intx){returnfa[x]==x?x:fa[x]=find(fa[x]);}public:DisjointSet(intn):fa(n),sz(n,1){std::iota(fa.begin(),fa.end(),0);}boolunite(intx,inty){x=find(x);y=find(y);if(x==y)returnfalse;if(sz[x]<sz[y])std::swap(x,y);fa[y]=x;sz[x]+=sz[y];returntrue;}};intmain(){intV,E,m;std::cin>>V>>E>>m;std::array<std::vector<std::array<int,3>>,2>edges;edges[0].reserve(E);// white edges.edges[1].reserve(E);// black edges.for(inti=0;i<E;++i){intu,v,c,w;std::cin>>u>>v>>w>>c;edges[c].push_back({u,v,w});}// Sort edges.std::sort(edges[0].begin(),edges[0].end(),[&](constauto&lhs,constauto&rhs)->bool{returnlhs[2]<rhs[2];});std::sort(edges[1].begin(),edges[1].end(),[&](constauto&lhs,constauto&rhs)->bool{returnlhs[2]<rhs[2];});// Calculate h(k) = min_x f(x) - k * g(x) by Kruskal algorithm.// Use white edges first, whenever possible.autocalc=[&](intk)->std::pair<int,int>{intres=0,cnt=0;DisjointSetdjs(V);inti[2]={};while(i[0]<edges[0].size()&&i[1]<edges[1].size()){intc=edges[0][i[0]][2]-k>edges[1][i[1]][2];if(djs.unite(edges[c][i[c]][0],edges[c][i[c]][1])){res+=edges[c][i[c]][2]-(c?0:k);cnt+=c?0:1;}++i[c];}while(i[0]<edges[0].size()){if(djs.unite(edges[0][i[0]][0],edges[0][i[0]][1])){res+=edges[0][i[0]][2]-k;++cnt;}++i[0];}while(i[1]<edges[1].size()){if(djs.unite(edges[1][i[1]][0],edges[1][i[1]][1])){res+=edges[1][i[1]][2];}++i[1];}return{res,cnt};};// WQS binary search.// Find the minimum k such that g(x) >= m.intval,opt_m,tar_val,tar_k;intll=-100,rr=100;while(ll<=rr){intmm=ll+(rr-ll)/2;std::tie(val,opt_m)=calc(mm);if(opt_m>=m){tar_val=val;tar_k=mm;rr=mm-1;}else{ll=mm+1;}}intres=tar_val+tar_k*m;std::cout<<res<<std::endl;return0;}
#include<algorithm>#include<array>#include<iostream>#include<numeric>#include<tuple>#include<type_traits>#include<vector>// Golden section search on integer domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_integral<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+static_cast<T>((rr-ll)*(1-phi));Tmr=ll+static_cast<T>((rr-ll)*phi);autofl=func(ml),fr=func(mr);while(ml<mr){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+static_cast<T>((rr-ll)*(1-phi));fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+static_cast<T>((rr-ll)*phi);fr=func(mr);}}Tbest_x=ll;autobest_val=func(ll);for(Ti=ll+1;i<=rr;++i){autoval=func(i);if(val>best_val){best_val=val;best_x=i;}}return{best_x,best_val};}classDisjointSet{std::vector<int>fa,sz;intfind(intx){returnfa[x]==x?x:fa[x]=find(fa[x]);}public:DisjointSet(intn):fa(n),sz(n,1){std::iota(fa.begin(),fa.end(),0);}boolunite(intx,inty){x=find(x);y=find(y);if(x==y)returnfalse;if(sz[x]<sz[y])std::swap(x,y);fa[y]=x;sz[x]+=sz[y];returntrue;}};intmain(){intV,E,m;std::cin>>V>>E>>m;std::array<std::vector<std::array<int,3>>,2>edges;edges[0].reserve(E);// white edges.edges[1].reserve(E);// black edges.for(inti=0;i<E;++i){intu,v,c,w;std::cin>>u>>v>>w>>c;edges[c].push_back({u,v,w});}// Sort edges.std::sort(edges[0].begin(),edges[0].end(),[&](constauto&lhs,constauto&rhs)->bool{returnlhs[2]<rhs[2];});std::sort(edges[1].begin(),edges[1].end(),[&](constauto&lhs,constauto&rhs)->bool{returnlhs[2]<rhs[2];});// Calculate h(k) = min_x f(x) - k * g(x) by Kruskal algorithm.autocalc=[&](intk)->int{intres=0;DisjointSetdjs(V);inti[2]={};while(i[0]<edges[0].size()&&i[1]<edges[1].size()){intc=edges[0][i[0]][2]-k>edges[1][i[1]][2];if(djs.unite(edges[c][i[c]][0],edges[c][i[c]][1])){res+=edges[c][i[c]][2]-(c?0:k);}++i[c];}while(i[0]<edges[0].size()){if(djs.unite(edges[0][i[0]][0],edges[0][i[0]][1])){res+=edges[0][i[0]][2]-k;}++i[0];}while(i[1]<edges[1].size()){if(djs.unite(edges[1][i[1]][0],edges[1][i[1]][1])){res+=edges[1][i[1]][2];}++i[1];}returnres;};// Solve the dual problem to find v(m).autores=golden_section_search(-100,100,[&](intk)->int{returncalc(k)+k*m;}).second;std::cout<<res<<std::endl;return0;}
#include<cmath>#include<deque>#include<iostream>#include<tuple>#include<type_traits>#include<vector>// Monotone decision DP.// This solves f(i) = min f(j-1) + w(j,i) s.t. 1 <= j <= i.// Also records the minimal optimal decision j for each f(i).template<typenameW>std::pair<std::vector<decltype(std::declval<W>()(0,0))>,std::vector<int>>monotone_decision_opt_dp(intn,Www){usingValueT=decltype(std::declval<W>()(0,0));std::vector<ValueT>f(n+1);std::vector<int>opt(n+1),lt(n+1),rt(n+1);std::deque<int>dq;autow=[&](intj,inti)->ValueT{returnww(j,i)+f[j-1];};for(intj=1;j<=n;++j){if(!dq.empty()&&rt[dq.front()]<j)dq.pop_front();if(!dq.empty())lt[dq.front()]=j;while(!dq.empty()&&w(j,lt[dq.back()])<w(dq.back(),lt[dq.back()])){dq.pop_back();}if(dq.empty()){lt[j]=j;rt[j]=n;dq.emplace_back(j);}elseif(w(j,rt[dq.back()])>=w(dq.back(),rt[dq.back()])){if(rt[dq.back()]<n){lt[j]=rt[dq.back()]+1;rt[j]=n;dq.emplace_back(j);}}else{intll=lt[dq.back()],rr=rt[dq.back()],i=rr;while(ll<=rr){intmm=(ll+rr)/2;if(w(j,mm)<w(dq.back(),mm)){i=mm;rr=mm-1;}else{ll=mm+1;}}rt[dq.back()]=i-1;lt[j]=i;rt[j]=n;dq.emplace_back(j);}f[j]=w(dq.front(),j);opt[j]=dq.front();}return{f,opt};}intmain(){intn,m;std::cin>>n>>m;std::vector<longlong>a(n+1),ps(n+1);for(inti=1;i<=n;++i){std::cin>>a[i];ps[i]=ps[i-1]+a[i];}// Cost function for interval [l,r].autow=[&](intj,inti)->longlong{intmm=j+(i-j)/2;returnps[i]+ps[j-1]-2*ps[mm]+(2*mm-j-i+1)*a[mm];};// Calculate h(k) = min_x f(x) - k * g(x).// Also record the minimum of optimal number of segments.autocalc=[&](longlongk)->std::pair<longlong,int>{autores=monotone_decision_opt_dp(n,[&](intj,inti)->longlong{returnw(j,i)-k;});autoval=res.first[n];intcnt=0;for(inti=n;i;i=res.second[i]-1){++cnt;}return{val,cnt};};// WQS binary search.// Find the largest k such that g(x) <= m.longlongval,tar_val;intopt_m,tar_k;longlongll=-(1LL<<32),rr=0;while(ll<=rr){longlongmm=ll+(rr-ll)/2;std::tie(val,opt_m)=calc(mm);if(opt_m<=m){tar_val=val;tar_k=mm;ll=mm+1;}else{rr=mm-1;}}longlongres=tar_val+(longlong)tar_k*m;std::cout<<res<<std::endl;return0;}
#include<cmath>#include<deque>#include<iostream>#include<type_traits>#include<utility>#include<vector>// Monotone decision DP.// This solves f(i) = min f(j-1) + w(j,i) s.t. 1 <= j <= i.// Also records the minimal optimal decision j for each f(i).template<typenameW>std::pair<std::vector<decltype(std::declval<W>()(0,0))>,std::vector<int>>monotone_decision_opt_dp(intn,Www){usingValueT=decltype(std::declval<W>()(0,0));std::vector<ValueT>f(n+1);std::vector<int>opt(n+1),lt(n+1),rt(n+1);std::deque<int>dq;autow=[&](intj,inti)->ValueT{returnww(j,i)+f[j-1];};for(intj=1;j<=n;++j){if(!dq.empty()&&rt[dq.front()]<j)dq.pop_front();if(!dq.empty())lt[dq.front()]=j;while(!dq.empty()&&w(j,lt[dq.back()])<w(dq.back(),lt[dq.back()])){dq.pop_back();}if(dq.empty()){lt[j]=j;rt[j]=n;dq.emplace_back(j);}elseif(w(j,rt[dq.back()])>=w(dq.back(),rt[dq.back()])){if(rt[dq.back()]<n){lt[j]=rt[dq.back()]+1;rt[j]=n;dq.emplace_back(j);}}else{intll=lt[dq.back()],rr=rt[dq.back()],i=rr;while(ll<=rr){intmm=(ll+rr)/2;if(w(j,mm)<w(dq.back(),mm)){i=mm;rr=mm-1;}else{ll=mm+1;}}rt[dq.back()]=i-1;lt[j]=i;rt[j]=n;dq.emplace_back(j);}f[j]=w(dq.front(),j);opt[j]=dq.front();}return{f,opt};}// Golden section search on integer domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_integral<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+static_cast<T>((rr-ll)*(1-phi));Tmr=ll+static_cast<T>((rr-ll)*phi);autofl=func(ml),fr=func(mr);while(ml<mr){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+static_cast<T>((rr-ll)*(1-phi));fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+static_cast<T>((rr-ll)*phi);fr=func(mr);}}Tbest_x=ll;autobest_val=func(ll);for(Ti=ll+1;i<=rr;++i){autoval=func(i);if(val>best_val){best_val=val;best_x=i;}}return{best_x,best_val};}intmain(){intn,m;std::cin>>n>>m;std::vector<longlong>a(n+1),ps(n+1);for(inti=1;i<=n;++i){std::cin>>a[i];ps[i]=ps[i-1]+a[i];}// Cost function for interval [l,r].autow=[&](intj,inti)->longlong{intmm=j+(i-j)/2;returnps[i]+ps[j-1]-2*ps[mm]+(2*mm-j-i+1)*a[mm];};// Calculate h(k) = min_x f(x) - k * g(x).autosolve=[&](longlongk)->longlong{returnmonotone_decision_opt_dp(n,[&](intj,inti)->longlong{returnw(j,i)-k;}).first[n]+k*m;};// Solve the dual problem to find v(m).autores=golden_section_search(-(1LL<<32),0LL,solve).second;std::cout<<res<<std::endl;return0;}
#include<algorithm>#include<iomanip>#include<iostream>#include<tuple>#include<type_traits>#include<vector>// Golden section search on floating-point domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_floating_point<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc,Teps){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+(rr-ll)*(1-phi);Tmr=ll+(rr-ll)*phi;autofl=func(ml),fr=func(mr);while((rr-ll)>eps){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+(rr-ll)*(1-phi);fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+(rr-ll)*phi;fr=func(mr);}}Tmid=(ll+rr)/2;return{mid,func(mid)};}intmain(){intn,m1,m2;std::cin>>n>>m1>>m2;std::vector<longdouble>p(n+1),q(n+1);for(inti=1;i<=n;++i)std::cin>>p[i];for(inti=1;i<=n;++i)std::cin>>q[i];// Calculate h(k1,k2).autosolve=[&](longdoublek1,longdoublek2)->longdouble{longdoubleres=0;for(inti=1;i<=n;++i){res+=std::max({0.0l,p[i]+k1,q[i]+k2,p[i]+q[i]-p[i]*q[i]+k1+k2});}returnres;};// Solve the dual problem to find v(m1,m2).// Implemented as a minimization problem by adding negative signs.autores=-golden_section_search(-1.0l,0.0l,[&](longdoublek1)->longdouble{returngolden_section_search(-1.0l,0.0l,[&](longdoublek2)->longdouble{return-solve(k1,k2)+k2*m2;},1e-8l).second+k1*m1;},1e-8l).second;std::cout<<std::fixed<<std::setprecision(10)<<res<<std::endl;return0;}
#include<algorithm>#include<iostream>#include<tuple>#include<type_traits>#include<vector>// Golden section search on integer domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_integral<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+static_cast<T>((rr-ll)*(1-phi));Tmr=ll+static_cast<T>((rr-ll)*phi);autofl=func(ml),fr=func(mr);while(ml<mr){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+static_cast<T>((rr-ll)*(1-phi));fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+static_cast<T>((rr-ll)*phi);fr=func(mr);}}Tbest_x=ll;autobest_val=func(ll);for(Ti=ll+1;i<=rr;++i){autoval=func(i);if(val>best_val){best_val=val;best_x=i;}}return{best_x,best_val};}intmain(){intn;std::cin>>n;std::vector<int>a(n+1);for(inti=1;i<=n;++i)std::cin>>a[i];for(inti=n;i>=1;--i)a[i]-=a[i-1];longlongv;std::cin>>v;// Cost of adding M more teleporters to a segment of length LEN.autof=[&](intlen,intm)->longlong{longlongrem=len%(m+1);intq=len/(m+1);return(m+1-rem)*q*q+rem*(q+1)*(q+1);};// Calculate h(k) = min_x f(x) - k * g(x).autocalc=[&](longlongk)->longlong{longlongres=0;for(inti=1;i<=n;++i){res+=-golden_section_search(0,a[i],[&](intm)->longlong{return-f(a[i],m)+m*k;}).second;}returnres;};// Find the smallest k such that h(k) + k * m <= v.longlongll=-(1LL<<30),rr=0,ti=0;while(ll<=rr){automm=ll+(rr-ll)/2;autofi=calc(mm);autoub=fi-calc(mm+1);if(fi+ub*mm<=v){ti=mm;rr=mm-1;}else{ll=mm+1;}}std::cout<<(int)((calc(ti)-v-1-ti)/(-ti))<<std::endl;return0;}
#include<algorithm>#include<cmath>#include<iostream>#include<tuple>#include<type_traits>#include<vector>// Golden section search on integer domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_integral<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+static_cast<T>((rr-ll)*(1-phi));Tmr=ll+static_cast<T>((rr-ll)*phi);autofl=func(ml),fr=func(mr);while(ml<mr){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+static_cast<T>((rr-ll)*(1-phi));fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+static_cast<T>((rr-ll)*phi);fr=func(mr);}}Tbest_x=ll;autobest_val=func(ll);for(Ti=ll+1;i<=rr;++i){autoval=func(i);if(val>best_val){best_val=val;best_x=i;}}return{best_x,best_val};}// Golden section search on floating-point domain (unimodal function)template<typenameT,typenameF>typenamestd::enable_if<std::is_floating_point<T>::value,std::pair<T,decltype(std::declval<F>()(std::declval<T>()))>>::typegolden_section_search(Tll,Trr,Ffunc,Teps){constexprlongdoublephi=0.618033988749894848204586834L;Tml=ll+(rr-ll)*(1-phi);Tmr=ll+(rr-ll)*phi;autofl=func(ml),fr=func(mr);while((rr-ll)>eps){if(fl>fr){rr=mr;mr=ml;fr=fl;ml=ll+(rr-ll)*(1-phi);fl=func(ml);}else{ll=ml;ml=mr;fl=fr;mr=ll+(rr-ll)*phi;fr=func(mr);}}Tmid=(ll+rr)/2;return{mid,func(mid)};}intmain(){intn;std::cin>>n;std::vector<int>a(n+1);for(inti=1;i<=n;++i)std::cin>>a[i];for(inti=n;i>=1;--i)a[i]-=a[i-1];longlongv;std::cin>>v;// Cost of adding M more teleporters to a segment of length LEN.autof=[&](intlen,intm)->longlong{longlongrem=len%(m+1);intq=len/(m+1);return(m+1-rem)*q*q+rem*(q+1)*(q+1);};// Calculate h(k) = min_x f(x) - k * g(x).autocalc=[&](longdoublek)->longdouble{longdoubleres=0;for(inti=1;i<=n;++i){res+=-golden_section_search(0,a[i],[&](intm)->longdouble{return-m+k*f(a[i],m);}).second;}returnres;};// Solve the dual problem.autores=golden_section_search(-1.0l,0.0l,[&](longdoublek)->longdouble{returncalc(k)+k*v;},1e-12l).second;std::cout<<(int)ceill(res)<<std::endl;return0;}