6、多表操作 有两张表想要一起查询 select * from dep,emp; # 结果 笛卡尔积,不可用 拼表操作 对应的方法 inner join 内连接 left join 左连接 right join 右连接 union 全连接 # inner join 内连接 select * from emp inner join dep on emp.dep_id = dep.id; # 只拼
\(\text{Solution}\) 点分树就是将点分治过程中的重心连成一棵虚树 对点分树子树信息的记录,就是点分治处理每个重心时需要的信息 这样就可以留下点分治的过程,支持多次修改和查询 点分树树高 \(O(log n)\) 且 \(\sum size_x = O(n \log n)\) 可以使用很多暴力的手段 但要注意:点分树
8.2 刷题日记 P6591 [YsOI2020]植树 换根法,处理子树大小,然后看子树大小一不一样就行。 #include<bits/stdc++.h> #define INF 0x3f3f3f3f #define debug cout<<"Szt ak ioi\n"; //#define int long long const int Mod=1e9+7; const int N=1e6+7,M=2e3+1; using namespace std;
是我太菜了 加上补提也才三个题 A Ancestor 题目主要是让我们求长度为k-1的点集的最近公共祖先(一个点被删了) 方法一用到结论 我们只用取这些点中dfs序最小和最大的两个点来求最近公共祖先就行。 方法二可以维护一个前缀和后缀lca数组 每次删除该点 相当于是求lca(pre[i-1],suf[i+1
树上莫队和二次离线莫队都比较难,所以只讲几个模板(明明是你太懒了)。 树上莫队 我们之前处理的问题都是在数列上的,如果换成树,怎么办呢?下面这题给出了一个常用的方法。 SP10707 COT2 - Count on a tree II 洛谷传送门 给定一棵点带权的树,静态询问每两个节点之间(包括端点)路径上的不同
题目简化和分析: 明确一点这是一棵树。 为了保证每个工业城市的设置效益最大,应该设在最深的节点。 从深到浅,可以使用优先队列去实现。 设置一个的价值为 \(dep_u-siz_u-1\)。 关于作者一开始想反了,设置旅游城市,虽然可以做,但非常麻烦,于是看了别人大佬思路才明白。 错误原因在于,有可
A. 暗之链锁 树剖维护一下即可,其实树上差分也可 注意线段树空间开四倍!!!!!!!!!! 左移\(2\) code #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; inline int read(){ int x = 0; char c = getchar(); while(c <
Description 给定两个 \(0 \sim (n - 1)\) 的排列 \(\{p_0, p_1, \ldots , p_{n - 1}\}\) 和 \(\{q_0, q_1, \ldots , q_{n - 1}\}\),要求构造两个 \(0 \sim (n - 1)\) 的排列 \(\{A_0, A_1, \ldots , A_{n - 1}\}\) 和 \(\{B_0, B_1, \ldots , B_{n - 1}\}\),且必须满足:
Problem - 7150 Static Query on Tree 题意: 给定一棵以1为根的有向树,\(q\) 次询问,每次询问给出三个集合 \(A,B,C\) 问树中满足都可以由集合 \(A, B\) 中各自至少一个点走到的,自身也可以走到 \(C\) 集合中至少一个点的点的个数。 有一个比较显然的树链剖分写法,这里说的是虚树写法,其
外键约束 -- 创建表 CREATE TABLE emp( id int PRIMARY KEY auto_increment, name varchar(30), age INT, dep_name VARCHAR(30), dep_location VARCHAR(30) ); -- 添加数据 INSERT INTO emp (NAME,age,dep_name,dep_location) VALUES ('张三',20,
CF 传送门:CF1320E 虚树 + dijkstra。 解法来自 @hs_black。 Solution 1 发现 \(m\) 的总和与 \(n\) 同级。又因为每次询问只涉及到少数节点,故知道使用虚树去优化。 建虚树优化什么?动态规划似乎不太可做,而病毒感染的过程有些像最短路。 最短路,使用 \(\text{spfa}\)?但 \(\text{spfa}
目录 \(standard\_table\) : 欧拉序 + \(ST\) 表 \(multiplication\) : 倍增 \(tree_chain_subdivision\) : 树链剖分 #include<bits/stdc++.h> using namespace std; const int N=5e5+5; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(c
\(1.Multiplication\) \(2.Treediv\) \(3.Euler+ST\) #include <bits/stdc++.h> using namespace std; const int N = 5e5 + 5; int n, m, S; vector <int> Link[N]; namespace solve1 { int f[N][25], dep[N]; void dfs(int u, int Fa) {
Solution 在此提供一种可能相对其他解法较为好写的做法。 一 首先考虑一棵如下图的树,其中 \(rtlr_0=6,\ rtlr_1=5\)。 发现此时这棵树不考虑根节点只有两条链,而左右链的末尾分别是 \(rtlr_0\) 和 \(rtlr_1\)。 同时,按照套路,我们将 \(dist(i,j) \leq r_i+r_j\) 化为 \(dist(i, l)-
单源最短路径 使用“堆优化的”dijkstra 算法,每次对刚刚加入的点进行一次拓展,然后找出 dis 里面最大的一个。 时间复杂度:\(O((|V|+|E|) \log |V|)\),其中每一条边最多只会查找两次,优先队列的操作是每次 \(O(\log n)\) 的,一共 \(O(n\log n)\)。反正知道是 log 的就行。 板子: #includ
目录概述基本概念预处理操作dfs1dfs2具体处理问题1.LCA问题P3379 【模板】最近公共祖先(LCA)Game2:简单树上问题P4281 [AHOI2008] 紧急集合 / 聚会P5903 【模板】树上 k 级祖先2.单点修改,链上求值P2590 [ZJOI2008]树的统计 概述 树链剖分(轻重链剖分)是一个将树上问题转换为序列上问题
取$T=S_{i}$,不断删除其任意子串$\in \{S_{j}\mid i\ne j\}$,最终应有$T\in \{S_{i},\empty\}$ 关于该过程的实现,考虑建立AC自动机,并从前往后依次加入字符 若当前节点存在后缀为某子串,则删去该后缀,并跳到剩余部分对应位置 若$T=\empty$,则删除$S_{i}$可以以该过程代替,不妨去掉$S_{i
2022.7.17 模拟赛 \(\to link \leftarrow\) 订货 简单题,但为什么 \(1\le n\le 2\times 10^6\) 的数据我 \(n\log n\) 做法会 \(T\) ? 我不理解 模糊匹配 模拟题 国境线 \(std\) 貌似锅了,直接把 \(std\) 交上去了 来自某同学的一句话:\(\color{Green}{\Huge{我跟\ std\ 锅都锅的一样}
#include <bits/stdc++.h> using namespace std; const int N = 5e5 +5; int h[N],ne[N<<1],e[N<<1],fa[N<<1][22],lg[N<<1],dep[N],idx,n,m,s; inline void add(int x,int y){e[++idx] = y,ne[idx] = h[x];h[x] = idx;} void dfs(int u,int
A 树剖求lca 板子 C 一道树剖板子题 D 树剖题单里混进了一个奇怪的东西 根号分治 对于跳的步长大于sqrt(n),我们直接暴力跳就行了 而步长小于时维护从某点一直以某一步长跳到根的和,然后使用差分求得答案。 点击查看代码 #include<bits/stdc++.h> #define M 50005 #define N 250 us
题意: 给定一个无向连通图,你需要解决以下两个问题之一: 1364D: 找出一个大小为 \(\lceil \frac k2\rceil\) 的独立点集 找出一个大小不超过 \(k\) 的环 1325F: 找出一个大小为 \(\lceil \sqrt n\rceil\) 的独立点集 找出一个不小于 \(\lceil \sqrt n\rceil\) 的环 独立点集中,
拿来存一下lca模板,想知道原理的话出门洛谷~ #include<bits/stdc++.h> using namespace std; const int maxn=500007; int cnt=0,head[maxn],fa[maxn][40],dep[maxn],lg[maxn]; struct lys{ int from,to,nex; }e[maxn*2]; void add(int from,int to){ cnt++; e[cnt
咕咕咕咕。 E. Split Into Two Sets 题意 有\(n\)张牌,每张牌上写有两个数字,问是否能将牌分成两个集合,使得单个集合中的牌上的数字构成的集合没有重复元素。 其中\(2 \le n \le 2 \times{10}^5\)。 思路 转化成图论问题,令每个数字对应一个节点,问题从将牌分成两个集合转换成将数
A 直接模拟即可,注意 \(10^k\) 的情况(罚时!罚时!罚时!). A Code using namespace std; typedef long long ll; typedef pair<int, int> pii; ll n; int main() { int T; scanf("%d", &T); while (T--) { scanf("%lld", &n); ll t = n; ll x = 1;
洛谷题面传送门 简单分块题,可惜卡了一年的常( 道理很明显,碰到这种不可 polylog 维护的题肯定需要分块,弱化版可见 P3591 POI2015 ODW。而此题又涉及开根号,那又一个一眼的套路:segment beats,这样做法就出来了:设阈值 \(B\),然后。 对于 \(k>B\),查询修改都暴力。 对于 \(k\le B\),我们先