簡要題意:
給你乙個凸多邊形,並且給你乙個三角剖分,請你找乙個以這個凸多邊形頂點為頂點的三角形,使得在給出的三角剖分中,被你找的三角形覆蓋的三角形盡可能多。這裡並不要求完全覆蓋,只要交的面積不為0即可。
由於資料範圍不大(出題人懶得寫資料生成器造不了強的資料),考場上寫的o(n
2logn
)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 ...