「刷题」 网络

看了一下网上基本都是线段树二分的题解,然而我想到一种整体二分的思路,正好练习一下。

是道好题。

首先用树上ST表处理,用于求LCA。

考虑整体二分离线求解。

一种方法是用树链剖分的,复杂度是$O(log^2n)$的,在套上个整体二分,复杂度达到了$O(nlog^3n)$所以说不可以直接树剖暴力。

可以用树上差分的方式。

考虑假设对于当前询问二分出的某一个答案,如何$check$?

只需要判断这个点是否阻断了所有的权值大于这个答案的路径,如果是的话,那么放低上界,否则升高下界。

用整体二分来做这个过程即可。

对于某一条路径的贡献,如果是树剖的话直接链上修改即可,判断当前这个点是否阻断了所有的添加上去的路径,但是复杂度不正确。

考虑树上差分,那么对于一条路径,给$a[x]++,a[y]++,a[lca]--,a[fa[lca]]--$,可以差分出这条路径的贡献,那么我对于一个点作子数查询,用$dfs$序即可,得到的就是经过这个点的路径个数,这样可以直接用树状数组搞。

那么每次分治一段区间的时候,考虑大小大于$mid$的边的贡献,把时间大于当前询问的修改全部打到树状数组上,然后直接查询即可,就可以分治出结果了。

时间复杂度$O(nlog^2n)$树状数组常数非常优秀。

得解。

原文地址:https://www.cnblogs.com/Lrefrain/p/11620445.html

时间: 2024-08-30 04:16:05

「刷题」 网络的相关文章

「C语言」「刷题」XUPT Online Judge经典题型

在学校OJ网( http://www.xyjudge.com/)上刷了一些题,有的题型值得整理在博客上. 3.6日才刚刚开始刷,慢慢添加那些比较经典的,并尽量用多种方法求解后思考哪一种最适合. 1 #include <stdio.h> 2 #include <math.h> 3 #define A 2 4 5 int f(int i,int k) 6 { 7 int j; 8 j=k*A*pow(10,i); 9 return j; 10 } 11 12 int main() 13

「刷题」JZPKIL

这道反演题,真牛逼. 以下用$B$代表伯努利数,$l*g=f$代表狄利克雷卷积,先推式子. 对于给出的$n,x,y$求一百组数据的$ans$ $\begin{array}{rcl} ans & = & \sum\limits_{i=1}^ngcd(i,n)^xlcm(i,n)^y\end{array}$ $\begin{array}{rcl} & = & \sum\limits_{i=1}^ngcd(i,n)^x\frac{(in)^y}{gcd(i,n)^y}\end{a

「刷题」Triple

正解是指数型母函数+FFT. 才学了多项式,做了一道比较好的题了. 首先有三个斧子被偷了. 我们考虑构造一种指数型母函数. 就是说一种多项式吧,我的理解. 系数是方案,下标,也就是所谓的元指数代表的是价值. 这样如果两个母函数相乘的话,指数相加,系数相乘. 正好就是两个单元合并之后的方案和价值. $A(x),B(x),C(x)$分别代表一把相同的斧子用价值为x,2把为x,3把为x的方案数. 容斥一下. 三把的答案就是$A(x)*A(x)*A(x)-C_3^1A(x)B(x)+2C(x)$ 解释一

「刷题」你的名字

题真好. 也帮我回忆起了快两个月没动的\(SAM\). 我只能想到\(68\)分的数据. 题目要求给出一个串\(S\). 然后每次询问给出一个串\(T\)和两个变量\(l,r\) 要求出有多少个本质不同串是\(T\)的子串而不是\(S[l,r]\)的子串. 前面\(68\)分是\(l=1,r=n\)的. 直接做. 首先我们对\(S\)建出后缀自动机. 询问的时候,对\(T\)再次建出后缀自动机. 每次建出一个前缀节点的时候统计一下本质不同子串,同时记录此时前缀节点父亲的\(len\)值,如果是第

「刷题」Color 群论

这道题乍一看挺水的,直接$ Ploya $就可以了,可是再看看数据范围: $ n\lep 1e9 $ 那就是有1e9种置换,这不歇比了. 于是考虑式子的优化. 首先证明,转i次的置换的每个循环结大小是 $ gcd(i,n) $ 证明: 首先设第x个元素的位置是p,置换种类是i,循环k次后回到原点,k也就是循环结个数. $ ik+p \equiv p (mod n) $ $ ik \equiv 0 (mod n) $ $ n|ik $ $ i|ik $ 我们要让k最小,那么: $ ik=lcm(i

「刷题」GERALD07加强版

是LCT了. 首先我们不知道联通块怎么数. 然后颓标签知道了是LCT. 那么考虑一下怎么LCT搞. 有一个很普遍的思路大家也应该都知道,就是如何求一个区间中某种颜色的个数. 这个可以很简单的用主席树来实现对吧,只需要记录下来这种颜色上次出现的位置就可以了,然后在$[l,r]$中查询值在$[0,l-1]$中的数的个数. 然后联通块和这个有什么关系呢? 颜色的话为什么可以用这种方法代替呢?为了去重,而这道题中什么情况是所谓“重”的呢? 就是两条边链接了两个相同的集合的时候. 那么考虑以下一种算法.

「原创题」红太阳

「题目描述」 我们都知道,红太阳会发出光芒.每天红太阳会等概率随机.不超过 $n$ 次地发出光芒,每次包含着 $a$ 个单位的热量. 我们都知道,只有在红太阳的照耀下,我们才能茁壮成长.每天每个人都希望得到 $c$ 个单位的热量,只有得到了 $c$ 个单位的热量,一个人才会满足,并高呼「红太阳万岁!」.而红太阳会满足尽量多的人. 问每天红太阳能满足的人的期望个数,为了避免浮点误差,将答案乘上 $n+1$ 对 ${10} ^ 9 + 7$ 取模后输出. 「做法1」类欧几里得算法 求 $\begin

「ZigBee模块」网络通讯实验-点播、组播、广播

预告下,明天还有最后一个实验<zigbee协议栈管理>......太棒了~马上就如期完成任务啦!哈哈哈 点播.组播.广播 一.基础知识补充 Zigbee的通信方式主要有三种:点播.组播.广播. 点播就是点对点通信,也就是两个设备之间的通信,不允许第三个设备收到信息. 组播就是把网络中的节点分组,每一个组员发出的信息只有相同组号的组员才能收到. 广播,最广泛的就是1个设备上发出的信息所以设备都能接收到. 二.点播实验步骤 因为要将收到的数据通过串口显示在屏幕上,所以在程序开始之前先把串口初始化吧

路灯「APIO 2019」

题意 有.复杂,自己上网搜 思路 \((x,y)\) 表示从\(x\)到\(y\)联通的时间长度. 那么查询操作相当于二维平面上的单点查询. 对于每一个\(i\),维护一个最左能到达的\(lm\),和最右能到达的\(rm\). 那么对于每一个更新操作,相当于对左上角为\((lm,i)\),右下角为\((i,rm)\)的矩形做修改. 于是就转换为类似「简单题」的题目了,可以CDQ分治解决,当然也可以直接上树套树. 代码 #include <bits/stdc++.h> using namespa