思路比較好想
樹鏈剖分
對於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...