ZJOI2019 浙江省選(半平面交)(二分)

2021-09-28 12:16:18 字數 2913 閱讀 4837

首先這道題是zjoi2019裡面idea最簡單的題。

注意是idea最簡單的題,也就是說六道題口胡起來最簡單的是這道。那這道題憑什麼放在d2t3?

憑它細節巨多。。。

來,先口胡正解做法。

按照斜率給所有直線排序,考慮從答案小的往答案大的處理,把已經得到答案的直線跳過剩下的直線拿來做半平面交,然後列舉所有已經得到答案的直線,考慮x

xx處於什麼區間的時候這條直線會讓下面直線的排名+1,記錄所有變化位置,掃瞄線,更新答案。

沒了,思路就是這麼簡單,你讓我再把思路講詳細點我也不知道該怎麼講。如果看不懂說明你的計算幾何水平還沒到能做這道題的程度

然後是細節。

首先是做半平面交時候的細節。

第乙個細節,當交成下面這種情況的時候,三條線都要保留:

因為題目中排名的計算方式是「嚴格大於」,所以等於的情況不能夠影響它的排名,但是按照一般半平面交的寫法,這種情況是要彈掉的。。。

然後你看了一眼資料範圍,這是乙個開long double都會炸精度的範圍,你並沒有什麼好的辦法來處理這種情況。。。

於是你手寫乙個分數類,然後你發現它乘法爆long long 了,所以分數我們只能表示成a+b

/ca+b/c

a+b/

c的形式。。。

第二個細節,交成下面這種情況中間那條線是要彈掉的:

注意這裡實際上說的是中間那條線不能夠在x

xx為任何乙個整數的時候成為最大值。

但是本題要求的x

xx必須是乙個非負整數,所以中間那條線現在已經就宣告gg了

既然要求x

xx是乙個非負整數,那麼新的直線與原來直線的交點到了x

xx負半軸是需要把棧彈完的。

其實不容易注意到的細節就前面兩個,剩下的就是二分找到之前已經確定了答案的直線的影響範圍。這個其實還好,注意一下邊界,根據選擇記錄開區間還是閉區間,細節有所不同也不是很好說清楚,只有自己注意了。

具體實現不建議用任何實數型別,其實封裝乙個簡易的帶分數型別是可以做到的,因為只有賦值和比較,沒有帶分數之間的運算。

**:

#include

#define ll long long

#define re register

#define cs const

namespace io

template

<

typename t>

inline t get()

inline

intgi()

inline ll gl()

}using

namespace io;

using std::cerr;

using std::cout;

using pli=std::pair

int>

;#define fi first

#define se second

cs int n=

1e5+7;

struct frac

frac

(ll x,ll y)

ll flr

()cs

ll cel

()cs

bool

operator

<

(cs frac &x)cs

bool

operator

<=

(cs frac &x)cs};

int n,m,ct,tp;

int id[n]

,st[n]

,ans[n]

;ll a[n]

,b[n]

;frac x[n]

;pli q[n<<1]

;inline frac gx

(int x,

int y)

inline

void

solve

(int k)

x[tp+1]

=frac

(1ll

<<60,

1);for

(int re i=

1;i<=n;

++i)if(

~ans[i]

) q[

++ct]

=pli

(a[st[t]

]>=a[i]

?0ll:gx

(st[t]

,i).

flr()+

1,1)

; l=

2,r=tp,t=1;

while

(l<=r)

if(a[st[t]

]>a[i]

)q[++ct]

=pli(gx

(st[t]

,i).

cel(),

-1);

} std::

sort

(q+1

,q+ct+1)

;for

(int re i=

1,j=

1,p=

0;i<=tp;

++i)}}

signed

main()

);for(

int re i=

1;i<=m;

++i)

solve

(i);

for(

int re i=

1;i<=n;

++i)cout<

<<

" ";

return0;

}

2019浙江省賽

題意 n個點的二叉樹 無向邊 的單向邊,構造一條到達且只到達每個點一次的路徑。題解 兩次dfs。第一次dfs為向i 1優先,2i次之。然而,發現某些點有兩條出路,這是由於該點在最底層 有些點沒有達到,這是因為這些點在最後一層或倒數第二層的右下角 第二次dfs時先判斷該點的右子節點是否達到過,如果沒到...

好題推薦(浙江省選)矩陣構造

前幾天我被很多次問到關於矩陣的問題,簡單點被其他大佬秒切,難度大會被吐槽orz 然而我在洛谷肝題時發現一道很好的題 潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位於巴西中部馬托格羅索州的南部地區。每當雨季來臨,這裡碧波蕩漾 生機盎然,引來不少遊客。為了讓遊玩更有情趣,人們在池塘的 建設了幾座石墩和石...

2018 浙江省選一試 反思

省選一試反思 省選開始之前,我的心態還是很好的,不是特別緊張,也不是特別放鬆。進了考場,先是要輸密碼解壓題面和樣例,但是我輸入了好幾次老師的密碼還是不對,心裡就急了。開啟記事本,輸入好了又核對過了複製進去還是不對。就這樣搞了10分鐘,最後聽說感嘆號是中文全形,又弄了兩三次,才終於看到了題面。但是,我...