jzoj4640. 【GDOI2017模拟7.15】妖怪
Description
Input
Output
Sample Input
3
1 1
1 2
2 2
Sample Output
8.0000
Data Constraint
題解
我還挺喜歡數(shù)學(xué)的呢
這題一眼看上去不會(huì),化化式子沒想到未知數(shù)竟然是一個(gè)反比例+一次函數(shù)的樣子。
長(zhǎng)這樣:ax+bx\frac a x+bxxa?+bx
當(dāng)時(shí)心態(tài)就沒了。
原來這玩意是一個(gè)在高中叫做雙勾函數(shù)(或?qū)春瘮?shù)或耐克函數(shù))
很好,于是我們就看看這個(gè)玩意長(zhǎng)什么樣——
既然是長(zhǎng)這個(gè)樣子,那么應(yīng)該就有一個(gè)頂點(diǎn)(最小點(diǎn))。
利用均值不等式可以得到——
(aba,2ab)(\frac{\sqrt{ab}}a,2\sqrt{ab})(aab??,2ab?)
由于圖中有很多很多的雙勾函數(shù),那么其中必然有一些線沒有用的。
我們考慮刪去這些沒有用的
怎么刪?
首先我們對(duì)于任意兩點(diǎn)——滿足
ai<aj且yi<yj(答案)a_i<a_j且y_i<y_j(答案)ai?<aj?且yi?<yj?(答案)
那么
ai+bi+ai?x+bix<aj+bj+aj?x+bjxa_i+b_i+a_i*x+\frac{b_i}{x}<a_j+b_j+a_j*x+\frac{b_j}{x}ai?+bi?+ai??x+xbi??<aj?+bj?+aj??x+xbj??
化一波式子得到:
x>bi?bjaj?aix>\frac{b_i-b_j}{a_j-a_i}x>aj??ai?bi??bj??
設(shè)c[i,j]=bi?bjaj?aic[i,j]=\frac{b_i-b_j}{a_j-a_i}c[i,j]=aj??ai?bi??bj??
則我們對(duì)于一個(gè)c[i,j]>c[j,k]c[i,j]>c[j,k]c[i,j]>c[j,k]那么j這個(gè)點(diǎn)就是沒有用的。
所以說,我們就得到一個(gè)序列ddd,序列滿足c[di?1,di]<c[di,di+1]c[d_{i-1},d_i]<c[d_i,d_{i+1}]c[di?1?,di?]<c[di?,di+1?]
這個(gè)東東是遞增的。
那么我們發(fā)現(xiàn):當(dāng)xxx在c[di?1,di]c[d_{i-1},d_i]c[di?1?,di?]到c[di,di+1]c[d_i,d_{i+1}]c[di?,di+1?]這段區(qū)間內(nèi)時(shí),did_idi?的函數(shù)值是最大的。
因此,我們?cè)?span id="ozvdkddzhkzd" class="katex--inline">did_idi?的函數(shù)上判斷這段區(qū)間的最小值即可。
怎么判斷?可能有三種情況:
1、在頂點(diǎn)左邊。
2、在頂點(diǎn)右邊。
3、橫跨頂點(diǎn)。
O(n)O(n)O(n)求即可。
代碼
vari,j,k,l,n,m,now:longint;a,b,d:array[0..1000003] of longint;op,oq,x,y,ans,aa,bb:extended; function min(x,y:extended):extended; beginif x<y then exit(x);exit(y); end; procedure qsort(l,r:longint); vari,j,m,m1:longint; begini:=l;j:=r;m:=a[(l+r) div 2];m1:=b[(l+r) div 2];repeatwhile (a[i]<m) or ((a[i]=m) and (b[i]<m1)) do inc(i);while (a[j]>m) or ((a[j]=m) and (b[j]>m1)) do dec(j);if i<=j thenbegina[0]:=a[i];a[i]:=a[j];a[j]:=a[0];b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];inc(i);dec(j);end;until i>j;if l<j then qsort(l,j);if r>i then qsort(i,r); end; function pd(i:longint):boolean; varx,y,op,oq:extended; beginx:=b[d[now]]-b[d[now-1]];y:=a[d[now-1]]-a[d[now]];op:=x/y;x:=b[i]-b[d[now]];y:=a[d[now]]-a[i];oq:=x/y;if op>oq then exit(true);exit(false); end; begin//assign(input,'monster.in');reset(input);readln(n);for i:=1 to n dobeginread(a[i],b[i]);end;qsort(1,n);now:=1;d[1]:=1;for i:=2 to n dobeginif a[i]>a[1] thenbegininc(now);d[now]:=i;j:=i;break;end;end;for i:=j+1 to n dobeginif a[i]>a[d[now]] thenbeginwhile (now>=2) and (pd(i)) do dec(now);inc(now);d[now]:=i;end;end;ans:=maxlongint;for i:=2 to now-1 dobeginx:=b[d[i]]-b[d[i-1]];y:=a[d[i-1]]-a[d[i]];op:=x/y;x:=b[d[i+1]]-b[d[i]];y:=a[d[i]]-a[d[i+1]];oq:=x/y;aa:=a[d[i]];bb:=b[d[i]];if op>sqrt(aa*bb)/aa then ans:=min(ans,aa*op+bb/op+aa+bb);if oq<sqrt(aa*bb)/aa then ans:=min(ans,aa*oq+bb/oq+aa+bb);if (op<=sqrt(aa*bb)/aa) and (oq>=sqrt(aa*bb)/aa) then ans:=min(ans,2*sqrt(aa*bb)+aa+bb);end;x:=b[d[now]]-b[d[now-1]];y:=a[d[now-1]]-a[d[now]];aa:=a[d[now]];bb:=b[d[now]];op:=x/y;if op>sqrt(aa*bb)/aa then ans:=min(ans,aa*op+bb/op+aa+bb)else ans:=min(ans,2*sqrt(aa*bb)+aa+bb);writeln(ans:0:4); end.轉(zhuǎn)載于:https://www.cnblogs.com/RainbowCrown/p/11148359.html
總結(jié)
以上是生活随笔為你收集整理的jzoj4640. 【GDOI2017模拟7.15】妖怪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。