基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径。
从而将每个查询转换成区间,表示从该结点到叶子结点的路径。
离线做,按照右边界升序排序。
利用树状数组区间修改。
树状数组表示有K个数据的数量,利用pos进行维护。
假设现有的sz >= K, 那么需要对区间进行修改。
1 /* 4358 */ 2 #include 3 #include 4 #include 5 #include
数据发生器。
1 from copy import deepcopy 2 from random import randint, shuffle 3 import shutil 4 import string 5 6 7 def GenDataIn(): 8 with open("data.in", "w") as fout: 9 t = 1010 bound = 10**911 fout.write("%d\n" % (t))12 for tt in xrange(t):13 n = randint(100, 200)14 K = randint(1, 5)15 fout.write("%d %d\n" % (n, K))16 ust = [1]17 vst = range(2, n+1)18 L = []19 for i in xrange(n):20 x = randint(1, 100)21 L.append(x)22 fout.write(" ".join(map(str, L)) + "\n")23 for i in xrange(1, n):24 idx = randint(0, len(ust)-1)25 u = ust[idx]26 idx = randint(0, len(vst)-1)27 v = vst[idx]28 ust.append(v)29 vst.remove(v)30 fout.write("%d %d\n" % (u, v))31 q = n32 fout.write("%d\n" % (q))33 L = range(1, n+1)34 shuffle(L)35 fout.write("\n".join(map(str, L)) + "\n")36 37 38 def MovDataIn():39 desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"40 shutil.copyfile("data.in", desFileName)41 42 43 if __name__ == "__main__":44 GenDataIn()45 MovDataIn()