![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构相关
文章平均质量分 61
BroDrinkWater
来来来交个朋友
展开
-
线段树的应用
线段树在信息学竞赛中是一种十分优秀的数据结构,具有维护区间信息,查询等操作,更有区间合并的种种的巧妙地性质,除了递归常数外,其复杂度是稳定在loglog 的。 蒟蒻初来乍到YL信息组的时候lg就开始教我们线段树,zkw线段树,主席树,划分树等神树,当时语言都没完全掌握好,自然听起来一头雾水。所以本人负责的建议,线段树学习还是在掌握好搜索和递归之后再来学,不然只能理解个大概,许多细节会理解不了,题目原创 2017-08-26 22:48:58 · 2147 阅读 · 1 评论 -
Trie
今晚花了点时间研究了这谜一般的代码。。。。#include#include#include#includeusing namespace std;const int charset=26,base='a',max_node=100000;//charset 为字符集大小//base 为字符集ASCII最小字符//max_node为最大点数struct Trie{ i原创 2016-12-19 22:22:22 · 376 阅读 · 0 评论 -
精华版线段树模板
哈哈哈,打了一上午。。。#include#include#include#include#include#includeusing namespace std;typedef long long ll;ll a[100000+10];ll lazy[1000000];struct T{ ll lt,rt; ll sum,mx,mn;}tr[400000+10];inl原创 2016-11-18 12:13:18 · 1064 阅读 · 0 评论 -
划分树
转自大神的详解: http://www.2cto.com/kf/201210/160552.html用划分树来解决选定区间内的第K大值,其实也就两步!一步是建树,另一步则是查询。 先说我对建树的理解吧! 建树的过程很简单:两步就OK了! 第一步:找到序列的中位数,把大于中位数的扔到中位数的左边,小于中位数的扔到数的右边。这样整个序列就被分成了两个区间。转载 2016-08-27 15:35:29 · 660 阅读 · 0 评论 -
usaco第二题稍微有点难。。。结构体就ac
#include#include#include#includeusing namespace std;struct student{//定义一个结构体,存人名和钱数; string s; int my;}a[12];int main(){ int i,j,k,m,n; scanf("%d",&n); for(i=1;i<=n;i++)原创 2016-08-27 14:12:38 · 556 阅读 · 0 评论 -
usaco 第一题(水题,不多说了)
/* ID:brodrn1 LANG:c PROG:ride*/#include#include#include#includeusing namespace std;char s[10],a[10];int main(){ int i,j,k,m,n; gets(s); gets(a); int len1=strlen(s); int len2=str原创 2016-08-27 13:37:07 · 920 阅读 · 0 评论 -
qsort
#include#include#include#includeusing namespace std;const int maxn=10010;int a[maxn];void qsort(int b,int e){//用两个指针来模拟快排 int u=b,v=e; int p=a[b];//将其作为模板 if(u>v)return ; while(原创 2016-08-26 21:15:37 · 990 阅读 · 0 评论 -
堆排序(用了好多的位运算)
#include#include#include#include#includeusing namespace std;const int maxn=10000;int a[maxn];int main(){ int i,j,k,m=0,n,t; scanf("%d",&n); int top=1;//模拟堆顶 for(i=原创 2016-08-26 21:01:22 · 603 阅读 · 0 评论 -
HNOI2005狡猾的商人
传送门 题目意思很简单,意思是说给你一些区间和,要你判断这些区间和是否合法。 开始只想到了差分约束的方法,就是搞成前缀和的形式 sum[r]−sum[l−1]>=wsum[r] - sum[l-1] >= w 且 sum[r]−sum[l−1]<=wsum[r]-sum[l-1] <= w这样利用SPFA建图,利用三角形不等式,即dis[v] > dis[x] + w[i],每个条件建出sum原创 2017-09-30 23:35:07 · 437 阅读 · 0 评论 -
Trie非指针版
#include#include#include#includeusing namespace std;struct Trie{ int child[10000][26]; int val[10000]; int size; void init(){ memset(child[1],0,sizeof(child[1])); size=1; } void insert(原创 2016-12-20 21:50:09 · 437 阅读 · 0 评论 -
排序二叉树
#include#include#include#includeusing namespace std;int key[10000],flag=0,root=-1;int l[10000],r[10000];void insert(int in,int x){ if(x<=key[in]){ if(l[in]==-1)l[in]=flag; else insert(l[in原创 2016-12-23 22:18:59 · 449 阅读 · 0 评论 -
二叉堆(插入,删除)
#include#include#include#includeusing namespace std;int heap[100000],len;void up(){ int k=len; while(k>1){ if(heap[k]>1])swap(heap[k],heap[k>>1]); k>>=1; }}void down(int n){ while(n<<1原创 2016-12-24 11:16:57 · 499 阅读 · 0 评论 -
关于树状数组
树状数组是一种十分优秀的数据结构,拥有常数非常小的特点,好写好调,在一些应用上比线段树要优秀许多。下面我来介绍下树状数组(基础知识请看蓝书或其他神犇的blog,蒟蒻在这里就不多提了)。区间修改&&区间查询 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和这里要引入差分数组这种东西,我们记d[i] = a[i] - a[i-1](a为原原创 2017-06-13 16:28:30 · 402 阅读 · 2 评论 -
树链剖分模板题
P3384 【模板】树链剖分129通过534提交题目提供者HansBug标签 难度 省选/NOI-最新讨论树剖和表情包有什么微妙的关…后三个点mle。没有动态开点题目描述如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:操作1: 格式: 1 x y z 表示将树从x原创 2017-01-19 21:15:53 · 410 阅读 · 0 评论 -
Bounce(弹走绵羊)lct裸题
Bounce(弹走绵羊)某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得原创 2017-01-16 15:18:03 · 418 阅读 · 0 评论 -
树链剖分
以下是转的别人的(后有模板)这几天学习了一下树链剖分,顺便写一下我的理解、早上看了一下别人的讲解,云里雾里,终于算是搞懂了、树链剖分是解决在树上进行插点问线,插线问点等一系列树上的问题假如现在给你一棵树,然后没两条边之间有一条权值,有一些操作,1:x---y之间的最大权值是多少,2:改变x---y之间的权值当前这样的操作有很多,如果直接用暴力的方法的原创 2017-01-15 16:29:24 · 386 阅读 · 0 评论 -
Splay tree
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x,v,sizeof(x));#define INF 0x3f3f3f3f#define原创 2017-01-15 09:41:29 · 354 阅读 · 0 评论 -
Treap
#include#include#include#includeusing namespace std;struct T{ int l,r,f; int w,z;}a[100000+10];int root,cnt;void r_rot(int x,int y){ int t=a[y].f; a[y].l=a[x].r; a[a[x].r].f=y; a[x].r=y;原创 2017-01-13 17:31:58 · 361 阅读 · 0 评论 -
LAZY_TAG
#include#include#include#includeusing namespace std;const int maxn=100000+10;typedef long long ll;ll a[maxn];ll tree[maxn<<2];ll lazy[maxn<<2];void build(ll h,ll l,ll r){ if(l==r){ tree[h原创 2017-01-13 15:27:15 · 507 阅读 · 0 评论 -
LCA(st算法)
#include#include#include#include#include#define maxn 500000using namespace std;int dp[1001000][20];int to[maxn*2],be[maxn*2],ne[2*maxn],e;int deep[maxn*2],first[2*maxn],cnt,n;bool p[maxn];v原创 2016-12-24 17:14:24 · 401 阅读 · 0 评论 -
关于二维矩阵的最大最小值的询问
今天考了这样子的一道题目,考试的时候yy出了二维RMQ的做法,调了半天,考完后,想了想二维线段树的做法,感觉很好想的,只是把一维线段树改一改。二维RMQ处理出dp[i][j][l][r]dp[i][j][l][r]表示i往前2l2^l,j往前2r2^r的矩阵的最大值和最小值,首先是dp[i][j][0][0]dp[i][j][0][0]=原数值,然后每次枚举l,r然后枚举i,j就好了。像一维前缀和那原创 2017-10-24 20:50:38 · 922 阅读 · 0 评论