日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj4640. 【GDOI2017模拟7.15】妖怪

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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&lt;aj且yi&lt;yj(答案)a_i&lt;a_j且y_i&lt;y_j(答案)ai?<aj?yi?<yj?
那么
ai+bi+ai?x+bix&lt;aj+bj+aj?x+bjxa_i+b_i+a_i*x+\frac{b_i}{x}&lt;a_j+b_j+a_j*x+\frac{b_j}{x}ai?+bi?+ai??x+xbi??<aj?+bj?+aj??x+xbj??
化一波式子得到:
x&gt;bi?bjaj?aix&gt;\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]&gt;c[j,k]c[i,j]&gt;c[j,k]c[i,j]>c[j,k]那么j這個點就是沒有用的。
所以說,我們就得到一個序列ddd,序列滿足c[di?1,di]&lt;c[di,di+1]c[d_{i-1},d_i]&lt;c[d_i,d_{i+1}]c[di?1?,di?]<c[di?,di+1?]
這個東東是遞增的。
那么我們發現:當xxxc[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】妖怪的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。