bzoj3631树链剖分
虽然是水题1A的感觉太爽了O(∩_∩)O~
题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值
本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查
前缀和不要怂!!!
结果,,,change的长度让人怀疑写change的必要,,,mdzz懒得改了
inline void change(int x,int y){a[x]++;a[y+]--;}
这道题注意要点:
每次都按照顺序加权值的话会导致多算端点的权值,解决方法很简单:算完以后把除出发点以外的所有点权值-1(因为题目保证了遍历每个点,所以除出发点以外每个点肯定被多算一次)
树链剖分好久没写了,主要部分没问题,就是关于高度的东西写成鬼畜了,没记住高度小的排在前面,导致调了几分钟样例
#include <cstdio>
int n,m=,N=,p,q;
int to[],nex[],son[],bro[];
int fir[],size[],pos[],top[],h[],fa[];
int l[],a[],ans[],b[];
inline void add(int x,int y){to[++m]=y;nex[m]=fir[x];fir[x]=m;}
inline void change(int x,int y){a[x]++;a[y+]--;}
inline void swap(int &x,int &y){int t=x;x=y;y=t;}
int build(int now,int fat)
{
size[now]=;h[now]=h[fat]+;fa[now]=fat;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fat)
bro[to[i]]=son[now],son[now]=to[i],size[now]+=build(to[i],now);
return size[now];
}
void pou(int now,int to)
{
l[++N]=now;pos[now]=N;top[now]=to;
int max=son[now];
if(!max) return;
for(int i=bro[max];i;i=bro[i])
if(size[i]>size[max]) max=i;
pou(max,to);
for(int i=son[now];i;i=bro[i])
if(i!=max) pou(i,i);
}
void work(int x,int y)
{
while(top[x]!=top[y])
{
if(h[top[x]]<h[top[y]]) swap(x,y);
change(pos[top[x]],pos[x]);
x=fa[top[x]];
}
if(h[x]>h[y]) swap(x,y);
change(pos[x],pos[y]);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
for(int i=;i<n;i++)
scanf("%d%d",&p,&q),add(p,q),add(q,p);
build(,);
pou(,);
for(int i=;i<n;i++)
work(b[i],b[i+]);
for(int i=;i<=n;i++)
ans[l[i]]=ans[l[i-]]+a[i];
for(int i=;i<=n;i++)
printf("%d\n",ans[i]-+(i==b[]));
}
bzoj3631树链剖分的更多相关文章
- BZOJ3631(树链剖分)
差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(in ...
- BZOJ3631 松鼠的新家(树链剖分)
题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
随机推荐
- ng-repeat里创建的自定义指令
在ng里,所有的指令在按照意愿正常工作之前的都需要编译一下,包含angularJS的自定义指令. ng模板里的所有指令都会在angularJS加载完毕之后编译一下,所以那些自定义指令和事件才能工作. ...
- 关于python的10个建议,比较适合新手吧.
关于python的十个建议 http://safehammad.com/downloads/python-idioms-2014-01-16.pdf
- linux系统的初化始配置(包括网络,主机名,关闭firewalld与selinux)
每次我们使用Linux都会对系统进行初始化的配置,下面我们一一列出来. 1.服务的开启 systemctl enable firewalld.service //将指定的服务设置为开机启动 syste ...
- 导入excel
1.js使用ajaxfileupload.js实现文件上传 2.将文件转为字节 3.将字节转为excel保存到服务器 4.根据路径读取excel文件并转为dataSet 5.将dataSet写入数据库
- width:100%;与width:auto;的区别
<div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...
- Linux 系统中堆栈的使用方法
本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式.这部分内容的说明与内核代码关系比较密切,可以先跳过.在开始阅读相应代码时再回来仔细研究. Linux 0.12系统中共使 ...
- js如何求一组数中的极值
这是一个很简单的问题,现在我们从循环开始,例如一组数[5,2,1,3,4];求其中的最大值,那么首先我们要定义一个max的中间变量,遍历数组,当遇到比max值大则赋值给max,直到循环结束,就能获取这 ...
- word
# word中向下箭头 原文:http://jingyan.baidu.com/article/c1465413b0a9c70bfcfc4cbc.html 使用替换功能,把^l(l是小写的L)替换为^ ...
- javaScript事件(一)事件流
一.事件 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.事件是javaScript和DOM之间的桥梁.你若触发,我便执行——事件发生,调用它的处理函数 ...
- **crontab的使用方式介绍和no crontab for root 提示的处理
crontab的使用方式介绍 定时任务参数详解如下: crontab -l | crontab -e www.2cto.com #*/30 * * * * ntpdate 1 ...