[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 ...
随机推荐
- urllib的高级用法
Handler简介 我们可以把他理解为各种处理器,有专门处理登录验证的,有处理cookies的,有处理代理设置的.利用他们,我们几乎可以做到HTTP请求中的所有事情. 首先,介绍一下 urllib.r ...
- JSR-303原生支持的限制
@Null: 限制只能为null@NotNull: 限制必须不为null@AssertFalse: 限制必须为false@AssertTrue: 限制必须为true@DecimalMax(value) ...
- .net简单的fileupload控件上传
前台代码: <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID ...
- Activiti工作流和shiro权限管理关系图
- 用RecyclerView做一个小清新的Gallery效果
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- 微信小程序组件解读和分析:十二、picker滚动选择器
picker滚动选择器组件说明: picker: 滚动选择器,现支持三种选择器,通过mode属性来区分, 分别是普通选择器(mode = selector),时间选择器(mode = time),日期 ...
- iOS/Android 视频编辑SDK
锐动天地为开发者提供短视频编辑.特效.直播.录屏.编解码.视频转换,等多种解决方案,涵盖PC.iOS.Android多平台.以市场为导向,不断打磨并创新技术,在稳定性,兼容性,硬件设备效率优化上千捶百 ...
- Eclipse打包多渠道包(库工程版)
请先移步多渠道打包http://www.cnblogs.com/bhm666/p/6438776.html 自从上次使用了Gradle打渠道包后,遇到了各种各样的问题,不过也是小问题,仍然在几个项目上 ...
- Android一句代码给Activity定制标题栏
在此之前,使用过几种方法设置标题栏: 1.常规法:这个方法是最常用的了,哪个activity需要什么样的标题栏,就在对应的xml布局设计.缺点:此方法维护起来困难,没有将标题栏的共性抽取出来, 如果要 ...
- web页面打印--铺满A4
css <style type="text/css"> body { margin: 0; padding: 0; background-color: #FAFAFA; ...