lca

LOJ146DFS 序 3,树上差分 1

一世执手 提交于 2019-12-04 04:17:38
LOJ146 这道题可以说是真的板子题啦 恩一看就想到了树链剖分,于是乎很快码出了代码 Code1: 1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ls x << 1 4 #define rs x << 1 | 1 5 using namespace std; 6 ll read() { 7 ll re = 0, f = 1; 8 char ch = getchar(); 9 while (ch < '0' || ch > '9') {if (ch == '-') f = -f; ch = getchar();} 10 while ('0' <= ch && ch <= '9') {re = re * 10 + ch - '0'; ch = getchar();} 11 return re * f; 12 } 13 const int N = 1e6 + 7; 14 int n, m, r; 15 int tot, head[N]; 16 ll sum[N << 2], lazy[N << 2]; 17 ll Id, w[N], wt[N], id[N], fa[N], top[N], siz[N], son[N], dep[N]; 18 struct node{ 19 int net, to; 20 }e

天天爱跑步

天涯浪子 提交于 2019-12-04 04:15:24
LuoguP1600 这道题本来想着等初赛晚再切的....结果到了机房发现大佬们都切了qwq 没办法啊,就...大概看了一下,果然好难啊!QAQ Code: 1 /* 2 首先我们可以想到对于每个运动员都进行计算,但是复杂度太高了,所以我们转换思想 3 对于每个观测点计算都有谁对它做出了贡献 4 然后对于一条路径(s,t)我们把它拆开分为两部分s -> LCA(s,t) 和 LCA(s,t) -> t 5 然后就会出现两种情况: 6 一:观测点p在 s -> LCA(s,t) 上,那么就是上行,那么满足dep[s]=w[p]+dep[p]的起点s就会对p产生贡献 7 我们用一个桶b1来维护上行产生的贡献值,对于每个观测点直接读取桶中b1[w[p]+dep[p]]的值即可 8 二:观测点在 LCA(s,t) -> t 上,那么就是下行,那么满足dist[s,t]-w[p] = dep[t]-dep[p]移项后就是dist[s,t]-dep[t]=w[p]-dep[p] 9 的终点t就会对p产生贡献 10 我们用另一个桶b2来维护下行产生的贡献值,对于每个观测点直接读取桶中b2[w[p]-dep[p]]的值即可 11 然后就是有几个注意的点: 12 一:因为每个观察点只会被自己子树中的点影响,所以在开始时先读取桶中的值,在递归回溯前再减去算差值 13 二

九校联考Day2 - 3.管理

ぃ、小莉子 提交于 2019-12-04 01:38:45
前言 这套题我们没有考,但是却也作为作业题写了。 怎么说啊。。。反正我是想不到思路的。 正文 题面: 题目描述 在上半套题中提到的那家公司在你的帮助之下服务成本大幅降低,于是这家公司开始快速发展,现在这家公司已经拥有了n名员工,分别从1到n编号。 为了方便管理。公司集体会议决定,可以将某个员工A任命为一个之前没有直接上司的员工B的直接上司,并且规定,当某个员工B收到并阅读完某个文件时,若B当前有直接上司A,则B需要继续将它交给A,A收到并阅读这个文件后,若当前A还有直接上司,那么还需将文件交给A的直接上司阅读,以此类推,直到某个阅读的人C没有直接上司,这时候C便会将该文件存档。 举个例子,比如B在t-1时刻收到了文件x,而A在t时刻成为了B的直接上司,那么A不会重新阅读B在t-1时刻收到的文件x。 这家公司又邀请你来帮忙,他们除了给你任命信息以及接收文件的信息之外,还会询问某一个人是否读过一个指定的文件,具体来说,现在这家公司按时间顺序给你m条信息/询问,为以下三种之一(一开始员工间无上下级关系): 1、(1操作,输入格式为1 B A)表示员工A成为了员工B的直接上司,保证在此之前B没有直接上司,并且上司关系显然不会构成环。 2、(2操作,输入格式为2 B)表示员工B收到了一份新文件,在下一个信息/询问之前,所有应该读到这份文件的人都会读到它。 3、(3操作,输入格式为3 A i

[PA2014] Fiolki

丶灬走出姿态 提交于 2019-12-03 23:29:55
问题描述 化学家吉丽想要配置一种神奇的药水来拯救世界。 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号)。初始时,第i个瓶内装着g[i]克的第i种物质。吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到。瓶子的容量可以视作是无限的。 吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直到某一反应物耗尽。生成的沉淀不会和任何物质反应。当有多于一对可以发生反应的物质在一起时,吉丽知道它们的反应顺序。每次倾倒完后,吉丽会等到反应结束后再执行下一步骤。 吉丽想知道配置过程中总共产生多少沉淀。 输入格式 第一行三个整数n,m,k(0<=m<n<=200000,0<=k<=500000),分别表示药瓶的个数(即物质的种数),操作步数,可以发生的反应数量。 第二行有n个整数g[1],g[2],…,g[n](1<=g[i]<=10^9),表示初始时每个瓶内物质的质量。 接下来m行,每行两个整数a[i],b[i] (1<=a[i],b[i]<=n,a[i]≠b[i]),表示第i个步骤。保证a[i]在以后的步骤中不再出现。 接下来k行,每行是一对可以发生反应的物质c[i],d[i] (1<=c[i],d[i]<=n,c[i]≠d[i])

[NOIP2015]运输计划 题解

♀尐吖头ヾ 提交于 2019-12-03 20:58:31
题目背景 公元 2044 年,人类进入了宇宙纪元。 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条 航道连通了 L 国的所有星球。 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。 为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。 在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。 如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少? $Solution:$ 其实挺简单的……跟保卫王国什么的没法比…… 题意就是给你几条树上路径,有一次删除边权的机会,最小化它们的最大长度。“最大值最小”显然二分啊。 考虑怎么check,首先如果二分出的$ans \ge $最长路径长度那么一定是合法的,不过没什么用

详解树上差分

北战南征 提交于 2019-12-03 17:22:18
浅谈树上差分 本篇随笔简单讲解一下信息学奥林匹克竞赛中树上差分的相关知识点。树上差分近几年成为了考试热门,也成为了考察差分思想比较常用的手段。理解树上差分最好需要读者了解图和树的基础知识,LCA及LCA问题的求法,以及差分数组和差分思想。其中最为重要的是差分思想,对于这个思想,有还不是很了解的小伙伴可以参考这篇博客: 差分数组 树上差分:边的差分 我们对差分和差分数组的理解一般都是停留在数组这种线性结构上的。这可能会导致我们学习树上差分的时候无法理解这个概念。 树上差分一般应用于我们在树上的路径统计。 对于一棵树,我们可以设置差分数组 \(cnt[i]\) 表示经过边 \(i\) (边 \(i\) 的定义是链接 \(i\) 到 \(i\) 的父亲这一条边)的次数。 那么类比于差分数组,如果要从 \(u\) 到 \(v\) 都加上一个数。那么就会有 \(cnt[u]++,cnt[v]++,cnt[lca]-=2\) 。( \(lca\) 是 \(u,v\) 的最近公共祖先) 这是为什么呢? 首先,介绍树的两个性质: 1、任意两点之间有且只有一条简单路径。 2、如果是一棵无根树,那么确定根节点后,除根节点外每个点有且只有一个父亲节点。 那么,先来看一张图: 对于这棵树来讲,如果我们想对一条路径: \(5-9\) 进行差分修改,那么从 $ 5-9 $ 的唯一简单路径就是 \(5-2-1

【牛客】路径计数机

痞子三分冷 提交于 2019-12-03 17:02:23
题目描述 有一棵n个点的树和两个整数p, q,求满足以下条件的四元组(a, b, c, d)的个数: 1.$1\leq a,b,c,d \leq n$ 2.点a到点b的经过的边数为p。 3.点c到点d的经过的边数为q。 4.不存在一个点,它既在点a到点b的路径上,又在点c到点d的路径上。 输入描述: 第一行三个整数n,p,q。 接下来n - 1行,每行两个整数u, v,表示树上存在一个连接点u和点v的边。 输出描述: 输出一个整数,表示答案。 示例1 输入 5 2 1 1 2 2 3 3 4 2 5 输出 4 说明 合法的四元组一共有: (1, 5, 3, 4), (1, 5, 4, 3), (5, 1, 3 ,4), (5, 1, 4, 3)。 示例2 输入 4 1 1 1 2 2 3 3 4 输出 8 备注: 对于前20%的数据,n,p,q≤50。 对于前40%的数据,n,p,q≤200。 对于另外10%的数据,p = 2, q = 2。 对于另外10%的数据,树是一条链。 对于另外10%的数据,树随机生成。 对于所有数据1≤n,p,q≤3000,1≤u,v≤n,保证给出的是一棵合法的树。 分析 我已经弱到连$n^2$枚举路径都不会了 再一次求助Master_Yi 这个题只要理顺了就挺好想的了(说得好像我想得出来似的。 由于不相交的情况不好求,所直接看相交的情况。 找规律

newker训练营4

a 夏天 提交于 2019-12-03 16:49:26
T2: 树上差分、前缀和、dfs序的应用。 只询问p,q路径,可以n^2.没必要树形DP。 直接n^2枚举点对O(1)算距离即可。 考虑枚举点对i,j,O(1)统计。 求出以i为lca的路径数和经过i且不以i为lca的路径数。 u=lca(i,j)。 w=u子树和,减去i~j链上,加上u子树外,减去经过u且不以u为lca条数。 先往简单想。别过于套路,一看路径长直接树DP。 好题。 B@哥 真巨。 来源: https://www.cnblogs.com/seamtn/p/11803304.html

The 2019 China Collegiate Programming Contest Harbin Site

和自甴很熟 提交于 2019-12-03 16:05:23
easy: FJKI medium-easy: AE medium: BCL Problem A. Artful Paintings solved by F0_0H (91 min, +1) 二分答案后差分约束,SPFA 判负环。 \(O(nmlogn)\) Problem B. Binary Numbers solved by F0_0H (297, +2) 做法一: \(F(a,b)\) 为 \(a\) 和 \(b\) 的 LCP。 注意到, \(Lcp(x, y)\) ,当 \(y>x\) 时,随着 \(y\) 增加,dep 深度递减。 注意到,比 \(r_i\) 大的点,一定在 \(lca(a_i,r_i)\) 子树外,比 \(l_i\) 小的点,一定在 \(lca(a_i,l_i)\) 的子树外。 施展 DP,依次决策每段该选择什么元素,到第 \(i\) 段的转移,一定是来自于第 \(i-1\) 段的一个区间。 \(O(2^m * m)\) 做法二: 更直接了当。 \(dep(lca(a_i,r_i)) \geq dep(lca(a_{i+1},r_i))\) \(dep(lca(a_i,l_i)) \geq dep(lca(a_{i-1},l_i))\) \(dp[i][j][k]\) 第 i 段中, \(lcp(a_i,r_i)=j,lcp(a_i,r_i+1)=k\

洛谷P3943 星空——题解

不羁的心 提交于 2019-12-03 15:00:51
差分数组及树上差分 所谓差分,就是记录当前的元素与之前元素逻辑上的差距。   最基础的用法是差的差分数组:    记录当前位置的数与上一位置的数的差值。      即b[i]=a[i]-a[i-1] (b为差分数组,a为原数组)    通过对差分数组求前缀和,可以求出原数组,即:           甚至可以求出前缀和:          (s为原数组,sum为原数组的前缀和数组,b为差分数组)   可以O(1)优化区间加法:给原数组区间[l,r]的数都加上x,只要在b l处加x,b r+1 处减x。       有两种理解角度:         1、从差分定义出发,区间加x使区间左端点与它在原数组上一个数的差距加大了x、使区间右端点的后一个数与区间右端点的数的差距缩小了x,而没有改变区间中相邻2数的差距。         2、从差分数组的修改对原数组的影响入手:由于差分数组求前缀和得出原数组,当b l加x之后求前缀和,那么原数组自l及以后的数全部比b l加x之前多了x;同理当b r+1减x之后求前缀和,那么原数组自r+1及以后的数全部比b r+1减x之前少了x。总的一看,发现原数组l~r的部分就多了x,其余部分没有变化。      广义差分:差分维护的是相邻元素间的逻辑关系,从而使能从初始状态(a[0])通过差分数组表达的逻辑关系推出某个位置上a的值(从形式上看就是求前缀)