BZOJ3589动态树】的更多相关文章

bzoj3589 动态树 链接 bzoj 思路 求链并. 发现只有最多5条链子,可以容斥. 链交求法:链顶是两条链顶深度大的那个,链底是两个链底的\(lca\) 如果链底深度小于链顶,就说明两条链没有交集. 复杂度\(m*2^klog^2n\) 还有一种做法. 把所有链子都打上\(0/1tag\),只有\(1\)才能有贡献. 应该挺麻烦的,或者说都挺好写的. 代码 #include <bits/stdc++.h> using namespace std; const int _=4e5+7;…
题目描述 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝, 让你求出在这些树枝上的节点的果子数的和. 注意, 树枝之间可能会重合, 这时重合的部分的节点的果子只要算一次. 输入 第一行一个整数n(1<=n<=200,000), 即节点数. 接下来n-1行, 每行两个数字…
显然容斥后转化为求树链的交.这个题非常良心的保证了查询的路径都是到祖先的,求交就很休闲了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 200010 #defin…
对于既要支持子树修改又要支持链查询, 需要树链剖分 然后求出DFS序,DFS的时候先DFS重儿子, 然后子树是1个区间,链是$O(\log n)$个区间 这道题对于查询若干条链的并: 由于K<=5,所以考虑容斥原理 转化为查询若干条链的交, 假设有5条链ABCDE要求交 可以先求AB的交T,再求TC的交… 考虑如何求两条树链的交: 本题中树链保证是父亲到儿子 设两条链为(a,b)(x,y),b是a的父亲,y是x的父亲 保存的交是(a',b') c=lca(a,x) 如果c比b高或者c比y高,那么…
http://www.lydsy.com/JudgeOnline/problem.php?id=3589 树链剖分 用线段数维护扫描线的方式来写,标记只打不下传 #include<cstdio> #include<iostream> #include<algorithm> #define N 200001 using namespace std; int n; ],nxt[N<<],tot; int siz[N],dep[N],fa[N]; int bl[N…
操作0,显然直接线段树解决. 操作1,瓶颈在于重叠的链只算一次.在线段树上来看,如果一个区间被覆盖了,那么只算这个区间,子树里面也就不管了. 考虑对节点打标记来表示是否覆盖.但是,如果统一打完之后,并不方便计算打上标记的点的和.明确目标,现在希望能覆盖很多小区间的一个大区间被打上标记之后用他来更新答案.````` 可以对每一个点维护$acc_i$表示这个点子树内被覆盖的区间的和.那么,当有更大的区间覆盖上去的时候,直接把$acc_i$改成$sum_i$,传上去即可,同时在这个点打上已覆盖的标记.…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3589 题解 事件 \(0\) 不需要说,直接做就可以了. 事件 \(1\) 的话,考虑如果直接查询然后相加的话,会有很多段被算重了.于是考虑容斥,把算重的段给减掉就可以了.至于如何计算每一段的答案,直接树剖吧. 时间复杂度 \(O(q\log^2n)\). #include<bits/stdc++.h> #define fec(i, x, y) (int i = head[x], y =…
**错误改了一上午. 先做熟练泼粪 k<=5,因此我们可以模拟这个过程,在线段树上把标记建出来然后pushup时候更新就好了. By:大奕哥 #include<bits/stdc++.h> using namespace std; ; struct tree{ int l,lz,ll;long long s,ret; }t[N<<]; int head[N],cnt,n,id,bel[N],pos[N],size[N],d[N],f[N],son[N],ed[N]; stru…
3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝…
Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝, 让你求出在这些树枝上的节点的果子数的和. 注意, 树枝之间可能会重合, 这时重合的部分的节点的果子只要算一次. Input 第一行一个整数n(1<=n<=200,000), 即节点数. 接下来n-…