![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Aurora141592
这个作者很懒,什么都没留下…
展开
-
洛谷 – P3379 -【模板】最近公共祖先(树链剖分)
https://www.luogu.org/problem/P3379这次我是用树剖写的LCA,写的比倍增简单而且还快一点。树剖一般指的是重链剖分,首先把所有节点的子节点中最大的标出来,称为重子节点,从节点到重子节点的边叫重边,一段连续的重边称为重链,其他的轻子节点叫轻链,然后把整棵树dfs一下,dfs的时候优先dfs重儿子,这样可以保证同一条重链上的点时间戳连续。这样就把一棵树剖分成了很多条链,那么就可以用数据结构维护这些链,优化时间复杂度。如果询问两个点的LCA,先判断是不是在一条链上,如果不是那原创 2021-01-14 12:36:27 · 99 阅读 · 0 评论 -
[线段树]覆盖的面积之和(扫描线)
先保存个大佬的模板然后慢慢研究。https://blog.csdn.net/xianpingping/article/details/83032798#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<原创 2021-01-06 21:10:18 · 73 阅读 · 0 评论 -
CODECHEF – Multiples of 3(线段树)
一道还是有点恶心的线段树,开三倍空间存余数为0,1,2的情况,每次update都把这三个值向后循环滚动一位,然后在pushdown函数里如果lazy[k] == 2,就向后循环滚动两位,query的时候返回a[k][0]即可。这道题的意义在于,让我发现了build函数里的返回条件不能是k >= n,必须是l == r,具体原因还未知。#include<vector>#include<queue>#include<stdio.h>#include<ma原创 2021-01-06 21:08:25 · 244 阅读 · 0 评论 -
[数据结构]CF – 567D – One-Dimensional Battle Ships(思维 + set模拟)
http://codeforces.com/contest/567/problem/Dset存储区间端点,注意是开区间,每次用lower_bound求出右端点,再把指针自减求出左端点,然后容量减去原区间容量,加上新区间容量,当总容量小于k的时候输出编号即可。int a;int cal(int l, int r){ int len = r - l + 1; if (len < a) return 0; return (len + 1) / (a + 1);}set&l原创 2021-01-05 13:19:34 · 116 阅读 · 0 评论 -
[搜索]bfs求最小变化次数
map<ll, int> ans;int f1(ll x){ if (ans[x]) return ans[x]; queue<ll> qll; qll.push(1); while (!qll.empty()){ ll t = qll.front(); qll.pop(); if (t < 1 || t > 1e18) continue; if (t == x) return ans[t原创 2021-01-04 10:44:29 · 89 阅读 · 0 评论 -
[数据结构]单调栈
https://cn.vjudge.net/contest/244153#problem/I最经典的,求最大长方形面积#include<stdio.h>#include<math.h>#include<algorithm>#include<stack>#define maxn 100005#define inf 0x3f3f3f3f#define eps 1e-6using namespace std;typedef long int ll原创 2021-01-04 10:36:12 · 57 阅读 · 0 评论 -
CF – 1042 – D. Petya and Array(前缀和 + 离散化 + 树状数组 + sort + 二分)
https://codeforces.com/contest/1042/problem/D#include<bits/stdc++.h>using namespace std;typedef long long ll;inline ll in(){ ll res=0,p=1; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') p=-1; c=getchar();} while(c>='0原创 2021-01-04 10:32:02 · 85 阅读 · 0 评论 -
[数据结构]可持久化权值线段树
求解静态区间第k大,研究完毕。http://www.51nod.com/Challenge/Problem.html#!#problemId=1175#include<bits/stdc++.h>using namespace std;const int maxn = 5e4 + 5;struct e{ int l, r, sum = 0;}tree[17 * maxn];int a[maxn], b[maxn];int cnt, root[maxn], r[maxn];原创 2020-12-31 09:55:08 · 42 阅读 · 0 评论 -
[黑科技]pb_ds库(G++)
This is a library of policy-based elementary data structures: associative containers and priority queues. It is designed for high-performance, flexibility, semantic safety, and conformance to the corresponding containers in std and std::tr1 (except for som原创 2020-12-31 09:52:36 · 449 阅读 · 1 评论 -
洛谷 – 1030 – 推二叉树遍历(递归)
知中序后序求前序#include<bits/stdc++.h>using namespace std;string a, b;void pre(string a, string b){ int t = b.size() - 1; cout << b[t]; int p = a.find(b[t]); if (p > 0) pre(a.substr(0, p), b.substr(0, p)); if (p < t) pre原创 2020-12-30 13:05:32 · 127 阅读 · 0 评论 -
[数据结构]trie
注意一下一个字符串在trie中存在不一定代表这是一个完整的单词,要用eq判断是否是一个完整的单词。这个trie是邻接表实现的,空间换时间。AC自动机会超时,需要使用邻接矩阵实现。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 200005struct node{ node() : c(0), eq(0), cnts(0) {sub.clear();} char c原创 2020-12-30 13:04:40 · 68 阅读 · 0 评论 -
洛谷 – 求区间不同数字的个数(树状数组 + 思维)
https://www.luogu.org/problemnew/show/P1972莫队TLE了,于是写了个树状数组。按右端点排序,当右端点固定下来之后,右端点之前的每个数字只用考虑最后一次出现的位置。这是因为,假设右端点之前有某个数字出现了两次,那么当左端点在第一个位置之前和两个位置之间对答案的贡献都是1,在第二个位置之后对答案贡献是0,所以每次只用考虑最后一个出现的位置。那么这道题就可以用树状数组解决,遍历一遍数组,每次都把当前位置变成1,如果这个数字在之前出现过,就把之前出现的位置变成0,最后求原创 2020-12-30 13:03:18 · 1105 阅读 · 0 评论 -
洛谷 – 逆序对个数(树状数组 + 离散化)
同时,这个数也是通过交换相邻的元素让这个序列变成不下降序列所需要的最小次数。s://www.luogu.org/problemnew/show/P1908#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 5e5 + 10, mod = 1e9 + 7;int n, bit[maxn], dis[maxn];ll a[maxn];//add只用执行+1操作void ad原创 2020-12-30 13:02:36 · 84 阅读 · 0 评论 -
[算法]莫队算法
2019.04.19:莫队算法主要的降低时间复杂度的技巧是分块,可以把询问离线然后分块做,块的大小(\sqrt n),即可。同块右端点排序,不同块左端点排序。不同题目分块之后处理的方法不同,具体题目具体分析。https://www.luogu.org/problemnew/show/P2709#include<bits/stdc++.h>#define maxn 50005using namespace std;int a[maxn], cnt[maxn];long long ans原创 2020-12-30 13:01:56 · 73 阅读 · 1 评论 -
[数据结构]树状数组
单点修改区间和查询#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 500005int n;ll a[maxn];ll query(int x){ ll sum = 0; while(x){ sum += a[x]; x -= x & -x; } return sum;}void add(int x,原创 2020-12-30 13:01:26 · 39 阅读 · 0 评论 -
[数据结构]链式前向星
实测效率并不比vector g[maxn]的邻接表好。int cnt, head[maxn];//head[i]为顶点i在g[maxn]里的位置//to为与当前顶点相邻的顶点编号,next为下一个与当前顶点相邻的顶点在g[maxn]里的位置struct e{ int next, to;}g[maxn];//其实e存的是一条边inline void add(int u,int v){ g[cnt].to = v;//第cnt条边连接到的顶点编号 g[cnt].next =原创 2020-12-30 13:00:37 · 69 阅读 · 0 评论 -
[数据结构]线段树
区间修改区间和:#include<stdio.h>#include<algorithm>#define maxn 50005using namespace std;ll a[maxn << 2], lazy[maxn << 2], n;void pushup(int k){ a[k] = a[k << 1] + a[k << 1 | 1]; }void pushdown(int k, int m){ if (la原创 2020-12-29 13:59:33 · 46 阅读 · 0 评论 -
[算法]LCA最近公共祖先(倍增法)
#include<bits/stdc++.h>const int maxn = 500010;using namespace std;vector<int> g[maxn];int par[20][maxn], dep[maxn], n, m, ml;//求每个点的深度,并初始化节点v的距离为2^0的父亲void dfs(int v, int p, int d){ par[0][v] = p; dep[v] = d; for (int i = 0; i原创 2020-12-29 13:55:29 · 87 阅读 · 0 评论 -
[数据结构]手写堆
心态爆炸了,下次好好看看范围可以不。#include<bits/stdc++.h>const int maxn = 1 << 21;using namespace std;int a[maxn], p = 1;void push(int x)//先插到最后一个位置,然后上浮{ int i = p++; while (i){ int f = i >> 1; if (a[f] <= x) break;原创 2020-12-29 13:54:48 · 86 阅读 · 0 评论 -
[数据结构]并查集
int par[maxn];int findp(int x){return par[x] < 0 ? x : par[x] = findp(par[x]);}void unite(int x, int y){ x = findp(x), y = findp(y); if (x != y){ par[x] += par[y]; par[y] = x; }}bool same(int x, int y){return findp(x) ==原创 2020-12-28 13:32:07 · 107 阅读 · 0 评论 -
[数据结构]分块专题
洛谷 – P3870 – [TJOI2009]开关https://www.luogu.org/problem/P3870这次写的就很漂亮了啊。注意一下,num是所在块的编号,便于维护整块信息(小心多定义冲突)。L数组和R数组是保存了单个位置的左右端点,不是每块的左右端点。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10, mod = 1e9 + 7;原创 2020-11-04 21:49:09 · 88 阅读 · 0 评论 -
洛谷 – P3379 -【模板】最近公共祖先(树链剖分)
https://www.luogu.org/problem/P3379这次我是用树剖写的LCA,写的比倍增简单而且还快一点。树剖一般指的是重链剖分,首先把所有节点的子节点中最大的标出来,称为重子节点,从节点到重子节点的边叫重边,一段连续的重边称为重链,其他的轻子节点叫轻链,然后把整棵树dfs一下,dfs的时候优先dfs重儿子,这样可以保证同一条重链上的点时间戳连续。这样就把一棵树剖分成了很多条链,那么就可以用数据结构维护这些链,优化时间复杂度。如果询问两个点的LCA,先判断是不是在一条链上,如果不是那原创 2020-11-04 21:24:41 · 85 阅读 · 0 评论 -
[数据结构]ST表(倍增)
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int f[100001][40],a,x,LC,n,m,p,len,l,r;int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a); f[i][原创 2020-11-04 21:25:30 · 80 阅读 · 0 评论 -
[数据结构]区间树上最远点对
树剖LCA+线段树维护区间最远点对https://www.51nod.com/Challenge/Problem.html#problemId=1766#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, int> pii;const int maxn = 1e5 + 10, mod = 1e9 + 7;struct edge{ int v, c;}原创 2020-11-04 21:25:43 · 100 阅读 · 0 评论 -
[数据结构]最近公共祖先(LCA)
https://www.luogu.org/problem/P3379这次我是用树剖写的LCA,写的比倍增简单而且还快一点。树剖一般指的是重链剖分,首先把所有节点的子节点中最大的标出来,称为重子节点,从节点到重子节点的边叫重边,一段连续的重边称为重链,其他的轻子节点叫轻链,然后把整棵树dfs一下,dfs的时候优先dfs重儿子,这样可以保证同一条重链上的点时间戳连续。这样就把一棵树剖分成了很多条链,那么就可以用数据结构维护这些链,优化时间复杂度。如果询问两个点的LCA,先判断是不是在一条链上,如果不是那原创 2020-11-04 21:25:59 · 112 阅读 · 0 评论 -
[数据结构]线段树
区间修改区间和:#include<stdio.h>#include<algorithm>#define maxn 50005using namespace std;ll a[maxn << 2], lazy[maxn << 2], n;void pushup(int k){ a[k] = a[k << 1] + a[k << 1 | 1]; }void pushdown(int k, int m){ if (la原创 2020-07-29 15:53:12 · 110 阅读 · 0 评论 -
[数据结构]01-trie
C++风格,带销毁,01-trie(字典树)。http://acm.hdu.edu.cn/showproblem.php?pid=4825#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 5;struct node{ node *son[2] = {nullptr, nullptr}; bool eq = false;}*root;void原创 2020-11-04 21:26:36 · 88 阅读 · 0 评论 -
[数据结构]可持久化权值线段树
https://www.luogu.com.cn/problem/P3834解决静态区间第k小的问题。#include<bits/stdc++.h>using namespace std;const int maxn = 2e5 + 5;int tot, n, m;int sum[maxn << 5], rt[maxn], ls[maxn << 5], rs[maxn << 5];int a[maxn], ind[maxn], len;inli原创 2020-11-04 21:26:31 · 197 阅读 · 0 评论