传送门

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

可支持操作:

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. 配置Ubuntu16.04第02步:更改镜像源,更新系统

    Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更新源(就是这些软件所在的服务器),一般直接百度Ubuntu更新源就能出来一大堆,这时候最好是找和自己 ...

  2. RHEL5.6配置本地yum源

    试验环境:RedHat Enterprise Linux 5.6(虚拟机) 一.挂载镜像 配置yum源第一步需要挂载镜像,或者直接复制操作系统的光盘文件至操作系统目录中. 挂载镜像命令如下: moun ...

  3. AJPFX理解反射及反射的应用

    怎么理解反射,反射的应用        反射就是把Java类中的各种成分映射成相应的Java类.        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...

  4. Apache Tomcat 之路(二 部署web 应用程序)

    1.创建一个webapplication,不论是解压的应用程序包还是war包,在tomcat 上都能部署,这里提供一个简单的web项目:git地址:https://github.com/coderxi ...

  5. webpack2代码分割

    代码分割-CSS 要通过webpack打包CSS,像任何其他模块一样将CSS导入JavaScript代码,并使用css-loader(它输出CSS作为JS模块), 并可选地应用ExtractTextW ...

  6. vscode前端开发软件配搭好用的插件

    使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...

  7. eclipse 升级note

    参考http://www.cnblogs.com/jiqingwu/archive/2013/05/26/eclipse_plugins_import.html. 最终决定采用 启动 eclipse. ...

  8. 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman

    Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...

  9. 针对windowsserver 创建iis站点访问出错的解决方案(HTTP 错误 500.19 - Internal Server Error)

    错误如下:   服务器错误 Internet信息服务 7.0 错误摘要HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详 ...

  10. python3爬取微博评论并存为xlsx

    python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...