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 ...
随机推荐
- LoadRunner 函数之 web_add_cookie
简单示例: Action() { // 添加cookie web_add_cookie("is_login=True;path=/;domain=10.1.102.75"); // ...
- PHP ajax基础
后台对数据处理,并返回前台: <?php //接收 $action = $_GET['action']; if ($action == 'orderID') { $orderID = trim( ...
- java表格操作之设置表格列宽
设置所有列的宽度 /** * 设置所有列的列宽 * @param table * @param width */ public void setAllColumnWidth(JTable table, ...
- 【Android学习】android:layout_weight的用法实例
对于android:layout_weight的用法,用下面的例子来说明: <LinearLayout xmlns:android="http://schemas.android.co ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
- Python自动化之django视图
视图 1.获取用户请求数据 request.GET request.POST request.FILES PS: GET:获取数据 POST:提交数据 request其他方法详解:http://dja ...
- python之路六
面向对象 引言 提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation).Python也是一种支持OOP的动态语言, ...
- C#基本工具代码
1.下载Xlsx public static void TryToDisplayGeneratedFileXlsx(string writeFilePath, string fileName) { H ...
- 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者,你一定会对网络应用如何工作有 ...
- node01-创建服务器
node学习笔记目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http no ...