這是今年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,可指導畢設,課設 成績查詢系統文件 我們做的是成績查詢系統,有教師管理系統和學生查系統。在教師管理系統中的功能如下 插入學生成績。查詢學生成績。修改學生成績。註冊新生。修改自己登入密碼。可以聯絡教務處負責人。登入學校 學生查詢系統的功能如下 查詢自己的成...