传送门

看着很吓人,其实就是个树链剖分模板。

可支持操作:

1.将节点 x 到 根 的路径上的值都变成 1

2.将以节点 x 为根的子树的值都变成 0

1A爽~

——代码

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#define root 1, 1, n
#define ls now << 1, l, mid
#define rs now << 1 | 1, mid + 1, r const int MAXN = ;
int n, m, cnt, tim, ans;
int head[MAXN], to[MAXN], next[MAXN];
int f[MAXN], son[MAXN], size[MAXN], deep[MAXN], tid[MAXN], top[MAXN], sum[MAXN << ], turn[MAXN << ]; inline int read()
{
int f = , x = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} inline void dfs1(int u)
{
int i, v;
size[u] = ;
deep[u] = deep[f[u]] + ;
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
dfs1(v);
size[u] += size[v];
if(son[u] == - || size[son[u]] < size[v]) son[u] = v;
}
} inline void dfs2(int u, int tp)
{
int i, v;
top[u] = tp;
tid[u] = ++tim;
if(son[u] != -) dfs2(son[u], tp);
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(v != son[u]) dfs2(v, v);
}
} inline void swap(int &x, int &y)
{
x ^= y ^= x ^= y;
} inline void pushup(int now)
{
sum[now] = sum[now << ] + sum[now << | ];
} inline void pushdown(int now, int len)
{
if(turn[now] == -) return;
sum[now << ] = turn[now] * (len - (len >> ));
sum[now << | ] = turn[now] * (len >> );
turn[now << ] = turn[now];
turn[now << | ] = turn[now];
turn[now] = -;
} inline void update(int x, int ql, int qr, int now, int l, int r)
{
if(ql <= l && r <= qr)
{
ans += std::abs(x * (r - l + ) - sum[now]);
sum[now] = (r - l + ) * x;
turn[now] = x;
return;
}
if(r < ql || l > qr) return;
pushdown(now, r - l + );
int mid = (l + r) >> ;
update(x, ql, qr, ls);
update(x, ql, qr, rs);
pushup(now);
} inline void qupdate(int x, int u, int v)
{
while(top[u] != top[v])
{
if(deep[top[u]] < deep[top[v]]) swap(u, v);
update(x, tid[top[u]], tid[u], root);
u = f[top[u]];
}
if(deep[u] > deep[v]) swap(u, v);
update(x, tid[u], tid[v], root);
} int main()
{
int i, x;
char s[];
n = read();
memset(son, -, sizeof(son));
memset(head, -, sizeof(head));
memset(turn, -, sizeof(turn));
for(i = ; i < n; i++)
{
x = read();
f[i] = x;
add(x, i);
}
dfs1();
dfs2(, );
m = read();
for(i = ; i <= m; i++)
{
scanf("%s", s);
x = read();
ans = ;
if(s[] == 'i') qupdate(, , x);
else update(, tid[x], tid[x] + size[x] - , root);
printf("%d\n", ans);
}
return ;
}

[luoguP2146] 软件包管理器(树链剖分)的更多相关文章

  1. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分

    [Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...

  2. Bzoj 4196: [Noi2015]软件包管理器 树链剖分

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 721  Solved: 419[Submit][Statu ...

  3. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  4. [BZOJ4196][NOI2015]软件包管理器(树链剖分)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2166  Solved: 1253[Submit][Sta ...

  5. 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  6. 【NOI2015】 软件包管理器 - 树链剖分

    noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

  7. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  8. NOI2015 软件包管理器(树链剖分+线段树)

    P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...

  9. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

  10. [NOI2015]软件包管理器-树链剖分

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; int n,m; int e,begin[maxn ...

随机推荐

  1. 题解报告:hdu 1212 Big Number(大数取模+同余定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1212 Problem Description As we know, Big Number is al ...

  2. ZooKeeper通过ACL修复未授权访问漏洞

    默认情况下ZooKeeper允许匿名访问,因此在安全漏洞扫描中暴漏未授权访问漏洞. 一.参考资料 <ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表& ...

  3. 在面试官问你BS和CS区别的时候如何回答??

    这是我下来整理好的,如果哪里不全,望大家多多指教 C/S是Client/Server的缩写.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Inform ...

  4. ios 创建和绘画pdf文件 -转

    转自:http://blog.csdn.net/ant1239/article/details/7761676 本方法为项目中画pdf的一个方法,画pdf,一共分为几步,1,获取地址,有两种获取地址方 ...

  5. c#.net 正则匹配以特定字符串开头,以特定字符串结尾

    string[] unit = Getunit(result40, "(?<=(开始字符串))[.\\s\\S]*?(?=(结束字符串))"); private string ...

  6. .NET框架概述

    .NET战略目标: 任何时候(when),任何地方(where),使用任何工具(what)都能通过.NET的服务获得网络上的任何信息. .NET优势: 1.提供了一个面向对象的编程环境,完全支持面向对 ...

  7. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  8. ES6特性的两点分析

    块级作用域声明let.constES6中const 和let的功能,转换为ES5之后,我们会发现实质就是在块级作用改变一下变量名,使之与外层不同.ES6转换前: let a1 = 1; let a2 ...

  9. 【ARM开发板】迅为IMX6开发板QT下LVDS和HDMI双屏异显

    本文转自迅为论坛:http://www.topeetboard.com 平台:迅为-IMX6开发板 首先开发板分别连接9.7寸屏和HDMI显示器,然后使用MfgTool工具烧写QT系统,然后拨码开关设 ...

  10. Eureka 整理

    服务治理:(该模块也可以使用集群) 该模块主要负责完成微服务架构中的服务治理功能. 1.构建服务注册中心. 每个服务单元需要向注册中心登记自己提供的服务. 2.服务注册与服务发现. 服务之间的调用不再 ...