bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树
先把树剖分了(又是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]软件包管理器 树链剖分+线段树的更多相关文章
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- [UOJ#128][BZOJ4196][Noi2015]软件包管理器
[UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- HDU4897 (树链剖分+线段树)
Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...
- 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 ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
随机推荐
- ANDROID_HOME on Mac OS X
Where the Android-SDK is installed depends on how you installed it. If you downloaded the SDK throug ...
- centos7安装图片界面
yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
- UITableViewCell的重用机制
UITabelView一般会显示大量数据,如果有多少条数据就新建多少个cell,那么对于内存来说是种极大的负担,这样自然是不合理的,所以才会有重用机制 比如一个家庭办酒席,一共有13桌,每桌20个菜, ...
- Linux 命令收集
http://www.cnblogs.com/tzhangofseu/archive/2011/12/17/2290955.html vim :r filename :sh enter shell ...
- ab 轻量的压测工具
阅读:http://www.cnblogs.com/luminji/archive/2011/09/02/2163525.html
- Another app is currently holding the yum lock
摘要 在使用yum安装的时候,出现该error. 错误 Another app is currently holding the yum lock; waiting for it to exit... ...
- 使用excel计算指数平滑和移动平均
指数平滑法 原数数据如下: 点击数据——数据分析 选择指数平滑 最一次平滑 由于我们选择的区域是B1:B22,第一个单元格“钢产量”,被当做标志,所以我们应该勾选标志.当我们勾选了标志后,列中的第 ...
- 关于DataTable添加新列到指定列的方法
在开发新项目的时候发现了一个问题 dtResult.Columns.Add()方法只能将指定的列添加到DataTable的列的最后的位置,但是不能添加到指定的列上.举例来说,假设dtResult总共有 ...
- 第七届山东省ACM省赛
激动人心的省赛终于结束了…平静下来再回头看真的感觉一波三折…先是赛前毫无预兆的查出突发性耳聋…伴随而来的就是左耳听力下降.轻微耳鸣.极个别情况下的头晕…不过这都还好,毕竟药物可以恢复…热身赛只过了一道 ...
- 非常简单的升级phpnow自带的php版本到5.3的方法
下载PHP5.3 下载地址百度一下“PHP5.3下载”就有很多网站提供下载的,也可以去官网下载最新的,记得下载ZIP压缩的噢 2 解压与命名 将下载的PHP5.3压缩包解压至phpnow的安装目录,命 ...