
数据结构
Apale_7
这个作者很懒,什么都没留下…
展开
-
HDU6356 Glad You Came(线段树区间更新+剪枝)
题意: 有一个长度为n的数组a,初值均为0,有m组修改,由题目给的一个随机函数生成l, r, v,把a在区间 [ l , r ] 中小于v的值修改为v,最终输出 ⨁ni=1⨁i=1n\bigoplus_{i=1}^n aiaia_i*iii (对a1a1a_1到anana_n求异或和)思路: 先把l r v全都弄出来,维护每个区间a的最大值和最小值。 在update的时候,如果mina...原创 2018-08-09 00:50:08 · 396 阅读 · 0 评论 -
poj 3468 (splay)
最近在学splay,就用这道题来记一下模板。splay是二叉搜索树,满足中序遍历有序的性质;同时,splay操作可以在不改变中序序列的前提下改变树的结构。因此,splay可以十分方便地维护区间信息。#include<cstdio>using namespace std;const int maxn = 1e5 + 5;typedef long long ll;int...原创 2018-08-27 14:17:44 · 331 阅读 · 0 评论 -
线段树 标记永久化
先放着#include&lt;cstdio&gt;#include&lt;cstring&gt;using namespace std;#define lson l,m,rt&lt;&lt;1#define rson m+1,r,rt&lt;&lt;1|1const int maxn = 100000+10;typedef long long ll;ll t[ma原创 2018-08-27 20:23:36 · 3947 阅读 · 1 评论 -
Treap(旋转) bzoj3224普通平衡树
Treap = Tree + heap,Tree是BST,即同时维护二叉查找树和堆的性质 Treap的定义:int ch[maxn][2], val[maxn], siz[maxn], num[maxn], pri[maxn];//此处优先级用了小根堆int tot, rt;#define ls ch[now][0]#define rs ch[now][1]ch数组存的是左右孩子节...原创 2018-09-05 23:29:01 · 267 阅读 · 0 评论 -
Splay bzoj3223文艺平衡树
Splay,中文名伸展树,是由tarjan大神发明的… orz 本质上就是BST加上splay操作——把结点x旋转到指定结点的下面。 每次查询完都把查到的数旋转到根,就可以让所有查找的时间效率为均摊O(logN) (不知道为啥…大佬说是就是吧orz)因为Splay可以通过伸展操作随意改变树的结构,只要把排名L-1的结点伸展到根,把排名R+1的结点伸展到根的右孩子,R+1结点的左子树就包含了...原创 2018-09-06 19:52:00 · 400 阅读 · 0 评论 -
Jiu Yuan Wants to Ea 2018icpc焦作网络预选赛E
题目链接:https://nanti.jisuanke.com/t/31714 题意 :一棵树,n个点,初值均为0,有四个操作: 1 u v x 把u v路径上所有点乘以x 2 u v x 把u v路径上所有点加上x 3 u v 把u v路径上所有点的值按位取反 4 u v 查询u v路径上所有点的和 答案 % 2642642^{64}后输出分析: 除了3,1 2 4...原创 2018-09-17 15:53:08 · 264 阅读 · 0 评论 -
Gym - 101908L 树链剖分裸题
VJ的链接:https://cn.vjudge.net/problem/Gym-101908L题目大意:一棵nnn个点的树上,查询aaa ~ bbb,ccc ~ ddd两段路径公共的点的个数。解题思路:读完题就感觉是LCA的裸题呀…把每个点的值初始化为000,对于每次询问,把aaa ~ bbb这条路径的值+1+1+1,查询ccc ~ ddd的区间和,再把aaa ~ bbb这条路径的值−1...原创 2018-10-18 17:49:43 · 433 阅读 · 2 评论 -
HDU4027 (线段树简单题)
vj的题目链接:https://cn.vjudge.net/problem/HDU-4027题目大意:对一个n个数的序列进行两种操作:1、将某个区间的每个数开方。2、查询某个区间中所有数的和解题思路:区间修改、查询的问题显然是用线段树来来维护了。这题是不能用延迟标记来完成区间修改的,因为先求和再开方与先每个数开方再求和的结果是不同的。于是对于一次区间更新的操作,只能将每个点单点更新,但这样的时...原创 2018-12-13 23:13:14 · 442 阅读 · 0 评论 -
2019广工校赛 D-免费送气球 (HDU6464)
直接上平衡树乱搞。也可以离散化后线段树维护子树大小和区间和(平衡树不用离散化)#include &lt;cstdio&gt;#include &lt;algorithm&gt;#include &lt;cstdlib&gt;using namespace std;typedef long long ll;const ll maxn = 200005;const ll mod原创 2019-03-17 20:21:28 · 398 阅读 · 0 评论 -
树状数组区间更新板子
存一个树状数组区间更新的板子ll c1[maxn];//c1维护差分数组的前缀和ll c2[maxn], a[maxn];//c2维护c1 * (pos - 1)的前缀和//a[i]的前缀和[1, p]可以由c1[1,2,...,p] * p - c2[1,2,...,p]表示int n;inline int lowbit(int x){ return x & (-x)...原创 2019-04-15 00:23:49 · 240 阅读 · 0 评论 -
ST表板子
存一个ST表板子可用于维护静态区间最值和gcd以后的代码左花括号不会另起一行。(让两个队友舒服点o(╥﹏╥)o)int dp[maxn][30];void init() { for (int j=1; j<=20; ++j) for (int i=1; i + (1 << j) - 1 <= n; ++i) dp[i][j] = __gcd(dp[i]...原创 2019-04-17 22:01:36 · 276 阅读 · 1 评论 -
LightOJ 1339 Strongest Community
题意查询[L,R][L, R][L,R]中连续出现次数最多的数出现的次数,如[1,1,2,2,2,2,3,3,3][1,1,2,2,2,2,3,3,3][1,1,2,2,2,2,3,3,3]中连续出现次数最多的是2,次数为4思路这题显然可以直接线段树区间合并。用线段树维护区间的前缀中的答案(答案指区间中连续出现次数最多的数出现的次数)、后缀中的答案。设m=L+R>&...原创 2019-05-18 23:51:48 · 221 阅读 · 0 评论 -
HDU6315 Naive Operations (2018多校第二场) 线段树
题目链接: hdu6315 题目大意: 输入一个n,下一行输入一个长度为n的数组b,b是1到n的一种全排列,还有一个长度为n初值全为0的数组a 两种操作: 1) 输入add l r ,将alala_l到arara_r的数字全都 +1 2) 输入 query l r,查询 ∑ri=l∑i=lr\su...原创 2018-07-26 11:20:51 · 258 阅读 · 0 评论 -
树剖模板(点权)(洛谷P3384)
#include<bits/stdc++.h>using namespace std;const int maxn = 100000+10;int N,M,R,P,w[maxn];struct{ int to,next; }e[maxn<<1];int head[maxn],edgeNum;void add(int u,int v){ ...原创 2018-07-24 23:51:39 · 308 阅读 · 0 评论 -
字典树模板(链式)
struct Node{ int cnt; Node *next[26]; bool exist; Node() { cnt = 0; memset(next,0,sizeof(next)); exist = false; } }*rt;//要在主函数第一行写上 rt = new Node; ...原创 2018-03-30 00:37:43 · 266 阅读 · 0 评论 -
线段树模板(POJ3468)
#include<stdio.h>#include<cstring>#include<iostream>using namespace std;typedef long long ll;ll t[100005<<2],lazy[100005<<2],a[100005];void pushup(int rt){ t[...原创 2018-03-28 12:39:20 · 298 阅读 · 1 评论 -
zoj1610- Count the Colors(线段树区间染色覆盖问题)
Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones. Your task is counting the segments of different colors you can see at last.Inp...原创 2018-05-10 11:10:00 · 284 阅读 · 2 评论 -
根据二叉树的先序遍历和中序遍历序列建树
思路:先序序列的每个元素代表一个根节点,这个元素在中序序列中左边的部分就是它的左子树,右边部分就是它的右子树代码如下(求树深度的部分是多余的):#include<iostream>using namespace std;int N;string xian,zhong;struct node{ char data; int d; node ...原创 2018-05-14 16:29:08 · 551 阅读 · 0 评论 -
线段树模板(新)
#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define pushup(rt) t[rt] = t[rt<<1] + t[rt<<1|1];const int maxn = 100000+10;typedef long long ll;ll t[maxn<<2],lazy[m...原创 2018-05-16 17:18:34 · 215 阅读 · 0 评论 -
堆排序
今天课上学的堆排序。#include<bits/stdc++.h>using namespace std;void HeapAdjust(int a[],int i,int len){ if(i>len/2)//大于len/2的是叶子结点,不用调整 return ; int m = i; if((i<<1)&l...原创 2018-06-22 22:18:07 · 206 阅读 · 0 评论 -
主席树模板(POJ2104)
离散化: 对数组排完序后用unique去重,unique返回的是去重后的数组的末地址,减去第一个元素的地址就能得到去重后的数组大小,用lower_bound查找原数字在排序去重后的序列中的位序,用位序代替数字完成离散化。#include&amp;lt;cstdio&amp;gt;#include&amp;lt;algorithm&amp;gt;using namespace std;#define lson ..原创 2018-07-09 13:48:15 · 234 阅读 · 0 评论 -
HDU3974 Assign the task(dfs序+线段树)
老板与员工之间是树形关系。每次给一个员工下达任务就是修改这个员工为根的子树。 用dfs序把每一棵子树转化成一个区间,用线段树维护,T就是区间更新维护lazy,C就是单点查询。#include <bits/stdc++.h>using namespace std;const int maxn = 50005;int T,N,M,u,v,L[maxn<<2],R[m...原创 2018-07-09 19:53:15 · 159 阅读 · 0 评论 -
SPOJ3267 D-query(可持久化线段树)
题意: 输入N个数字,查询区间[L,R]中有多少个不同的数字(第i个数字为a[i])思路:要维护的是不同的数字的数量,所以每个数只记最后出现的那一次。对N个位置每个位置建一棵线段树,线段树维护的是插入a[i]后树上各区间数字的数量。如果a[i]这个数字在前面被插入过,就在新建的树中把 包含a[i]的上一个位置的 所有区间 的 值-1,然后再照常插入a[i],因此要用一个数组几下a[i]上次...原创 2018-07-18 20:37:23 · 388 阅读 · 0 评论 -
HDU2852 KiKi's K-Number (权值线段树求第k大)
题意:三种操作,0 e 表示插入一个数字e,1 e 表示删除一个数字e,2 e k 表示查询比e大的第k个数,删除和查询均可能没有目标。思路:建一棵权值线段树,维护每个数字区间中数字的数量。 查询时,先查出1到e的数字数量n,然后查询第k+n大。#include<cstdio>#include<cstring>using namespace std;#de...原创 2018-07-18 20:44:20 · 362 阅读 · 0 评论 -
POJ3667(线段树区间合并)
#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cstring&gt;using namespace std;#define lson l,m,rt&lt;&lt;1#define rson m+1,r,rt&lt;&lt;1|1const int maxn = 50原创 2018-07-06 23:16:28 · 206 阅读 · 0 评论 -
哈夫曼树的构造、编码和解码
被问了一天哈夫曼树=_=于是迫不得已敲了一个…首先是读字符,统计文章中n种字符每种出现的次数,然后降序排序。然后把出现次数作为权值,建立n个叶子结点。把所有叶子结点插入小根堆中,每次取出两个,用二者权值之和构造新的节点,作为这二者的父亲节点,最后一个点作为根,记录下来。虽然树是自底向上建的,但实际使用的时候只用从根往下跑,所以不必记录父节点。数建完跑dfs就能得到所有叶子结点的huffm...原创 2019-06-01 20:33:50 · 1930 阅读 · 0 评论