[NOI2015]软件包管理器 树链剖分_线段树
Description
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
Input
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
Output
输出文件包括q行。
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 100002
using namespace std;
int read()
{
int f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return f*x;
} void print(int x)
{
if(x<0){putchar('-');x=-x;}
if(x>9)print(x/10);
putchar(x%10+'0');
}
namespace Seg
{
#define lson (x << 1)
#define rson ((x << 1) | 1)
int sumv[maxn << 2], lazy[maxn << 2];
void mark_tag(int l, int r, int x, int delta)
{
sumv[x] = (r - l + 1) * delta, lazy[x] = delta;
}
void pushdown(int l, int r, int x)
{
if(lazy[x] == -1) return ;
int mid = (l + r) >> 1;
if(mid >= l) mark_tag(l, mid, lson, lazy[x]);
if(mid < r) mark_tag(mid + 1, r, rson, lazy[x]);
lazy[x] = -1;
}
int query(int l, int r, int x, int L, int R)
{
if(l >= L && r <= R)
{
return sumv[x];
}
pushdown(l, r, x);
int mid = (l + r) >> 1;
int t = 0;
if(L <= mid) t += query(l, mid, lson, L, R);
if(R > mid) t += query(mid + 1, r, rson, L, R);
return t;
}
void update(int l, int r, int x, int L, int R, int d)
{
if(l >= L && r <= R)
{
mark_tag(l, r, x, d);
return ;
}
pushdown(l, r, x);
int mid = (l + r) >> 1;
if(L <= mid) update(l, mid, lson, L, R, d);
if(R > mid) update(mid + 1, r, rson, L, R, d);
sumv[x] = sumv[lson] + sumv[rson];
}
};
int hd[maxn], to[maxn], nex[maxn], fa[maxn], siz[maxn], top[maxn], hson[maxn], dep[maxn];
int st[maxn], ed[maxn], dfn[maxn];
int edges, n, Q, root = 1, tim;
char str[100];
void add(int u, int v)
{
nex[++edges] = hd[u], hd[u] = edges, to[edges] = v;
}
void dfs1(int u)
{
siz[u] = 1, dep[u] = dep[fa[u]] + 1;
for(int i = hd[u]; i ; i = nex[i])
{
dfs1(to[i]), siz[u] += siz[to[i]];
if(siz[to[i]] > siz[hson[u]]) hson[u] = to[i];
}
}
void dfs2(int u, int tp)
{
dfn[u] = ++tim, top[u] = tp;
st[u] = tim;
if(hson[u])
dfs2(hson[u], tp);
for(int i = hd[u]; i ; i = nex[i])
{
if(to[i] != hson[u]) dfs2(to[i], to[i]);
}
ed[u] = tim;
}
int lookup(int x)
{
int t = 0;
while(x)
{
t += Seg :: query(1, n, 1, dfn[top[x]], dfn[x]);
Seg :: update(1, n, 1, dfn[top[x]], dfn[x], 1);
x = fa[top[x]];
}
return t;
}
int main()
{
// setIO("input");
n=read();
for(int i = 2; i <= n; ++i)
{
fa[i]=read(), ++fa[i], add(fa[i], i);
}
dfs1(1), dfs2(1, 1);
memset(Seg::lazy, -1, sizeof(Seg :: lazy));
Q=read();
while(Q--)
{
int u;
scanf("%s",str);
u=read();
u+=1;
if(str[0] == 'i')
{
print(dep[u] - lookup(u));
printf("\n");
}
if(str[0] == 'u')
{
print(Seg :: query(1, n, 1, st[u], ed[u]));
Seg :: update(1, n, 1, st[u], ed[u], 0);
printf("\n");
}
}
return 0;
}
[NOI2015]软件包管理器 树链剖分_线段树的更多相关文章
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
- [bzoj3694]最短路_树链剖分_线段树
最短路 bzoj-3694 题目大意:给你一个n个点m条边的无向图,源点为1,并且以点1为根给出最短路树.求对于2到n的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径上的最后一条边. 注 ...
- [bzoj4127]Abs_树链剖分_线段树
Abs bzoj-4127 题目大意:给定一棵数,支持链加和链上权值的绝对值的和. 注释:$1\le n,m \le 10^5$,$\delta \ge 0$,$|a_i|\le 10^8$. 想法: ...
- bzoj 3730: 震波 动态点分治_树链剖分_线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...
- bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树
[Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...
- 洛谷 P2542 [AHOI2005]航线规划 树链剖分_线段树_时光倒流_离线
Code: #include <map> #include <cstdio> #include <algorithm> #include <cstring&g ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
随机推荐
- 【ACM】hdu_2007_平方和与立方和_201307261533
平方和与立方和Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- RPC框架分析
RPC框架分析 常用的框架 .net(WCF) .net中分布式框架集大成者,提供多种通信方式,多种安全策略的调用(配置繁琐). java 1.RMI JDK原生(严格的说来算不上框架). 2.Du ...
- 洛谷 P1479 宿舍里的故事之五子棋
P1479 宿舍里的故事之五子棋 题目描述 宿舍里好多好多有趣的事! 7890653今天看到不知何时流行的五子棋,在宿舍里拿个本子,画一些格子,一个棋盘就做好了! 当7890653把目光放到棋上,突发 ...
- ZooKeeper的应用场景(转)
应用场景1 :统一命名服务 分布式应用中,通常需要一套完备的命令机制,既能产生唯一的标识,又方便人识别和记忆. 我们知道,每个ZNode都可以由其路径唯一标识,路径本身也比较简洁直观,另外ZNode上 ...
- MYSQL 字符集 MYSQL 源码
http://blog.csdn.net/maray/article/details/46504621
- 申请Letencrypt的免费证书文件-nginx
1.前言 Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla.思科.Akamai.IdenTrust和EFF等组织发起,目的就是向网站 ...
- Unity3D中的Coroutine具体解释
本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...
- MySQL 日期时间函数大全 (转)
转载自:http://blog.itpub.net/29773961/viewspace-1808967 以下内容基于MySQL 5.6及更高,大部分函数5.5也基本适用,更低版本请参考对应版本手册, ...
- Microsoft ASP.NET SignalR
SignalR类似与JavaScript实时框架,如Socket.IO.SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件.SignalR的连接通过日益流行的Web ...
- [APIO2008]DNA
https://zybuluo.com/ysner/note/1158123 题面 戳我 解析 我们要求出第\(r\)种方案,莫过于看其前面什么时候有\(r-1\)种方案. 于是,我们要求出每种情况的 ...