「luogu3258」[JLOI2014] 松鼠的新家
https://www.luogu.org/problemnew/show/P3258
(树剖裸题
树上差分 = = 差分 + lca
1. 树上差分基本思想:和差分一样,用前缀和的思想来处理解(操作后的树上,任意节点的糖果数 是通过所有与其相连的子节点的和 以及该节点在差分数组里的值 得到的(dfs);
2. 因为这道题并不需要除了lca以外的信息,故tarjan
对于一组修改u,v :只需修改差分数组 ----- diff[u]++, diff[v], diff[lca(u,v)]--, diff[fa[lca(u,v)]]--
至于为什么,看1;
剩下自己想;;
// 15owzLy1
//luogu3258.cpp
//2018 09 25 18:45:43
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
typedef double db;
using namespace std; const int N = ;
struct node {
int next, to;
}edge[N<<];
int set_[N], candy[N], diff[N], n, head[N], head_q[N], fa[N];
int query[N][], a, b, c, cnt;
bool vis[N]; template<typename T>inline void read(T &x_) {
x_=;bool f_=;char c_=getchar();
while(c_<''||c_>''){f_|=(c_=='-');c_=getchar();}
while(c_>=''&&c_<=''){x_=(x_<<)+(x_<<)+(c_^);c_=getchar();}
x_=f_?-x_:x_;
} inline void jb(int u, int v) {
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
} int get_set_(int x) {
return (set_[x]==x)?x:set_[x]=get_set_(set_[x]);
} inline void Merge(int x, int y) {
set_[get_set_(y)]=get_set_(x);
} void dfs(int u) {
vis[u]=true;
for(int i=head[u];i;i=edge[i].next) {
int v=edge[i].to;
if(v==fa[u]) continue;
fa[v]=u;
dfs(v);
Merge(u, v);
} if(vis[query[u][]]) {
a=get_set_(query[u][]);
if(a!=get_set_(u)) {
diff[a]--, diff[fa[a]]--;
diff[u]++, diff[query[u][]]++;
}
}
if(vis[query[u][]]) {
a=get_set_(query[u][]);
if(a!=get_set_(u)) {
diff[a]--, diff[fa[a]]--;
diff[query[u][]]++, diff[u]++;
}
}
} void get_ans(int u) {
candy[u]=diff[u];
for(int i=head[u];i;i=edge[i].next) {
int v=edge[i].to;
if(v==fa[u]) continue;
get_ans(v);
candy[u]+=candy[v];
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("luogu3258.in","r",stdin);
freopen("luogu3258.out","w",stdout);
#endif
int x, y, a1;
read(n); read(x); a1=x;
for(int i=;i<n;i++) {
read(y);
query[y][]=x, query[x][]=y;
x=y;
} for(int i=;i<n;i++) read(x), read(y), jb(x, y), jb(y, x);
for(int i=;i<=n;i++) set_[i]=i;
dfs(); get_ans(); candy[a1]++;
for(int i=;i<=n;i++)
printf("%d\n", candy[i]-);
return ;
}
「luogu3258」[JLOI2014] 松鼠的新家的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- 3631: [JLOI2014]松鼠的新家
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 707 Solved: 342[Submit][Statu ...
- [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...
- P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家
[题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- [JLOI2014] 松鼠的新家 (lca/树上差分)
[JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在 ...
- 洛谷P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
随机推荐
- IDEA+API && SPI
JAVA中API和SPI的区别:https://blog.csdn.net/quanaianzj/article/details/82500019
- springBoot2.0+redis+fastJson+自定义注解实现方法上添加过期时间
springBoot2.0集成redis实例 一.首先引入项目依赖的maven jar包,主要包括 spring-boot-starter-data-redis包,这个再springBoot2.0之前 ...
- Java的get、post请求
URLConnection package com.shuzf.http; import java.io.BufferedReader; import java.io.IOException; imp ...
- VUE浏览器储存封装
import {isFunction, extend} from 'lodash' const _originStorage = function () { var pluses = /\+/g fu ...
- Tampermonkey-让百度云下载飞起来
1. 简介Tampermonkey是一款免费的浏览器扩展程序. 我们这里用于谷歌浏览器,目的是为了让百度云里面的文件以满速下载,节约金钱. 2. 安装安装Lantern蓝灯或者其他的FQ工具. 打开F ...
- mysql 的存储引擎介绍
在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...
- python中socket、进程、线程、协程、池的创建方式和应用场景
进程 场景 利用多核.高计算型的程序.启动数量有限 进程是计算机中最小的资源分配单位 进程和线程是包含关系 每个进程中都至少有一条线程 可以利用多核,数据隔离 创建 销毁 切换 时间开销都比较大 随着 ...
- SQL学习指南第二篇
使用集合 union操作符(组合查询) 多数 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句.但是,SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结 ...
- java 简单程序
public class a{ public static void main(String[] args) { System.out.println("Hello world") ...
- Numpy 系列(十一)- genfromtxt函数
定义输入 genfromtxt的唯一强制参数是数据的源.它可以是字符串,字符串列表或生成器.如果提供了单个字符串,则假定它是本地或远程文件或具有read方法的打开的类文件对象的名称,例如文件或Stri ...