[luoguP2146] 软件包管理器(树链剖分)
看着很吓人,其实就是个树链剖分模板。
可支持操作:
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] 软件包管理器(树链剖分)的更多相关文章
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- Bzoj 4196: [Noi2015]软件包管理器 树链剖分
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 721 Solved: 419[Submit][Statu ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- 【NOI2015】 软件包管理器 - 树链剖分
noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...
- [NOI2015]软件包管理器-树链剖分
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; int n,m; int e,begin[maxn ...
随机推荐
- windows 迁移数据库
1) Prerequisites ---------------- - The copy of the datafiles must be done with the database clos ...
- snort + barnyard2如何正确读取snort.unified2格式的数据集并且入库MySQL(图文详解)
不多说,直接上干货! 为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物 ...
- 关于jquery获取单选框value属性值为on的问题
当取单选框的value值的时候,前提是要有value这个属性,如果没有value属性那么取出来的就会为on 取value值的常见三种方式为 $("input[name='XXX']:chec ...
- SpringSecurity的简单使用
导入SpringSecurity坐标 在web.xml中配置过滤器 编写spring-securiy配置文件 编写自定义认证提供者 用户新增时加密密码 配置页面的login和logout 获取登录用户 ...
- Spring Mvc相关随笔
web.xml部分 1.欢迎界面 <welcome-file-list> <welcome-file>/views/login.jsp</welcome-file> ...
- turn协议的工作原理
Allocate请求 客户端通过发送Allocate请求给STUN服务器,从而让STUN服务器为A用户开启一个relay端口. a) 客户端A向STUN Port发送Allocate请求(图中 ...
- 关于 user agent ua
1.ua介绍: ua查询参考网址:http://www.atool.org/useragent.php(也可以自己制作html查询) js 属性:navigator.userAgent 使用方法:将网 ...
- rest_framework基于generics.CreateAPIView创建用户
最近在写新版的devops3.0,被generics.CreateAPIView创建用户密码序列化的问题折磨的欲仙欲死.反复看源码测试,得出下面的流程,这也是做generics.CreateAPIVi ...
- windows 下使用sqlplus
1.连接数据库 找到tnsnames.ora 监听器配置 TESTDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = "服务器端ip ...
- 什么是BDD?
BDD是TDD的一种衍生,通过特定的BDD框架,用自然语言或类自然语言,按照编写用户故事或者用户用例的方式,以功能使用者的视角,描述并编写测试用例. BDD源于TDD并优于测试驱动开发. 之所以说BD ...