先把树剖分了(又是dfs1、dfs2),然后区间求和、区间覆盖即可

难得的1A好(shui)题

——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233

总结:

1.开始用define简化代码

2.写的时候出现了手抖,还不够熟练

3.剖分基本上没有问题,线段树题目欠多

 #include <cstdio>
#include <iostream>
#define lson now*2
#define rson now*2+1
#define mid (l+r)/2
using namespace std;
int cnt=,n,m;
int flag[],t[];
int fa[],size[],son[],bro[],b[],pos[],top[];
int dfs1(int k)
{
size[k]=;
for(int i=son[k];i!=;i=bro[i])
size[k]+=dfs1(i);
return size[k];
}
void dfs2(int k,int to)
{
b[++cnt]=k;
top[k]=to;
int max=son[k];
pos[k]=cnt;
for(int i=son[k];i!=;i=bro[i])
if(size[i]>size[max])
max=i;
if(max==)
return;
dfs2(max,to);
for(int i=son[k];i!=;i=bro[i])
if(i!=max)
dfs2(i,i);
}
void down(int now,int l,int r)
{
if(flag[now]==)
{
flag[lson]=;
flag[rson]=;
t[lson]=mid-l+;
t[rson]=r-mid;
flag[now]=;
}
if(flag[now]==)
{
flag[lson]=;
flag[rson]=;
t[lson]=;
t[rson]=;
flag[now]=;
}
}
int que(int now,int l,int r,int x,int y)
{
if(l==x && r==y) return t[now];
down(now,l,r);
return ((x<=mid)?que(lson,l,mid,x,min(y,mid)):)+((y>mid)?que(rson,mid+,r,max(x,mid+),y):);
}
void set_0(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
{
flag[now]=;
t[now]=;
return;
}
down(now,l,r);
if(x<=mid)
set_0(lson,l,mid,x,min(y,mid));
if(y>mid)
set_0(rson,mid+,r,max(x,mid+),y);
t[now]=t[lson]+t[rson];
}
void set_1(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
{
flag[now]=;
t[now]=r-l+;
return;
}
down(now,l,r);
if(x<=mid)
set_1(lson,l,mid,x,min(y,mid));
if(y>mid)
set_1(rson,mid+,r,max(x,mid+),y);
t[now]=t[lson]+t[rson];
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&fa[i]);
fa[i]++;
bro[i]=son[fa[i]];
son[fa[i]]=i;
}
dfs1();
dfs2(,);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
char ch=getchar();
while(ch!='i' && ch!='u')
ch=getchar();
bool b=ch=='i';
int x=;
while(ch<'' || ch>'')
ch=getchar();
while(ch>='' && ch<='')
{
x=x*+ch-'';
ch=getchar();
}
x++;
if(b)
{
int sum=;
for(int i=top[x];;i=top[x])
{
sum+=pos[x]-pos[i]+-que(,,n,pos[i],pos[x]);
set_1(,,n,pos[i],pos[x]);
if(i==)
break;
x=fa[i];
}
printf("%d\n",sum);
}
else
{
printf("%d\n",que(,,n,pos[x],pos[x]+size[x]-));
set_0(,,n,pos[x],pos[x]+size[x]-);
}
}
return ;
}

bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树的更多相关文章

  1. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  2. [UOJ#128][BZOJ4196][Noi2015]软件包管理器

    [UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...

  3. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  5. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  6. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  7. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  8. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  9. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  10. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

随机推荐

  1. Fedora 23安装 NS2 (network simulator 2)

    1 实验环境 OS: Fedora 23 workstation 2 实验步骤 ( 参考了:http://www.isi.edu/nsnam/ns/ns-build.html) 本次实验的实验环境: ...

  2. 即时搜索或input实时检测监听输入框变化

    js实现的文本框内容发生改变立马触发事件简单介绍:本章节介绍一下如何在文本框的内容发生变化的时候,立马触发一个事件执行响应的操作,而不是像是keydow或者keyup事件一样,只能够检测通过键盘输入导 ...

  3. 今天又学了一招,牛逼!!!解决"-bash:No such file or directory"问题

    今天在64服务器上:发现好像bash 坏了,用户名前边   用-bash 显示,,前几天就发现这个问题,,,但是当时忙没有解决,,,,,今天来看看到底是怎么回事! File Exists but... ...

  4. vue 列表渲染

    在Vue官网中写道,vue无法直接用索引设置元素, 如 vm.items[0] = {}: 提出的解决方法是用 : example1.items.$set(0, { childMsg: 'Change ...

  5. ms-dos中 MSCDEX命名语法详解

    一.MSCDEX的语法及参数:        MSCDEX可以在AUTOEXEC.BAT文件中自动加载,也可以在DOS的命令行中载入但要使用光驱,前提条件是在Config.sys文件中加载了光驱的驱动 ...

  6. C++ STL模板

    C++中的STL(Standard Template Library)用起来挺方便的,这里我们来做一下总结. 一.set set是STL中一种标准关联容器 (vector,list,string,de ...

  7. Linux下vim 开发环境配置及配色(Ruby)

    终端设置 字体:Monospace 10 粗体 内置方案M:黑底白字 内置方案S:Linux控制台 安装vundle git clone https://github.com/VundleVim/Vu ...

  8. 用DateTime的ParseExact方法解析特殊的日期时间

    今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [07-13 15:50:42] 主要问题是这个时间不是标准的时间,而是自定义的格式,即开头是月-日,然后是时间. 使用最 ...

  9. css的用法

    Css(Cascading Style Sheets,层叠样式表)是一种页面美化方法,通过编辑Css的对象属性达到美化页面的效果.Css的操作基本单元为对象,使用CSS的感觉就像是使用C++/C中的函 ...

  10. Unity3D 查找Update函数体为空的类

    如果是大项目,有很多Update空跑还是多少有些效率损耗,那我们就把他们都找出来. 先引用Mono.Cecil //代码 using UnityEngine; using UnityEditor; u ...