目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了 T城 .T城 是一个水上城市,一共有 $ N $ 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T城 的任意两个景点之间有且只有一条路径.换句话说, T城 中只有 $ N − 1 $ 座桥. Ray 发现,有些桥上可以看到美丽的景色,让人心情愉…
传送门 解题思路 快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; ; const int inf = 0x3f3f3f3f; inline int rd(){ ,f=;char ch=getchar();…
P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T\) 城的任意两个景点之间有且只有一条路径.换句话说, \(T\) 城中只有 \(N − 1\) 座桥. \(\tt{Ray}\) 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁.于是,他给每座桥定义一个愉悦度\(w\),也就是说,\…
旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径.换句话说, T 城中只有N − 1 座桥. Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁.于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的.有时,Ray 看待同一座桥的心情也会发生改变. 现在,…
题目描述 \(Ray\) 乐忠于旅游,这次他来到了\(T\) 城.\(T\) 城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T\) 城的任意两个景点之间有且只有一条路径.换句话说, \(T\) 城中只有\(N − 1\) 座桥. \(Ray\) 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁.于是,他给每座桥定义一个愉悦度\(w\),也就是说,\(Ray\) 经过这座桥会增加\(w\) 的愉悦度…
传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然后再取反 单点修改的时候忘记pushdown结果调了好久…… //minamoto #include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; template<:;} template<:;} inline…
题目链接: 传送门 题目分析: 树剖板,支持单点修改,区间取反,区间求最大值/最小值/和 区间取反取两次等于没取,维护一个\(rev\ tag\),每次打标记用\(xor\)打,记录是否需要翻转,\(push\_down\)里判一下如果要取反就\(-=2 * sum(p)\),容易发现新最大值是原最小值的相反数,最小值同理 细节挺多的,看代码 代码: #include <bits/stdc++.h> #define N 2 * (200000 + 5) #define int long lon…
问题描述 LG1505 题解 边化点权. 超级多操作的树剖板子... 以后就拿这个当树剖板子复习吧... \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();…
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,…
洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\)的时候不要写错名字 \(4\).使用线段树的操作的时候才要用到\(dfs\)序 \(5\).需要开一个数组来记录在\(dfs\)序下的节点是什么也方便线段树的赋值 \(6\).注意\(down\)函数内怎样更新 \(7\).在查询的时候并不需要向上更新 由于\(yxj\)看了\(lfd\)敲的树链…
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子树的大小不小于任意一个他兄弟节点的子数大小(若有多个就看心情选取其中的一个),那么它到它父节点的连边为重边,这个节点为重子节点,否则,它到它父节点的连边为轻边. 将一条全部由重边组成的链叫做重链. (图中加粗的边为重边,未加粗的边为轻边,图取自www.baidu.com) 这样做有什么用呢? 如上图剖分后的树…
正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就欧克了QwQ #include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define gc getchar() #define ls(x) (x<<1) #define r…
题目链接 题解 比较裸的树链剖分 好像树链剖分的题都很裸 线段树中维护一个区间最左和最右的颜色,和答案 合并判断一下中间一段就可以了 比较考验代码能力 Code #include<bits/stdc++.h> #define LL long long #define RG register using namespace std; inline int gi() { int f = 1, s = 0; char c = getchar(); while (c != '-' &&…
题目描述 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): 格式: \(1\) \(x\) \(y\) \(z\) 表示将树从\(x\)到\(y\)结点最短路径上所有节点的值都加上\(z\) 操作\(2\): 格式: \(2\) \(x\) \(y\) 表示求树从\(x\)到\(y\)结点最短路径上所有节点的值之和 操作\(3\): 格式: \(3\) \(x\) \(z\) 表示将以\(x\)为根节点的子树内所有节点值都加上\(…
题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记,查询有无标记即可: 一开始是打1的标记,查询后就减去,查询 sum 是否为 0 即可: 然而这样写却全 WA 了...悲痛欲绝去看了 TJ ,模仿了其写法,回头再看发现是忘记写 pushdown ,而且 -1 的地方写成 0 了囧... 改掉就 A 了,这个做法完全没问题嘛! 代码如下: #incl…
Problem Portal Portal1: Luogu Description 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上\(z\): 操作\(2\): 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和: 操作\(3\): 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上\(z\): 操作\(4\): 格式: 4 x…
[题目链接] [思路]: 涉及到树上区间修改操作,所以使用树链剖分,涉及到区间查询,所以使用线段树. update操作时,就正常操作,难点在于query操作的计数. 因为树链剖分的dfs序只能保证一条重链上的dfn[]连续,不能使得任意两点之间简单路径上的dfn[]连续,所以当x往上跳到fa[top[x]]时,要判断 top[x]的颜色与fa[top[x]]的颜色是否相同,如果相同要再减一. 以及在线段树中query操作和pushUp时,都要判断左儿子的右端点与右儿子的左端点是否相同,如果在pu…
题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题目: https://www.cnblogs.com/codedecision/p/11791200.html 然后你就会发现这就是树链剖分+上题的线段树处理. 然后这道题目就变得很简单. 实现代码如下: #include <bits/stdc++.h> using namespace std;…
题目链接:https://www.luogu.org/problem/P2486 首先这是一道树链剖分+线段树的题. 线段树部分和 codedecision P1112 区间连续段 一模一样,所以我们在做这道题目之前最好去做一下这道题目的练习. 然后就是树链剖分的部分. 此部分支持两种操作: 更新:这部分比较好实现: 查询:这部分需要你记录树链查询的时候的每一条边的信息,然后将这些信息进行汇总,处理起来稍有一些繁琐. 实现代码如下: #include <bits/stdc++.h> using…
洛谷题目传送门 正解是树状数组维护dfn序上的前缀和,这样的思路真是又玄学又令我惊叹( 我太弱啦,根本想不到)Orz各路Dalao 今天考了这道题,数据范围还比洛谷的小,只有\(10^5\)(害我复制粘贴一波交上去RE),让我很放心地去想树剖了. 然而尴尬的是我不会树剖,却先学了LCT(再次暴露蒟蒻的本性) 树剖的模型是,把土路视为权值,有修改,然后要查询某节点到根节点的权值和.没有换根的话,边权直接视为点权. 然后我干脆直接用Splay维护链剖分算啦(其实就是弱化板的LCT,有点像我弹飞绵羊的…
洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\sum\limits_ {j=1}^ia_ j\) 显然有\(a_ i=\sum\limits_ {j=1}^id_ j\) 于是大力展开得到 \[s_i=\sum\limits_{j=1}^i(i-j+1)d_j\] \[s_i=(i+1)\sum\limits_{i=1}^jd_j-\sum\lim…
题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径.换句话说, T 城中只有N − 1 座桥. Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁.于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的.有时,Ray 看待同一座桥的心情也会发生改变. 现在,Ray…
题目链接 树剖练手题,想复习下树剖. 第一次提交\(T\)成QQC 看我 ??? 看了数据范围的确挺恶心的,我的复杂度是\(O(Mlog^2N)\)的,数据范围有三段 For 1/3 of the test cases, N=5000, Q=400000. For 1/3 of the test cases, N=10000, Q=300000. For 1/3 of the test cases, N=100000, Q=100000. 很极限就对了.难道是我常数太大了?那也不至于只对\(3\…
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,分别表示树的结点个数.操作个数…
传送门 不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献 于是这就变成了一个路径修改 那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做路径修改,然后再把权值取回来就行了 几个注意点: 1.记得路径修改的时候$LCA$是不需要改的 2.区间修改要打标记,统计答案之前先把标记全都放掉 3.一个小技巧就是把边从2开始存,这样双向边标号就分别是$(2,3),(4,5)...$,于是每一条双向边的标号除以二都是唯一的,就可以唯一的表示出来…
https://www.luogu.org/problem/show?pid=3384#sub 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之…
Code: #include <map> #include <cstdio> #include <algorithm> #include <cstring> #include <string> using namespace std; void setIO(string a){ freopen((a+".in").c_str(),"r",stdin); freopen((a+".out"…
题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ],to[N<<],tim,top[N],fa[N],siz[…
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心,处理过重心的所有路径.然而,路径端点在同一子树(即路径实际上并不过重心)的情况会发生重复计数,需要使用类似容斥的方法,不断删去重复计数的部分.• B:采用类似树形背包的思路,遍历子树时,只考虑当前子树和先前处理完的多颗子树之间的路径,以保证路径端点在不同的子树中,防止重复计数,不需要麻烦的容斥.在一…
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>   #define rep( i , n ) for( int i = 0 ; i &l…