标签:lib mod logs 根据 程序 amp == 工作 描述
[UOJ#128][BZOJ4196][Noi2015]软件包管理器
试题描述
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
输入
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
输出
输出文件包括q行。
输入示例
7 0 0 0 1 1 5 5 install 5 install 6 uninstall 1 install 4 uninstall 0
输出示例
3 1 3 2 3
数据规模及约定
n=100000
q=100000
题解
树链剖分 + 线段树裸题。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == ‘-‘) f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - ‘0‘; c = Getchar(); }
return x * f;
}
#define maxn 100010
#define maxm 200010
int n, m, head[maxn], nxt[maxm], to[maxm];
void AddEdge(int a, int b) {
to[++m] = b; nxt[m] = head[a]; head[a] = m;
return ;
}
int fa[maxn], son[maxn], dep[maxn], siz[maxn], top[maxn], seg_pos[maxn], dl[maxn], dr[maxn], clo;
void build(int u) {
siz[u] = 1;
for(int e = head[u]; e; e = nxt[e]) {
dep[to[e]] = dep[u] + 1;
build(to[e]);
siz[u] += siz[to[e]];
if(!son[u] || siz[son[u]] < siz[to[e]]) son[u] = to[e];
}
return ;
}
void gett(int u, int tp) {
top[u] = tp; dl[u] = ++clo;
if(son[u]) gett(son[u], tp);
for(int e = head[u]; e; e = nxt[e]) if(to[e] != son[u]) gett(to[e], to[e]);
dr[u] = clo;
return ;
}
int sumv[maxn<<2], setv[maxn<<2];
void pushdown(int o, int l, int r) {
if(l == r || setv[o] == -1){ setv[o] = -1; return ; }
int mid = l + r >> 1, lc = o << 1, rc = lc | 1;
setv[lc] = setv[rc] = setv[o];
sumv[lc] = setv[o] * (mid - l + 1);
sumv[rc] = setv[o] * (r - mid);
setv[o] = -1;
return ;
}
int update(int o, int l, int r, int ql, int qr, int v) {
pushdown(o, l, r);
if(ql <= l && r <= qr) {
int tmp = sumv[o];
setv[o] = v;
sumv[o] = v * (r - l + 1);
return tmp;
}
int mid = l + r >> 1, lc = o << 1, rc = lc | 1, ans = 0;
if(ql <= mid) ans += update(lc, l, mid, ql, qr, v);
if(qr > mid) ans += update(rc, mid + 1, r, ql, qr, v);
sumv[o] = sumv[lc] + sumv[rc];
return ans;
}
int modifyup(int u) {
int res = 0, depu = dep[u];
while(u) {
res += update(1, 1, n, dl[top[u]], dl[u], 1);
u = fa[top[u]];
}
return depu - res;
}
int modifydn(int u) {
return update(1, 1, n, dl[u], dr[u], 0);
}
int main() {
n = read();
for(int i = 2; i <= n; i++) AddEdge(fa[i] = read() + 1, i);
dep[1] = 1; build(1); gett(1, 1);
memset(setv, -1, sizeof(setv));
int q = read(); char ch;
while(q--) {
ch = Getchar();
while(!isalpha(ch)) ch = Getchar();
int u = read() + 1;
if(ch == ‘i‘) printf("%d\n", modifyup(u));
if(ch == ‘u‘) printf("%d\n", modifydn(u));
}
return 0;
}
[UOJ#128][BZOJ4196][Noi2015]软件包管理器
标签:lib mod logs 根据 程序 amp == 工作 描述
原文地址:http://www.cnblogs.com/xiao-ju-ruo-xjr/p/7073055.html