Luogu U18430 萌萌的大河

2022-04-30 02:30:09 字數 1999 閱讀 7075

思路比較好想

樹鏈剖分

對於1操作

只需將以該點為根的子樹打標記,將所有數存入陣列排序

每次進行1操作時,判斷若該點已經被標記過,則操作無效

對於操作2

在原樹中求出lca,若lca被標記過,lca就是詢問的兩個點中

編號較小的那個,lca值不改變

對於操作3

若該點打過標記,輸出該點與根的這條鏈上被打過標記的

深度最小節點編號a與該節點編號的差+a的深度

#include #include 

#include

#include

using

namespace

std;

const

int n = 1e6 + 10

;#define yxy getchar()

#define lson jd << 1

#define rson jd << 1 | 1

int n, q, now = 1

, tim, w1, w2, w3;

int head[n], num[n], deep[n], fa[n], lnum[n], rnum[n], son[n], topp[n], siz[n], tree[n], g_min[n << 2

];struct node g[n << 1

];inline

intread()

inline

void add(int u, int

v)void dfs_1(int u, int father, int

dep)

}}void dfs_2(int u, int

tp) dfs_2(son[u], tp);

for(int i = head[u]; ~ i; i =g[i].nxt)

rnum[u] =tim;

}void poi_a(int l, int r, int jd, int

x)

if(g_min[jd])

int mid = (l + r) >> 1

;

if(x <=mid) poi_a(l, mid, lson, x);

else poi_a(mid + 1

, r, rson, x);

}void sec_g(int l, int r, int jd, int x, int y, int

yg)

int mid = (l + r) >> 1

;

if(x <=mid) sec_g(l, mid, lson, x, y, yg);

if(y > mid) sec_g(mid + 1

, r, rson, x, y, yg);

}int calc_lca(int x, int

y)

return deep[x] > deep[y] ?y : x;

}void sec_a(int l, int r, int jd, int x, int

y)

if(g_min[jd])

int mid = (l + r) >> 1

;

if(x <=mid) sec_a(l, mid, lson, x, y);

if(y > mid) sec_a(mid + 1

, r, rson, x, y);

}int get_answer(int l, int r, int

x)

return ret -l;

}int

main()

dfs_1(

1, 0, 1

); dfs_2(

1, 1

);

while(q --)

else

if(opt == 2

)

else}}

return0;

}

貪心題 萌萌噠的GG

萌萌噠的gg 時間限制 10 sec 記憶體限制 128 mb 11月15號是gg的破蛋日,這一天萌萌的gg很早就起床,小 zi 小 xi 打扮了一下,就去參加傳說中的acm icpc亞洲賽了。這一去讓原本萌萌噠的gg變得更加萌 了,在那 的北京賽區中gg 的萌萌噠連回家的路都忘記了。於是萌萌的gg...

萌萌噠的第四題

1099 萌萌噠的第四題 time limit 2s memory limit 128mbyte submissions 427solved 260 description 給乙個數x,定義乙個函式f x 的結果是x的各位數字的平方和,若經過無數次遞迴操作之後若結果為1,也就是f f f f x 1...

萌萌噠的第四題

description 給乙個數x,定義乙個函式f x 的結果是x的各位數字的平方和,若經過無數次遞迴操作之後若結果為1,也就是f f f f x 1,那麼這個數被認為是乙個特別的數。給出乙個數x請問這個數是否特別。input 包含多組測試資料 20 每組資料一行乙個整數x 1 x 10000000...