這題超有(e)趣(xin)的。。。(又是一道結論題。。。)
結論:對於乙個三角劃分(即題目中的劃分方式),每次選擇一條劃分的邊,將全圖分為兩個多邊形,再各自選擇一條劃分的邊,遞迴操作,一定存在某種方案,使得在很小的層數內全部劃分為三角形。。。
有了這個結論,這題就很好做了。
可以每次選擇那條邊後,其左側的點到達右側的點一定經過這兩個點中的乙個,因此只需要把這兩個點到達所有其他點的最短路求出來。
詢問的時候,一直找到將詢問點分為兩部分的那一層,然後直接回答即可。
複雜度o((
n+q)
∗層數)
o((n+q)*層數)
o((n+q
)∗層數
) 關於這個層數的數量級,博主不嚴謹地證明認為應該是log
32nlog_^n
log23
n的級別,如果讀者有嚴謹證明,請務必告訴我。
#include
#include
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 100010
#define maxm 200000
using
namespace std;
struct node
}return res;
}void
add_point
(int x)
void
add_edge
(int u,
int v)
}tree[maxm]
;queue<
int> q;
void
bfs(
int stx,vector<
int>
&dist,vector
int>
>
&a)}}}
int ncnt;
void
build
(int id)
build
(pl)
;build
(pr);}
intquery
(int id,
int x,
int y)
if(u<=l||u>=r)
}int
main()
ncnt=1;
build(1
);sf(
"%d"
,&m)
;int x,y;
for(
int i=
1;i<=m;i++
)}
四校省選 Round 1
題解就不寫了。但是是非常值得反思的兩場考試。完全按照省選模擬出來的兩場。最近的考試狀態一直很差勁,這兩場暴露的細節更加致命。尤其是 day2 t1 很早就讀出了題意寫了正解,對拍也打好了。結果離散化陣列沒開二倍,直接炸成10分。昨天的題 t1 也是類似的問題。推出30分的寫法,結果 bsgs 上界寫...
四校聯考 20171001
二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...
四校聯考(20170910)
ditoly出的題目果然喪,待我一天啃一題。廢話不多說,開更 我是分割線 t1 最大值 max 問題描述 小c有n個區間,其中第i個區間為 li,ri 小c想從每個區間中各選出乙個整數,使得所有選出的數and起來得到的結果最大,請你求出這個值。輸入格式 第一行乙個正整數n,表示區間個數。接下來n行,...