数据结构
Bzdhxs_nt
这个作者很懒,什么都没留下…
展开
-
G. Count the Trains && 楼房重建 线段树区间合并
线段树区间合并转载 2022-06-09 02:16:12 · 213 阅读 · 0 评论 -
D. Optimal Partition 线段树优化dp
题目link 参考 思路 考虑 f[i]f[i]f[i] 为以iii结尾的最大价值 ,s[i]s[i]s[i] a[]a[ ]a[] 的前缀和数组 那么容易想到 f[i]=max(f[i],f[j]+s[i]−s[j])j∈[0,i);f[i] = max(f[i],f[j] + s[i]-s[j]) j \in [0,i);f[i]=max(f[i],f[j]+s[i]−s[j])j∈[0,i); O(n2)O(n^2)O(n2) 的复杂度 考虑优化 上式可转化为 f[i]={f[j]−j+i,s[i原创 2022-04-20 12:42:08 · 603 阅读 · 3 评论 -
C 实现二叉树的三种遍历方式
二叉树的三种遍历方式: 前序遍历:根 -> 左儿 -> 右儿 中序遍历: 左儿 -> 根 -> 右儿 后序遍历:左儿 -> 右儿 -> 根 //前序遍历 int r[];// 结点 void build(){...} void dfs(int u){ cout << r[u] << endl; if(r[u<<1]) dfs(u<<1); if(r[u<<1|1]) dfs(u<<1|原创 2021-11-01 11:34:04 · 184 阅读 · 0 评论 -
并查集(union-find disjoint sets)板子
并查集核心代码 //find 函数 int pre[x] // 维护祖宗节点; int d[x]// x 到pre[x]的权值; int find(int x){ return x == pre[x]?:x:pre[x] == find(pre[x]); } //带权并查集find函数 int find(int x){ if(x != pre[x]){ int u = find(pre[x]); d[x] += d[p[x]]; //d[x]的初始化根据题意,经典例题:食物链; p[x] =原创 2021-08-21 15:13:46 · 84 阅读 · 0 评论 -
Trie树模板
Template Trie树 //@yxc int son[N][26]; int cnt[N],idx; void insert(char *str) { int p = 0; for(int i = 0;str[i];i++){ int u = str[i] - 'a'; if(!son[p][u]) son[p][u] = ++idx; p = son[p][u]; } cnt[p]++; } //查询字符串出现的次数 int query(char *str){ int p原创 2021-08-04 16:47:37 · 153 阅读 · 0 评论 -
对顶堆模板
Template 一.求中位数; priority_queue<int> h// 大根堆; priority_queue<int,vector<int>,greater<int>> g//小根堆; void insert(int x)//对顶堆求中位数模板 { if(!h.size()||x <= h.top()) h.push(x); else g.push(x); //对弹 if(g.size()>h.size()+1) h.push原创 2021-07-22 19:12:04 · 120 阅读 · 0 评论 -
单调栈模板
Template // @yxc 单调栈模板 int h[N];//存初始数据; int stk[N];//模拟stack // 从左往右扫一遍; // 栈内存下标/值,栈存下标就要更具题意注意边界的初始化问题; //处理右边从右往左扫一遍; int tt = 0;//栈指针; for(int i = 1; i <= n;i++){ while(tt && h[stk[tt]] >= h[i]) tt--; //单调递增栈 // q[tt] 就是左边第一个比h[i]小的元素原创 2021-07-21 20:06:33 · 98 阅读 · 0 评论