题目

直通车

很显然这是个树刨的板子,树上链查询和子树查询

注意:

1.这个点的树根为 0 而不是 1 所以注意读图时点标号 +1 就解决了

2.注意数据范围\(2^{32}\)

然后板子就能过了

node

#include <iostream>
#include <cstdio>
#define N 100005
#define int long long
#define lson rt << 1
#define rson rt << 1|1 using namespace std;
int n,m,r;
int pre[N],dep[N],fa[N],son[N],siz[N],top[N],dfn[N],dfn2[N],cnt; namespace Seg{
struct Tree{
int sum,len,lazy;
}tree[N << 1];
void push_up(int rt){
tree[rt].sum = tree[lson].sum + tree[rson].sum;
}
void build(int rt,int l,int r){
tree[rt].len = r - l + 1;
if(l == r){
tree[rt].sum = 0;
return;
}
int mid = (l + r)>>1;
build(lson, l, mid);
build(rson, mid + 1, r);
push_up(rt);
}
void pushdown(int rt) {
if (tree[rt].lazy){
tree[lson].sum += tree[rt].lazy * tree[lson].len;
tree[rson].sum += tree[rt].lazy * tree[rson].len;
tree[lson].lazy += tree[rt].lazy;
tree[rson].lazy += tree[rt].lazy;
tree[rt].lazy = 0;
}
}
void update(int rt,int k,int l,int r,int L,int R){
if(l >= L && r <= R){
tree[rt].sum += k * tree[rt].len;
tree[rt].lazy += k;
return;
}
pushdown(rt);
int mid = (l + r) >> 1;
if(mid >= L) update(lson, k, l, mid, L, R);
if(mid < R) update(rson, k, mid + 1, r, L, R);
push_up(rt);
}
int query(int rt,int l,int r,int L,int R){
if(l >= L&& r <= R) return tree[rt].sum;
pushdown(rt);
int mid = (l + r)>>1,ans = 0;
if(L <= mid) ans += query(lson,l,mid,L,R);
if(mid < R) ans += query(rson,mid + 1,r,L,R);
return ans;
}
}
namespace Cut {
struct edge{
int v,nxt;
}e[N << 1];
int head[N],js;
void add_edge(int u,int v){
e[++js].v = v;e[js].nxt = head[u];head[u] = js;
}
void dfs(int x,int f,int d){
dep[x] = d,fa[x] = f,siz[x] = 1;
for(int i = head[x]; i;i = e[i].nxt){
int v = e[i].v;
if(v != fa[x]){
dfs(v, x, d + 1);
siz[x] += siz[v];
if(!son[x]||siz[son[x]] < siz[v])
son[x] = v;
}
}
}
void dfs2(int x,int tp){
dfn[x] =++cnt,pre[cnt] = x,top[x] = tp;
if(son[x]) dfs2(son[x],tp);
for(int i = head[x]; i; i = e[i].nxt){
int v = e[i].v;
if(v != fa[x]&&v != son[x]) dfs2(v,v);
}
}
int query_tree(int x){
return Seg::query(1, 1, n, dfn[x],dfn[x] + siz[x] - 1);
}
void change_sum(int x,int y,int k){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x,y);
Seg::update(1, k, 1, n,dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x,y);
Seg::update(1, k, 1, n,dfn[x], dfn[y]);
}
}
signed main() {
int Q;
cin>>n;
for (int i = 1, x, y; i < n; i++) {
cin>>x>>y;
Cut::add_edge(x + 1, y + 1);
Cut::add_edge(y + 1, x + 1);
}
Cut::dfs(1, 0, 1);
Cut::dfs2(1, 1);
Seg::build(1, 1, n);
cin >> Q;
while(Q--){
int x,y,z;
char opt;
cin >> opt;
if (opt == 'A') cin>>x>>y>>z,Cut::change_sum(x + 1, y + 1, z);
if (opt == 'Q') cin>>x,printf("%lld\n", Cut::query_tree(x + 1));
}
}

最新文章

  1. Docker与CI持续集成/CD
  2. 关于EM,REM,PX的几点注意
  3. Spark ML聚类分析之k-means||
  4. 9、C#基础整理(多维数组)
  5. IAR stm8带库的工程模板
  6. (转)DevExpress GridView属性设置
  7. POJ 1001 Exponentiation 模拟小数幂
  8. 详解android的号码匹配
  9. SSH反向连接及Autossh
  10. IDEA设置优化
  11. CentOS7+CDH5.14.0安装CDH错误排查:HBase服务出现 该运行状况测试不良,因为 Service Monitor 未找到活动 Master
  12. python 的 format 函数
  13. mysql 删除表 外键出错
  14. 解决:jsp 页面不全,response 内容不完整
  15. HDU_3183_A Magic Lamp
  16. THREADSPOOL
  17. 不得不知的Excel技巧
  18. Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)
  19. SSH工具脚本录入
  20. win下idea远程提交WordCount任务到HA集群

热门文章

  1. 采购订单写入sap失败后,抛出自定义异常,回滚数据库
  2. 这4种ThreadLocal你都知道吗?
  3. Linux内核源码分析之setup_arch (三)
  4. k8s之DNS服务器搭建
  5. Android——几种数据存储应用浅谈
  6. python之shelve、xml、configparser模块
  7. STP、PVST、MST协议
  8. 【Java基础】Java8 新特性
  9. 【JavaWeb】Cookie&amp;Session
  10. LeetCode198--打家劫舍问题