jzoj4640. 【GDOI2017模拟7.15】妖怪
Description
Input
Output
Sample Input
3
1 1
1 2
2 2
Sample Output
8.0000
Data Constraint
題解
我還挺喜歡數學的呢
這題一眼看上去不會,化化式子沒想到未知數竟然是一個反比例+一次函數的樣子。
長這樣:ax+bx\frac a x+bxxa?+bx
當時心態就沒了。
原來這玩意是一個在高中叫做雙勾函數(或對勾函數或耐克函數)
很好,于是我們就看看這個玩意長什么樣——
既然是長這個樣子,那么應該就有一個頂點(最小點)。
利用均值不等式可以得到——
(aba,2ab)(\frac{\sqrt{ab}}a,2\sqrt{ab})(aab??,2ab?)
由于圖中有很多很多的雙勾函數,那么其中必然有一些線沒有用的。
我們考慮刪去這些沒有用的
怎么刪?
首先我們對于任意兩點——滿足
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??
設c[i,j]=bi?bjaj?aic[i,j]=\frac{b_i-b_j}{a_j-a_i}c[i,j]=aj??ai?bi??bj??
則我們對于一個c[i,j]>c[j,k]c[i,j]>c[j,k]c[i,j]>c[j,k]那么j這個點就是沒有用的。
所以說,我們就得到一個序列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?]
這個東東是遞增的。
那么我們發現:當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?]這段區間內時,did_idi?的函數值是最大的。
因此,我們在did_idi?的函數上判斷這段區間的最小值即可。
怎么判斷?可能有三種情況:
1、在頂點左邊。
2、在頂點右邊。
3、橫跨頂點。
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.轉載于:https://www.cnblogs.com/RainbowCrown/p/11148359.html
總結
以上是生活随笔為你收集整理的jzoj4640. 【GDOI2017模拟7.15】妖怪的全部內容,希望文章能夠幫你解決所遇到的問題。