[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 ...
随机推荐
- nyoj_91_阶乘之和_201312131321
阶乘之和 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9 ...
- N天学习一个linux命令之ip
用途 show / manipulate routing, devices, policy routing and tunnels 用法 通用格式 ip [ OPTIONS ] OBJECT { CO ...
- 一个oracle bug
最近发现一个RAC db的listener log增长特别快,于是去查看了一下. 先是查看了一下log的内容,发现都是 service_update这种内容,刷新的特别快. service_updat ...
- CF #330 C
改了题目之后,就是没有奇数的测试了... 其实可以很轻易地发现,要距离近的一方只会删除两端的,而要求远的一方会删除中间的. 那么,很明显的,剩下的两点会相差x/2个节点,于是,只要计算i和i+x/2的 ...
- [Cypress] Stub a Post Request for Successful Form Submission with Cypress
In this lesson well stub a POST request and use Cypress commands to fill in and submit a form. We’ll ...
- swift2.0学习之拓展
拓展:和oc的拓展方法功能差点儿相同.就是给已经存在的类,结构体.枚举,协议类型添加新的方法 拓展语法: 用extensionkeyword声明: extension SomeType { // ne ...
- SAP 金税接口增强 BADI
SAP与金税连接有两种方式:组件接口及文本接口. 文本接口为例: 1.SAP取发票数据.主要来自合同,销售订单,交货单.发票,客户供应商主数据等 2.SAP处理:合并.拆分,折扣等 3.导出TXT ...
- Eclipse如何导入第三方jar包
本文转自:http://blog.csdn.net/mazhaojuan/article/details/21403717 我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar ...
- JS中split使用方法和数组中元素的删除
JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...
- B1232 [Usaco2008Nov]安慰奶牛cheer 最小生成树
%%%小詹太巨啦!!!我就想直接最小生成树之后建树跑dfs,然后写跪了...然后看小詹博客之后恍然大悟,原来直接把边权改为w * 2 + 两边点权值就行了. 但是还是不对,为什么呢?原来我们起点走了三 ...