校內模擬 Polygon(結論)(樹形DP)

2021-09-28 22:56:54 字數 1437 閱讀 9572

簡要題意:

給你乙個凸多邊形,並且給你乙個三角剖分,請你找乙個以這個凸多邊形頂點為頂點的三角形,使得在給出的三角剖分中,被你找的三角形覆蓋的三角形盡可能多。這裡並不要求完全覆蓋,只要交的面積不為0即可。

由於資料範圍不大(出題人懶得寫資料生成器造不了強的資料),考場上寫的o(n

2log⁡n

)o(n^2\log n)

o(n2

logn

)的過了,但是這道題可以做到o(n

)o(n)

o(n)

。將所有三角形建點,有公共邊的三角形之間連邊,顯然是乙個樹形結構。

這個結構上任意兩點之間的簡單路徑穿過的邊,在原來的凸多邊形中都可以用一條直線來全部穿過。

並且兩片葉子之間的路徑唯一對應著原圖的一條對角線。

所以三角形在轉化後的圖裡面對應的就是三叉路徑,求出最長的三叉路徑用樹形dp即可。

**:

#include

#define ll long long

#define re register

#define cs const

cs int n=

1e3+7;

int n,ans;

int el[n]

,nxt[n<<1]

,to[n<<1]

,ec;

inline

void

adde

(int u,

int v)

std::unordered_map<

int,

int> id;

int d[n]

;void

dfs1

(int u,

int p)

void

dfs2

(int u,

int p,

int out)

;for

(int re e=el[u]

,v=to[e]

;e;v=to[e=nxt[e]])

if(v!=p)

ans=std::

max(ans,out+

1+mx[0]

+mx[1]

);for(

int re e=el[u]

,v=to[e]

;e;v=to[e=nxt[e]])

if(v!=p)

dfs2

(v,u,

1+std::

max(out,d[v]

==mx[1]

?mx[0]

:mx[1]

));}

signed

main()

dfs1(1

,0);

dfs2(1

,0,0

);std::cout<"\n"

;return0;

}

校內模擬 19 07 25 中位數 結論

前言 這 是模擬賽這就是爆 賽 每道題都有思路 x 每道題都只能暴力 題面給你乙個長度為 的正整數序列 它包含2n 12 n 1 2n 1 個非空子序列,注意到2n 12 n 1 2n 1 是乙個奇數。我們定義乙個子串行的權值為子串行內所有元素權值之和。求所有非空子序列的權值的中位數。n 2000,...

校內模擬 鎖

沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...