[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 ...
随机推荐
- 二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix
题目传送门 /* 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 */ #include <cstdio> #include < ...
- 解决 图片在div中等比例缩放问题 (未解决:图片比例小于盒子模型时不会自动填充)
如题,该方案仅支持对图片等比例缩放.本文附件地址:https://files.cnblogs.com/files/john69-/background-Img.rar <!DOCTYPE htm ...
- 2017-11-29 HTML5样式、链接和表格
HTML5样式.链接和表格HTML5列表<ol> 有序列表<ul> 无序列表<li> 列表项 <dl> 列表<dt> 列表项<dd&g ...
- flex弹性布局操练1
实现弹性布局之前常用浮动,相对定位和绝对定位等,但是现在好了,随着flex的兴起,方便了很多,而且也符合未来响应式布局的方向. 理论的东西可参考css3手册,这里专注实操. 一:单个元素 <di ...
- springmvc 的配置 annotation-config/annotation-drive/ component-scan 区别
1. <context:annotation-config /> 作用隐式的配置注解的加载类,默认的加载了AutowiredAnnotationBeanPostProcessor(auto ...
- vue2.0 自定义指令详解
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- win+r 快速命令
control keymgr.dll 打开凭据管理器 secpol.msc 本地安全策略 mstsc 远程 msconfig 启动选项 %temp% 临时文件夹 \\192.168 ...
- 解决国内无法安装android sdk的问题
在使用 Android SDK Manager 的时候,主要会连接到两个地址 dl.google.com 和 dl-ssl.google.com,key发现这两个地址都是无法正常访问的,如何解决呢? ...
- 自定义对话框(jDialog)
[配置项]jDialog options点击收起 一.接口功能 jDialog的默认配置项,本组件提供的所有对话框,都可以通过修改这些配置项来实现不同的效果. 二.详细配置项 /** * 对话框的默认 ...
- MySQL系列(一)--数据类型
如何选择优化的数据类型: 1.通常更小的更好 相同级别的数据类型,选择占据空间更小的数据类型.更小的数据类型通常更快,因为占用更少的磁盘.内存和CPU缓存,处理时需要的 CPU周期也更少,但是要确保需 ...