[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 ...
随机推荐
- printf 打印字符串的任意一部分
使用printf()函数打印字符串的任意部分,请看下例: <span style="font-size:16px;">#include <stdio.h> ...
- [bzoj1007][HNOI2008]水平可见直线_单调栈
水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- Windows超级卸载工具Total Uninstaller,能完全卸载.NET Framework
https://github.com/tsasioglu/Total-Uninstaller
- 2.6-NAT
2.6-NAT 网络地址转换协议NAT(Network Address Translation): 交换和远程都要用,先上什么就放在哪一块讲,具体来说NAT还是属于远程的. ...
- 设计模式->观察者模式
观察者模式能很大的降低模块之前的耦合.详细的观察者模式,客官们能够去看<设计模式>或者<Head first设计模式>等之类的书. 在java中,java.util库中封装了观 ...
- Oracle 堵塞(blocking blocked)
堵塞是DBA常常碰到的情形,尤其是不良的应用程序设计的堵塞将导致性能严重下降直至数据库崩溃. 对DBA而言,有必要知道怎样定位到当前系统有哪些堵塞,究竟谁是堵塞者,谁是被堵塞者.本文对此给出了描写叙述 ...
- c#面试题总结
using System; class A { public A() { PrintFields(); } public virtual void PrintFields(){} } class B: ...
- php登录验证及代码实现 含数据库设计 亲測有效
深夜调代码 试过无数种方法最终见了成效 login.php内容例如以下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN& ...
- 【BASH】bash shell的使用实例
************************************************************************ ****原文:blog.csdn.net/clark_ ...