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 ...
随机推荐
- sublime2使用jshint
合理配置Jshint可以帮助写出高质量的代码,通过sublime2插件 JSHint Gutter 可以迅速提供开发效率和减少bug的个数. 1.安装JSHint Gutter插件 sublime2按 ...
- LoadRunner 获取接口请求响应信息
Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_para ...
- Apache Shiro 学习记录1
最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...
- UITableViewCell的重用机制
UITabelView一般会显示大量数据,如果有多少条数据就新建多少个cell,那么对于内存来说是种极大的负担,这样自然是不合理的,所以才会有重用机制 比如一个家庭办酒席,一共有13桌,每桌20个菜, ...
- 深入理解javascript原型和闭包(17)——补this
本文对<深入理解javascript原型和闭包(10)——this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...
- [译]ES6新特性:八进制和二进制整数字面量
原文:http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binar ...
- Java与MySQL的连接
下载数据库驱动文件,解压并保存至任意位置 下载地址 新建Java项目,并将驱动文件添加到项目中 项目名右键-->构建路径-->配置构建路径-->添加外部Jar 在项目中新建类,编写代 ...
- [Python] Python中的一些特殊函数
1. 过滤函数filter 定义:filter 函数的功能相当于过滤器.调用一个布尔函数bool_func来迭代遍历每个列表中的元素:返回一个使bool_func返回值为true的元素的序列. a=[ ...
- 最大堆 最小堆 解决TOPK问题
堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...
- python之路五
内建模块 time和datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现 ...