树
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2) E题
题意是 给你 个长度为 n的 数组 找到 子区间 l ~ r 使用1个操作 ai - 1 ai +1 - 1使得 所有子区间元素变为 0 的个数 方法一: 考虑如何让子区间变为0 那肯定是 从左到右不停减去自身 使得最后一个元素 为 0 既 al - al + 1 <= 0 al + 1 - al - al + 2 <= 0 直到最后一个为0即可 我们只需要找到 第一个 > 0的位置并且 找到 0的个数就行 所以我们考虑维护 维护一个B数组上述1 ~ n的前缀 若我们要使 l为第一个位原创 2021-11-18 14:18:52 · 336 阅读 · 0 评论 -
牛客2021年国集 第7场第4题和CF 1602E 思维+线段树
牛客题目 牛客题意是 给出 1 ~ n其中 n / 2个偶数 的序列 然后插入 1~n n/2个奇数 问最小逆序对 首先我们能想到 插入的数对 已经在原序列的数 是没有影响的 每当插入一个点时 逆序对增多的数量就是前面比他大的个数 和后面比他小的个数 这样 可以发现 我们插入 一定是从小到大 从左到右插入 这样后面插入的数 对已经插入的数 也是没有影响了的 我们只需要贪心插入即可 只要找到每个插入的最小影响值即可 我们可以想每当 插入 1 于数组 和插入 2于数组 会对数组产生 什么影响 是不是 若 把原创 2021-10-26 20:35:48 · 150 阅读 · 0 评论 -
最小生成树prim 求得 树上两点之间的最大最小值
#include<iostream> #include<cmath> #include<cstring> using namespace std; const int N = 1010,M = N * 2; int head[N],to[M],last[M];double w[M];int cnt; void add(int a,int b,double c){ to[++cnt] = b; w[cnt] = c; last[cnt] = h原创 2021-09-27 20:27:49 · 153 阅读 · 0 评论 -
51nod1656 合并trie树
给每个子树存一个 size 因为 我们只需要每个字符出现一次 所以如果x 或者 y一个没有的话才能返回 不然的话 就会重复 #include<iostream> #include<cstring> #define x first #define y second using namespace std; const int N = (3e5 + 10) * 2,M = N * 2; typedef pair<int,int> PII; typedef long lo原创 2021-09-15 22:13:55 · 234 阅读 · 0 评论 -
牛客练习赛88 D 克鲁斯卡尔重构树
首先题目要求我们找的是 最小生成树上路径的最大值 倘若我们用普通的树上 lca去寻找的话 是需要logn级别去查询的 但是询问有1e7 所以我们考虑别的方法 思考到克鲁斯卡尔重构树 边权值小的在最下面 边权值大的在最上面 所以我们 可以使用lca o1查询 直接查询到 最大边权 #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define x first #..原创 2021-09-15 12:17:49 · 114 阅读 · 0 评论 -
51nod 1830
所以只需要用线段树合并一下就好了 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define x first #define y second using namespace std; const int N = 5e5 + 10,M = N * 2; typedef long long ll; typedef pair<int,int>..原创 2021-09-02 16:06:46 · 75 阅读 · 0 评论 -
Mynavi Programming Contest 2021(AtCoder Beginner Contest 201) E - Xor Distances
题目大意是让你求 dist(i,j) 1 <= i < j <= n dist(i,j)为一条路径 i ~ j所有权值的异或和 我们首先将 一个点 到其他所有点的 异或求出来 就可以将题目转换为 dist(i) ^ dist(j) 1 <= i < j <= n 这个是n^2的 超时考虑如何优化 看了题解 才知道 只需要求 每一位的 贡献值 即可 若 第k位是 有贡献的 那么 dist(i)的第k位 和 dist(j)的第k位 一定是不同的 所以只需要计算出 i 位原创 2021-05-20 16:01:04 · 162 阅读 · 0 评论 -
Codeforces Round #720 (Div. 2) D
比赛的时候 少考虑一种情况 。。还是欠考虑了这种题 如果有直链的话 把多于1个的直链 连到 这个直链上就行 有分支的话 那么把这个分支 的末端连向 这个直链的末端 即可 所以我们只需要返回一个末端值就可以了 如果返回的末端值是 -1 就定义他为一个有分支的分支 那么我们直接将这个分支的左末端连向直链 右末端可以作为新直链的末端 还有如果分支里面有 > 3个的分支话 必须把 一个分支 直接断开 连向直链 然后再把这个剩下的两个分支 连到新的直链里面去 #include<iostream>原创 2021-05-08 12:08:45 · 349 阅读 · 2 评论