数据结构
sky_zdk
这个作者很懒,什么都没留下…
展开
-
数据结构之线段树
线段树是一颗完美二叉树(perfect Binary Tree),所有的叶子深度都相同并且每个节点要么是叶子要么是有2个儿子的树,树上的每个的节点都是维护一个区间。根维护的是整个区间的最小值,每个节点维护的是父亲区间二等分后的其中一个子区间中的最小值。线段树主要有2种操作:在给定数列a0,a1,a2,....an-1的情况下,1. 给定s和t,求as,as+1,.....at的最小值原创 2017-03-05 15:33:23 · 478 阅读 · 0 评论 -
LA 3525 Wild West 单调性
#include#include#includeusing namespace std;int dp[200010],a[200010],l[200010],r[200010];int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) sca原创 2017-09-09 10:46:17 · 345 阅读 · 2 评论 -
uva 1264 Binary Search Tree 计数
#include#include#define MOD 9999991 #define LL long longLL c[36][36];int ch[36][2],num[36];using namespace std;void init(){ c[0][0]=1; for(int i=1;i<=23;i++){ c[i][i]=1;c[i][0]=1; for(int原创 2017-09-09 08:09:39 · 219 阅读 · 0 评论 -
uva 11488 字典树
#include#include#includeusing namespace std;int ch[100010][2],cnt[100010],sz;int res=0;void insert(char str[]){ int len=strlen(str),cur=0; for(int i=0;i<len;i++){ int c=str[i]-'0'; if(!ch[原创 2017-09-08 14:24:00 · 213 阅读 · 0 评论 -
uva 11525 树状数组 求第k大数
#include#includeusing namespace std;int bit[50050],n;void add(int x,int v){ while(x<=n){ bit[x]+=v; x+=x&-x; }}int sum(int x){ int res=0; while(x>0){ res+=bit[x]; x-=x&-x; } retu原创 2017-09-07 21:19:04 · 327 阅读 · 0 评论 -
uva 11987 并查集
#include#include#define N 200020using namespace std;int pre[N],num[N],sum[N];int find(int x){ return pre[x]==x?x:find(pre[x]); }void merge(int x,int y,int op){ int t1=find(x); int t2=find(y)原创 2017-09-07 20:02:36 · 168 阅读 · 0 评论 -
poj 2823 单调队列 (求特定长度区间的最大最小值)
#include//注意要把数组放在主函数前面,才能开到1000010 如果放在主函数里会 running error#define MAX_N 1000010 using namespace std;int a[MAX_N],b[MAX_N],deq[MAX_N],c[MAX_N],deq1[MAX_N];int main(){ int n,k,s,t,i; scanf("%d%原创 2017-04-07 18:36:26 · 626 阅读 · 0 评论 -
poj 2559 栈的运用
#include#define max(x,y) ((x)>(y)?(x):(y))using namespace std;int main(){ int stack[100010],h[100010],L[100010],R[100010]; int n; while(~scanf("%d",&n)&&n) { int i,t; for(i=0;i<n;i++) {原创 2017-04-07 17:01:40 · 221 阅读 · 0 评论 -
LCA
//方法一 vectorG[MAX_N];//输入 图的邻接表 int root;//根节点int parent[MAX_N];//父亲节点 int depth[MAX_N];//节点深度 void dfs(int v,int p,int d){ parent[v]=p; depth[v]=d; for(int i=0;i<G[v].size();i++) if(G[v][i]原创 2017-04-07 09:32:32 · 238 阅读 · 0 评论 -
树状数组 所有变种问题(超全面)
Binary Indexed Tree(树状数组)是能够完成下述操作的数据结构给一个初始值全为0的数列a1,a2,....an*给定i,计算a1+a2+....ai(前i项和)*给定i和x,执行ai+=x 通常用树状数组来快速求任意一区间的和如果我们想求从s到t的和,只要知道(从1到t的和)和(从1到s-1的和)这2个数相减,就是我们要求的区间和,也就是说,使原创 2017-03-09 12:59:52 · 264 阅读 · 0 评论 -
数据结构 优先队列 C语言实现
优先队列------(二叉堆实现)我们用heap[MAX_N]来表示数据给每个节点赋予一个编号(就是数组heap的下标),此时,儿子的编号就满足: 左儿子的编号是自己的编号x2+1 右儿子的编号是自己的编号x2+2 int heap[MAX_N],sz=0;void push(int x){ int i,p; i=sz;//自己节原创 2017-02-26 19:08:38 · 1001 阅读 · 0 评论 -
并查集 数据结构
并查集(用树形结构实现的)有2种操作:(1)查询元素a和元素b是否在同一组。(2)合并元素a和元素b所在的组。int pre[N];//我们用数组下标代表每个元素,而数组pre[N]代表N父亲的编号,int rank[N]; //rank[N]代表这个树的高度 // 当pre[N]=N时,N就是所在树的根void init(void){ fo原创 2017-02-27 13:15:39 · 328 阅读 · 0 评论 -
uva 1623 贪心 数据结构
#include#include#includeusing namespace std;int lo[1000100],d[1000100],ans[1000100];int main(){ int T,n,m; scanf("%d",&T); while(T--){ memset(lo,0,sizeof(lo)); memset(ans,0,sizeof(ans));原创 2017-10-09 13:19:03 · 298 阅读 · 0 评论