题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空。注意边界,编号是从0开始的,容易漏掉树根。

第一次写树剖~

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime> using namespace std; struct Edge
{
int to,next;
}e[]; int ind,n,Pre[],f[],Sum[],Out_dfn[];
int p[],cnt,hv[],Head[],Dfn[]; void Add_edge(const int & x,const int & y)
{
e[++cnt].to=y;
e[cnt].next=p[x];
p[x]=cnt;
return ;
} int Init_Dfs(const int& S)
{
int num=,i,Max_=;
for(i=p[S];i;i=e[i].next)
{
int temp=Init_Dfs(e[i].to);
if(temp>Max_)Max_=temp,hv[S]=e[i].to;
num+=temp;
}
return num;
} void Dfs(const int& S,const int& fa)
{
int i;
if(!Head[S])Head[S]=Head[fa];Dfn[S]=++ind; if(hv[S])Dfs(hv[S],S);
for(i=p[S];i;i=e[i].next)
{
if(e[i].to!=hv[S])
{
Head[e[i].to]=e[i].to;
Pre[e[i].to]=S;
Dfs(e[i].to,S);
}
}
Out_dfn[S]=ind;
return ;
} inline void push_down(const int & num,const int & l,const int & r)
{
if(f[num])
{
if(l!=r)
{
f[num<<]=f[num<<|]=f[num];
}
if(f[num]==)Sum[num]=r-l+;
if(f[num]==-)Sum[num]=;
f[num]=;
}
return ;
} void push_up(const int & num,const int & l,const int & r)
{
if(l!=r)
{
int mid=l+((r-l)>>);
push_down(num<<,l,mid);
push_down(num<<|,mid+,r);
Sum[num]=Sum[num<<]+Sum[num<<|];
}
return ;
} void Change(const int & l,const int & r,const int & num,
const int & s,const int & t,const int &d)
{
if(s<=l && r<=t)
{
f[num]=d;
push_down(num,l,r);
return ;
}
int mid=l+((r-l)>>);
push_down(num,l,r);
if(s<=mid)Change(l,mid,num<<,s,t,d);
if(t>mid) Change(mid+,r,num<<|,s,t,d);
push_up(num,l,r);
return ;
} int Query(const int & l,const int & r,const int & num,
const int & s,const int & t)
{
if(s<=l && r<=t)
{
push_down(num,l,r);
return Sum[num];
} int mid=l+((r-l)>>),temp=;
push_down(num,l,r);
if(s<=mid)temp+=Query(l,mid,num<<,s,t);
if(t>mid) temp+=Query(mid+,r,num<<|,s,t);
push_up(num,l,r);
return temp;
} int Get_sum_install(const int& S)
{
int x=S,temp=,sum=; while(x)
{
sum+=Query(,n,,Dfn[Head[x]],Dfn[x]);
Change(,n,,Dfn[Head[x]],Dfn[x],);
temp+=Dfn[x]-Dfn[Head[x]]+;
x=Pre[Head[x]];
} return temp-sum;
} int Get_sum_remove(const int & S)
{
int x=S,sum=; sum=Query(,n,,Dfn[x],Out_dfn[x]);
Change(,n,,Dfn[x],Out_dfn[x],-); return sum;
} int main()
{ int i,x,q;
char op[]; scanf("%d",&n);
for(i=;i<=n;++i)
{
scanf("%d",&x);x++;
Add_edge(x,i);
} Init_Dfs(); Head[]=;
Dfs(,);
scanf("%d",&q);
for(i=;i<=q;++i)
{
scanf("%s%d",op,&x);x++;
if(op[]=='i')
printf("%d\n",Get_sum_install(x));
else
printf("%d\n",Get_sum_remove(x));
} return ;
}

不知道为什么,BZOJ TLE了,但是UOJ AC(求大神指教)??

[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. Scala 获取当前时间

    def NowDate(): String = { val now: Date = new Date() val dateFormat: SimpleDateFormat = new SimpleDa ...

  2. 湖南集训day8

    难度:☆☆☆☆☆☆☆ /* 可以先考虑一维,可知 模k意义下相同的前缀和任意两个相减都是k的倍数 问题等价于统计前缀何种模k相同的数的对数. 多维的时候二维前缀和,压行或者压列,n^3可以解决. */ ...

  3. GoLang 编译exe添加ICO图标

    我们在做Go开发的时候在Window平台下编译出来的exe后大部分都是没有图标,看起来很难看.下面我们说下如何添加一个图标. 1.首先在根目录下,exe的同级目录下创建.rc文件, IDI_ICON1 ...

  4. ACM_哥德巴赫猜想(素数筛)

    哥德巴赫猜想 Time Limit: 2000/1000ms (Java/Others) Problem Description: 哥德巴赫猜想大概是这么一回事:“偶数(>=4) == 两个质数 ...

  5. android 蓝牙 通信 bluetooth

    此例子基于 android demo Android的蓝牙开发,虽然不多用,但有时还是会用到,  Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试需要两部手机:     ...

  6. .net MVC成长记录(一)

    今天第一次写博客,之前从学校出来,学了ASP.NET, 现在第一份工作接触的是MVC,在此便记录和分享一下学习MVC的过程,希望能和大家多一些交流.言归正传,首先给大家介绍一下MVC的基础知识. MV ...

  7. 从"嘿,今晚..."谈消息安全传输中的技术点

    一.初级阶段:信息裸传 特点:在网络上传递明文 黑客定理一:网络上传递的数据是不安全的,属网络于黑客公共场所,能被截取 结果:传递明文无异于不穿衣服裸奔 改进方案:先加密,再在网络上传输 二.进阶阶段 ...

  8. jQuery——val()、text()、html()

    val():获取标签中的value属性的值.带有参数是赋值(类比js中的value属性) text():获取双闭合标签中的文本值.(不识别标签)(类比innerText) html():获取双闭合标签 ...

  9. CSS——盒子

    CSS中的盒子具有以下几个种重要的属性: 1.border(边框) :盒子的厚度 2.padding(内边距):盒子内容距离盒子边框的距离 3.margin(外边距):盒子边框与其他的盒子的距离

  10. (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)

    http://blog.csdn.net/u012453843/article/details/70184155 上节课我们一起学习了怎样解决KindEditor富文本编辑器上传图片的浏览器兼容性问题 ...