★★★★ 輸入檔案:laugh.in
輸出檔案:laugh.out
簡單對比
時間限制:3 s 記憶體限制:512 mb
【問題描述】
設t 為一棵有根樹,我們做如下的定義:
• 設a和b為t 中的兩個不同節點。如果a是b的祖先,那麼稱「a比b不知道高明到**去了」。
• 設a 和 b 為 t 中的兩個不同節點。如果 a 與 b 在樹上的距離不超過某個給定常數x,那麼稱「a 與b 談笑風生」。
給定一棵n個節點的有根樹t,節點的編號為1 n,根節點為1號節點。你需要回答q 個詢問,詢問給定兩個整數p和k,問有多少個有序三元組(a; b; c)滿足:
1. a、b和 c為 t 中三個不同的點,且 a為p 號節點;
2. a和b 都比 c不知道高明到**去了;
3. a和b 談笑風生。這裡談笑風生中的常數為給定的 k。
【輸入格式】
輸入檔案的第一行含有兩個正整數n和q,分別代表有根樹的點數與詢問的個數。接下來n-1行,每行描述一條樹上的邊。每行含有兩個整數u和v,代表在節點u和v之間有一條邊。接下來q 行,每行描述乙個操作。第i行含有兩個整數,分別表示第i個詢問的p和k。
【輸出格式】輸出 q 行,每行對應乙個詢問,代表詢問的答案。
laugh.in
5 31 2
1 32 4
4 52 2
4 12 3
laugh.out31
3這道題目一看就是要用某種資料結構的。
觀察它的詢問:有兩類情況
①:b點是a點祖先,可以o(1)求出答案。
②:b是a子樹中的乙個節點,我們可以用dfs序,那麼b點所在子樹就是dfs序列中連續的一段,考慮對子樹分層,接著用主席樹水過了。
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6const
int maxn=300010;7
int cnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];8
void addedge(int a,int
b)13
intdep[maxn],sz[maxn],id[maxn],end[maxn],tot;
14void dfs(int
node)
22 end[node]=tot;23}
24 queueq;
25int rt[maxn],ch[maxn*30][2
],cont;
26long
long tr[maxn*30
];27
void insert(int pre,int &rt,int l,int r,int
g)37
long
long query(int pre,int rt,int l,int r,int a,int
b)45
intmain()
55 dep[1]=1
;56 dfs(1
);57 q.push(1
);58
int maxd=0;59
while(!q.empty())67}
68int
a,k;
69long
long
ans;
70while(q--)
76return0;
77 }
資料結構 主席樹
1.p3919 模板 可持久化線段樹 1 可持久化陣列 include define mkp make pair define pb push back define v t vector define all x x.bg,x.ed define newline puts define si x ...
主席樹 資料結構的克星
1.主席樹 又叫可持續化線段是,因為每次對主席樹的修改,都會重新建立一棵新的數,保留這沒修改之前的歷史紀錄,所以叫可持久化線段樹,她是以線段樹為基礎建立的多棵樹,每棵樹代表著乙個歷史階段,它與線段樹的儲存結構稍微有點不同,就是線段是的左右兩個孩子與根節點都存在這x2,x2 1的關係,而主席樹的根節點...
可持久化資料結構之靜態主席樹
參考部落格 前言 如果完全掌握了主席樹的前置知識,主席樹其實也是一種並不算很難的資料結構 雖然蒟蒻還是花了好久 主席樹主要的前置知識就是權值線段樹,一旦理解了權值線段樹的相關知識,那麼主席樹的學習應該也會變得較為簡單。權值線段樹是線段樹的一種,但是它與普通線段樹不同的地方在於,普通線段樹節點的區間代...