[JLOI2014]松鼠的新家 树上差分
差分
一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不同的地方)
由于是树上差分,所以要先求出所有需要的LCA,然后就是树上差分的套路了
这里由于进来后再出去是只能算一次的,所以略有不同,但实际上也不麻烦,因为直接维护是很困难的,所以不如不维护这个地方,直接在统计答案的时候减掉这些多出来的。
using namespace std;
#define R register int
#define AC 300100
#define D printf("line in %d\n",__LINE__);
int n,cnt;//cnt是计LCA的
int date[AC*],Next[AC*],Head[AC],tot=;//存图
int qdate[AC*],qNext[AC*],qHead[AC],qtot=;//存询问
int LCA[AC],ans[AC*];//直接按顺序求,所以线性顺序即可
int father[AC],t[AC],power[AC],fa[AC];
bool vis[AC];
//error!!!前向星因为是双向边,然后询问也是双向的,所以这些数组都要*2啊!!!
inline int read()
{
int x=;char c;
while(isspace(c=getchar()));
while(c>='' && c<='')x=x*+c-'',c=getchar();
return x;
} void add1(int f,int w)//加图
{
date[++tot]=w,Next[tot]=Head[f],Head[f]=tot;
date[++tot]=f,Next[tot]=Head[w],Head[w]=tot;
} int find(int x)
{
if(father[x]==x) return x;
else return father[x]=find(father[x]);
} void add2(int f,int w)//加询问
{
qdate[++qtot]=w,qNext[qtot]=qHead[f],qHead[f]=qtot;
qdate[++qtot]=f,qNext[qtot]=qHead[w],qHead[w]=qtot;
} void DFS(int x)
{
R now;
vis[x]=true;
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(!vis[now])
{
DFS(now);
father[now]=x;//访问完所有的字节点后接上来
}
else fa[x]=now;//不然就是父亲,因为是点权,所以直接等于now就好了
}
for(R i=qHead[x]; i ;i=qNext[i])
{
now=qdate[i];
if(vis[now] && !ans[i ^ ])ans[i]=find(now);
}
} void pre()
{
R a,b;
n=read();
for(R i=;i<=n;i++) t[i]=read();
for(R i=;i<n;i++)
{
a=read(),b=read();
add1(a,b);
}
for(R i=;i<n;i++)//添加询问
add2(t[i],t[i+]);
for(R i=;i<=n;i++)father[i]=i;
DFS();
for(R i=;i<=n*+;i++)
if(ans[i]) LCA[++cnt]=ans[i];
} void getans(int x)//统计答案,可以统计进入
{
R now;
for(R i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(now!=fa[x])
{
getans(now);
power[x]+=power[now];
}
}
} void work()
{
for(R i=;i<n;i++)
{
power[t[i]]++,power[t[i+]]++,power[LCA[i]]--,power[fa[LCA[i]]]--;//由于题目特殊性,不能每次都+1,因为进出房间只是一次
}//但是这样并不好计算,那完全可以直接像平常一样统计啊,由于这样每个中间节点都会被重复计算一次,那输出的时候-1不就好了吗
getans();
for(R i=;i<=n;i++)//因为要按下标输出,但是重复计算的是序列中间的,所以是要序列中间都-1,所以先处理
power[t[i]]--;
for(R i=;i<=n;i++) printf("%d\n",power[i]);
} int main()
{
freopen("in.in","r",stdin);
pre();
work();
fclose(stdin);
return ;
}
[JLOI2014]松鼠的新家 树上差分的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- bzoj3631 [JLOI2014]松鼠的新家——树上差分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...
- BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)
题目链接 树剖/差分裸题.. //28260kb 584ms #include <cstdio> #include <cctype> #include <algorith ...
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
- BZOJ 3631 松鼠的新家 树上差分
我猜会有智障说直接链剖+线段树…(希望没有) From RYC's 课件 然鹅我并不反对树剖...我是智障...QAQ 好吧还是树上差分:设 a[i]=u.a[i+1]=v ++w[u],++w[v] ...
- [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...
- 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家
[题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...
- [JLOI2014] 松鼠的新家 (lca/树上差分)
[JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在 ...
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
随机推荐
- elasticsearch增删改查操作
目录 1. 插入数据 2. 更改数据 3. 删除数据 4. 检索文档 1. 插入数据 关于下面的代码如何使用,可以借助于kibana的console,浏览器打开地址: http://xxx.xxx.x ...
- 「专题训练」Hard problem(Codeforces Round #367 Div. 2 C)
题意与分析 题意:给出\(n\)个字符串,可以反转任意串,反转每个串都有其对应的花费\(c_i\).经过操作后是否能满足字符串\(\forall i \in [1,n] \text{且} i \in ...
- OSG-视口&LOD&Imposter
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- .NET邮件发送详情
①百度下载个Free Smtp Server ②下载完成后,打开进去,点击左上角的options,弹出窗口,进行如下图选项即可(一般默认已正确选中),然后我们可以把这软件关了. (下次你重启电脑时,也 ...
- 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
01-文件属性内容介绍 02- inodeyublock讲解 03-访问oldboyfile的寻宝过程 04-inode与block小结 05-磁盘空间不足案例详解 06-Linux文件类型及拓展名 ...
- Objective-C 内存管理和ARC
内存管理 范围: 任何继承了NSObject的对象 对基本数据类型无效 原理: 每个对象内部都保存了一个与之相关联的整数 称为引用计数器 1.计数器的基本操作 当使用alloc new或者copy创建 ...
- TW实习日记:第28天
同前两天一样,等接口,开发,调试接口.重复地做着低级代码得搬运工作,确实挺没意思的.怪不得有些人一直说写低级代码很无聊,没有创造性和成就感.31号准备溜了,还是好好复习准备秋招吧. 挖坑清单: Vue ...
- Vue 编程之路(二)——跳转页面传值
最近公司的一个项目中使用 Vue 2.0 + element UI 实现一个后台管理系统的前端部分,属于商城类型.其中我负责的部分有一项需要跳转页面,由于跳转前的页面是多个组件构成的,所以在跳转页面的 ...
- Java学习 · 初识 多线程
多线程 1. 基础概念 a) 程序 Program i. 静态代码,指令集,应用程序执行的蓝本 b) 进程 Process i. 动态概念,正在运 ...
- Java学习 · 初识 IO流
IO流 1. 原理与概念 a) 流 i. 流动,流向 ii. 从一端移动到另一端 源头到目的地 iii. 抽象.动态概念,是一连 ...