题目

树上差分

树上点差分,注意会出现路径端点多记录的情况,这时需要在最后输出的时候输出子树的差分数组的和-1,而不是在处理原数据的时候减1。并且a[n]不需要糖果,最后也减去就行。

#include <bits/stdc++.h>
#define N 1001011
using namespace std;
struct edg {
int to, nex;
}e[N];
int n, a[N], cnt, lin[N], fa[N][19], dep[N], sum[N];//sum[i]乃差分数组。
inline void add(int f, int t)
{
e[++cnt].to = t;
e[cnt].nex = lin[f];
lin[f] = cnt;
}
void dfs(int now, int f)
{
fa[now][0] = f;
dep[now] = dep[f] + 1;
for (int i = lin[now]; i; i = e[i].nex)
{
int to = e[i].to;
if (to == f) continue;
dfs(to, now);
}
}
int dfs2(int now)
{
for (int i = lin[now]; i; i = e[i].nex)
{
int to = e[i].to;
if (to == fa[now][0]) continue;
dfs2(to);
sum[now] += sum[to];
}
return sum[now];
}
inline void init()
{
dfs(1, 0);
for (int j = 1; j <= 18; j++)
for (int i = 1; i <= n; i++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
int lca(int u, int v)
{
if (dep[u] > dep[v])
swap(u, v);
for (int k = 0; k <= 18; k++)
if ((dep[v] - dep[u]) >> k & 1)
v = fa[v][k];
if (u == v) return u;
for (int k = 18; k >= 0; k--)
if (fa[u][k] != fa[v][k])
u = fa[u][k], v = fa[v][k];
return fa[u][0];
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1, u, v; i < n; i++)
{
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
init();
for (int i = 2; i <= n; i++)
{
int now = lca(a[i], a[i - 1]);//now是当前经过的两点的lca。
sum[a[i]]++, sum[a[i - 1]]++, sum[now]--, sum[fa[now][0]]--;
}
dfs2(1);
for (int i = 2; i <= n; i++)
sum[a[i]]--;
for (int i = 1; i <= n; i++)
printf("%d\n", sum[i]);
return 0;
}

洛谷P3258 [JLOI]2014松鼠的新家的更多相关文章

  1. [JLOI 2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想 ...

  2. 【Luogu P3258】[JLOI2014]松鼠的新家

    Luogu P3258 题意就是对于一棵树,要求按照给出的顺序对每一个节点进行访问,记录每一个节点被经过的次数:特别地,我们认为只有从一个节点往外走才能被认为是经过一次.(最后一句话非常重要,仔细理解 ...

  3. 题解 P3258 【[JLOI2014]松鼠的新家】

    树链剖分板子题 先说点别的 小熊维尼啊,嘿嘿嘿. 写题经历 悲惨命运:树剖调了2天,一直90分,死活不AC,调出了心病,快下课时改了一下数据范围,A了--.(刚开始数组开了800100,改120010 ...

  4. 题解 P3258 【[JLOI2014]松鼠的新家】(From luoguBlog)

    唯一能得分的题也被自己搞炸了,好的. 考场上读完题基本认定和lca脱不了干系,想了一会确认是树剖. 那么问题来了,考前一节课刚发现自己之前打的树剖是错的. 而且就算是错的我也没信心考场调出来. 于是打 ...

  5. 题解 洛谷 P4632 【[APIO2018] New Home 新家】

    首先考虑可以用二分答案来解决询问,可以二分一个长度\(len\),若在区间\([x-len,x+len]\)内包含了所有\(k\)种的商店,那么这个\(len\)就是合法的,可以通过二分来求其最小值. ...

  6. 洛谷 P3258 BZOJ 3631 [JLOI2014]松鼠的新家

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...

  7. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  8. 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家

    [题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...

  9. 洛谷P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

随机推荐

  1. C# 连接数据库的配置方法

    写在前面 在项目的开发过程中我门常常遇到会忘记数据库连接的配置的写法的尴尬处境.俗话说,好记性不如烂笔头.所以,mark一下. 1.Sqlserver数据库连接 <connectionStrin ...

  2. .NET中的泛型概述

    什么是泛型? 泛型是具有占位符(类型参数)的类.结构.接口和方法,这些占位符是类.结构.接口和方法所存储或使用的一个或多个类型的占位符.泛型集合类可以将类型形参用作其存储的对象类型的占位符:类型形参呈 ...

  3. 手机端 关闭当前页面的JS

    JS 代码如下   PS:我找的原代码中, 注释部分是没有注释的,但是调试的时候报错,就注释掉了,因为我只需要微信和支付宝的判定,所以这个地方,就没仔细研究 var isLppzApp = false ...

  4. 浏览网页隐藏服务器IP

    host文件修改 notepad %windir%\system32\drivers\etc\hosts 目标IP localhost.autumn.com 可能会导致HTTP Status Code ...

  5. Texture(ASDK)、ComponentKit、LayoutKit、YogaKit

    YogaKit 最轻量,改动量最小,目的最纯粹,同时也最类似于使用 frame ,需要自己造一波在 UITableView 中使用的轮子(各类 frame 结果缓存方案).同类的备选方案是 FlexB ...

  6. Python操作SQLite/MySQL/LMDB

    1.概述 1.1前言 最近在存储字模图像集的时候,需要学习LMDB,趁此机会复习了SQLite和MySQL的使用,一起整理在此. 1.2环境 使用win7,Python 3.5.2. 2.SQLite ...

  7. 常用模块 - hashlib模块

    一.简介 Python的hashlib提供了常见的摘要算法,如MD5.SHA1.SHA224.SHA256.SHA384.SHA512等算法. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过 ...

  8. 23、vue实现获取短信验证码

    1.html页面: <el-form-item prop="phoneCode" class="pr"> <el-input placehol ...

  9. 英语partschinite芬达石partschinite锰铝榴石

    partschinite指锰铝榴石,属于石榴石的一种,由于它有芬达饮料的诱人颜色,大家也称其为“芬达石”.石榴石宝石族中重要品种之一,化学成分为锰铝硅酸盐,颜色从红到橙红,红到棕红,玫瑰红.浅玫红均有 ...

  10. 使 WIN 10进入休眠、睡眠、关机的命令

    1.用命令控制定时关机,重启,休眠等 休眠:rundll32.exe powrProf.dll,SetSuspendState 休眠:shutdown -h 睡眠:rundll32.exe powrp ...