先把树剖分了(又是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. win32 disk imager使用后u盘容量恢复

    XP下进入CMD命令窗体,Vista及7下右键以管理员方式运行DOS窗体 输入DISKPART,会显示计算机名,及DISKPART>命令行 在此状态下输入LIST DISK查看机器磁盘,正常Di ...

  2. 在写junit test 的时候出现的java.lang.UnsupportedClassVersionError问题

    今天在写为一些project 写 一些junit  test  的时候,出现下面的异常: java.lang.UnsupportedClassVersionError: moneytest/Money ...

  3. [UML]UML系列——用例图中的各种关系(include、extend)

    用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1)  概 ...

  4. 大熊君JavaScript插件化开发------(第二季)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那么今天我们带着昨天的疑问来继续我们的插 ...

  5. FusionCharts-堆栈图、xml格式、刷新数据、添加事件link、传参

    *起因* 本来想用Chart.js来搞图表的, 但是来了个新需求,想搞的华丽点,毕竟对Chart.js来说,实现有点难度, *做出的改变* 最终选择了FusionCharts, *难点* 网上关于Fu ...

  6. LInux升级Python版本2.7.11所遇问题汇总

    首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上 ...

  7. phpMyAdmin提示:配置文件权限错误,无法写入!解决方法

    访问phpMyAdmin提示: 配置文件权限错误,无法写入! 解决办法: chmod -R 755 ./phpmyadmin 这样设置下phpMyAdmin目录权限属性为就可以访问了.原来phpMyA ...

  8. Android下如何计算两经纬点之间距离

    节选自百度地图API: 若开发者使用的是百度地图或定位API,且版本在1.3.5以后的, 路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法. 如果是计算任 ...

  9. SAM/BAM文件处理

    当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...

  10. 【转载】实时监听输入框值变化的完美方案:oninput & onpropertychange

    oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有 ...