mmm含樹 查詢點的提示

2021-06-16 22:22:47 字數 2455 閱讀 5977

這是今年gdkoi的一題:有一棵樹,開始時所有結點的值都是0。有多個操作,每個操作有兩種:

1.對某個點增加w,設dis(i,j)為點i到點j的最短距離,那麼某個結點增加w時,對於任意乙個結點j,它的值會增加w + dis(i,j)。

2.詢問某點的值。

w可以忽略,因為整棵樹都要加上w,只要記下所有w的和就可以了,輸出答案時再加上。這題的突破口就是只需要求乙個點的值,這就取決於其他發生變化的點對該點的影響。這裡先結合乙個樣例,說明一些變數:

如圖:點2,5,7,8被修改過(忽略了w)。

dis(i,j):點i到點j的最短距離。

lca(i,j):點i和點j的最近公共祖先。

dep(i):點i到根結點的距離,dep(6)= 2,dep(5)= 3。

cnt(i):以i為根的子樹中的點,被修改過的次數,cnt(3)= 1,cnt(2)= 3。

deps(i):以i為根的子樹中的被修改過的點的dep和,deps(2) = dep(2)+ dep(5)+ dep(7) = 1 + 3 + 3 = 7。

首先,要求任意兩點i,j的距離,用dis(i,j)來表示是不好的,因為這沒有內在的關係。這個可以表示成dep(i)+ dep(j)- 2 * dep(lca(i,j))。畫個圖就知道了。

如樣例,有乙個詢問,詢問3的值,那麼它等於:

dep(3)* cnt(3) +deps(3) -2 * dep(3)* cnt(3)

+dep(3)* (cnt(2)- cnt(3)) + (deps(2)- deps(3)) -2 * dep(2)*(cnt(2)- cnt(3))

+dep(3)* (cnt(1)- cnt(2)) + (deps(1)- deps(2)) -2 * dep(1)*(cnt(1)- cnt(2))

可以發現,有很多值是可以約去的,還有dep(2)= dep(3)- 1,dep(1)= dep(3)- 2,化簡得:

dep(3) * cnt(1) +  deps(1) - 2 * (cnt(3) + cnt(2))。

再可以由此推到普遍:

詢問點u:dep(u) * cnt(1) +  deps(1) - 2 * (cnt(u) + cnt(u的父親) + cnt(u的父親的父親) + … + cnt(根的兒子))。注意不要加到根。

如此看來,我們需要的只是求cnt的和。這個可以用樹鏈剖分來統計。

對於這些改一些,問一些的題目,不要侷限於維護答案的值,可以通過維護其他的資訊,以便於求答案。

貼個**:

#include #include using namespace std;

typedef long long ll;

inline int getint()

const int n = 100007;

int n;

int from[n], to[n << 1], next[n << 1], nedge;

void insert(int a, int b)

void init()

}int q[n];

int father[n], size[n], dep[n];

int npath, top[n], len[n], belong[n], idx[n];

void split()

} }for (int i = n - 1; i >= 0; i --)

}if (p == -1)

else

}}int nnode;

struct node

inline int size()

}node[n << 1], *tree[n];

void build(node *p, int lo, int hi)

}inline void down(node *p)

void modify(node *p, int le, int ri)

else }

ll ask(node *p, int le, int ri)

}void prepare()

}ll find(int a, bool isask)

if (a != 0)

if (isask) ret += ask(tree[x], idx[a], idx[0]);

else modify(tree[x], idx[a], len[x]);

return ret;

}void solve()

else }

int main()

return 0;

}

線段樹 (更新區間查詢點)秋實大哥與小朋友

problem description 秋實大哥以賙濟天下,鋤強扶弱為己任,他常對天長嘆 安得廣廈千萬間,大庇天下寒士俱歡顏。所以今天他又在給一群小朋友發糖吃。他讓所有的小朋友排成一行,從左到右標號。在接下去的時間中,他有時會給一段區間的小朋友每顆糖,有時會問第x個小朋友手裡有幾顆糖。這對於沒上過學...

QML處理xml 查詢含命名空間的節點

qml處理xml使用的是xmllistmodel xmlrole,基本的操作可以參考官方文件,說的很清楚。使用query查詢目標節點時,如果包含 namespace,如 a book 則會查詢到null。如果宣告的是預設命名空間,如 需要如下處理 xmllistmodel 如果是 xmlns ywe...

基於PHP MYSQL的成績查詢系統(含原始碼)

獲取專案原始檔,聯絡q 1415736481,可指導畢設,課設 成績查詢系統文件 我們做的是成績查詢系統,有教師管理系統和學生查系統。在教師管理系統中的功能如下 插入學生成績。查詢學生成績。修改學生成績。註冊新生。修改自己登入密碼。可以聯絡教務處負責人。登入學校 學生查詢系統的功能如下 查詢自己的成...