
数据结构
文章平均质量分 72
ehi11
这个作者很懒,什么都没留下…
展开
-
poj3468 A Simple Problem with Integers 线段树区间累加求和
#include #include using namespace std;#define LL long long#define maxn 111111#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1LL add[maxn<<2];//add记录的是子节点一致增量,并不是累加和.LL sum[maxn<<2];void p原创 2012-08-02 22:18:15 · 669 阅读 · 0 评论 -
Count Color 线段树成段更新 hoj &poj
/*注意在查询的时候要将标记下方。*/#include #include #define maxn 100001int c[maxn<<2];bool color[31];int lazy[maxn<<2];void swap(int &a,int &b){ int temp; temp=a; a=b; b=temp;}void build(in原创 2013-01-22 21:21:07 · 685 阅读 · 0 评论 -
线段树+DP 求区间连续最大子段和 hoj Candy
/* f为从左端开始的最大子段和,b为从右端开始的最大子段和。 pushup中的为最大字段和的状态转移方程。*/#include #include #define maxn 100001#include using namespace std;int m[maxn<<2],f[maxn<<2],b[maxn<<2],sum[maxn<<2];void pushup(int rt)原创 2013-01-22 21:17:50 · 2463 阅读 · 0 评论 -
Ultra-QuickSort
#include #include #include #include using namespace std;const int maxn=500001;int c[maxn],n,m;struct NUM{ int id,num;} a[maxn];int cmp1(NUM a,NUM b){ return a.num<b.num;}int cmp2(原创 2013-02-15 12:00:46 · 978 阅读 · 0 评论 -
POJ Stars 2352
#include #include int c[32001];int s[15001];inline int lowbit(int x){ return x&(-x);}void update(int p,int d){ for(int i=p; i<=32001; i+=lowbit(i)) c[i]+=d;}int sum(int x){原创 2013-02-15 12:03:36 · 776 阅读 · 0 评论 -
HOJ 2678 Stars
#include #include #include #include using namespace std;const int maxn=1001;struct point{ int x,y,z;} p[15001];int c[maxn][maxn];int s[15001];int cmp(point a,point b){ if(a.z!=b.z)原创 2013-02-15 12:04:46 · 828 阅读 · 0 评论 -
POJ 3067 Japan
#include #include #include using namespace std;const int maxn=1005;long long c[maxn+1];struct point{ int x,y;} p[1000005];inline int lowbit(int x){ return x&(-x);}void update(int x原创 2013-02-15 12:05:41 · 733 阅读 · 0 评论 -
POJ 2481 Cows
#include #include #include using namespace std;const int maxn=100005;int c[maxn+1];struct point{ int s,e,ans,id;} p[maxn+1];inline int lowbit(int x){ return x&(-x);}void update(int原创 2013-02-15 12:06:29 · 1075 阅读 · 1 评论 -
POJ 2029 Get Many Persimmon Trees
#include #include const int maxn=101;int c[maxn][maxn];inline int lowbit(int x){ return x&(-x);}void update(int x,int y){ for(int i=x; i<=maxn; i+=lowbit(i)) for(int j=y; j<=ma原创 2013-02-21 12:20:23 · 629 阅读 · 0 评论 -
POJ 1195 Mobile phones
#include #include const int maxn=1050;int c[maxn][maxn];inline int lowbit(int x){ return x&(-x);}void update(int x,int y,int p){ for(int i=x; i<maxn; i+=lowbit(i)) for(int j=y;原创 2013-02-21 12:21:52 · 686 阅读 · 0 评论 -
HOJ 2686 Magic-Box
#include #include const int maxn=202;int c[maxn][maxn][maxn];inline int lowbit(int x){ return x&(-x);}void update(int x,int y,int z,int p){ for(int i=x; i<maxn; i+=lowbit(i)) f原创 2013-02-21 12:23:33 · 563 阅读 · 0 评论 -
HOJ_2430 Counting the algorithms
#include #include const int maxn=2*100001;int c[maxn],a[maxn];bool judge[100001];int f[100001];inline int lowbit(int x){ return x&(-x);}void update(int x,int p){ for(int i=x; i<maxn;原创 2013-02-21 12:24:44 · 819 阅读 · 0 评论 -
POJ 2155 Matrix
#include #include const int maxn=1001;int c[maxn][maxn];inline int lowbit(int x){ return x&(-x);}int sum(int x,int y){ int ans=0; for(int i=x; i>0; i-=lowbit(i)) for(int j=原创 2013-02-21 12:22:45 · 691 阅读 · 0 评论 -
POJ 2985 The k-th Largest Group
数组a[x]的含义是个数为x的组有多少个。利用树状数组更新a,合并,则原先个数所在的集合-1.新形成的几何集合.#include #include const int maxn=200010;int c[maxn+1],f[maxn+1],a[maxn+1];inline int lowbit(int x){ return x&(-x);}void updat原创 2013-02-24 12:34:37 · 888 阅读 · 0 评论 -
HOJ 1016 Joseph's problem I&&HOJ 2920 Escape
这题有一个很好的数学类解法。推导出母函数来直接求解,很高效。这边介绍一种更为普遍的模拟方法,用树状数组来模拟约瑟夫问题。本题先预处理出要求的素数。然后每次新形成的环里下一个目标的间隔就是相应的素数。在这里用树状数组来处理元素动态删除和在线统计间隔以快速确定下一个元素下标,这里用二分来逼近。动态删除即将单点更新为-1,统计直接取和。#include #include #i原创 2013-02-24 12:37:01 · 1129 阅读 · 0 评论 -
树状数组 经理的烦恼
/*用一个树状数组tree来保存数组a中对应我只的质数的个数.此时sum(p)表示a[]中1到p里有多少个质数.对tree的初始化,tree[]=lowbit[]*tag.若初始部位质数,则全都为0,若为质数,则按照树状数组的定义,在相应的位置按lowbit进行累加.即c[i]=a[i-lowbit(i)+!]....a[i].*/#include #include #d原创 2012-08-01 12:30:31 · 1196 阅读 · 0 评论 -
Number sequence 树状数组基础
/*这是一道比较基础的树状数组。注意c下标的最大范围。c的下标是Ai<32768,用memset比较保险。初始化为0,输入的数对应的数组位置++,记为出现的次数。然后计算元素a左端所有<a的元素的个数只需要求sum(a-1)即可。然后再反向扫描一次。只需要将对应位置的左右两边都比该元素小的个数相乘即可。*/#include #include #define maxn 50005i原创 2012-08-01 22:07:25 · 520 阅读 · 0 评论 -
Babelfish trie树的基础
#include #include #include using namespace std;const int maxn=100005,KIND=26;int m;//m为建trie树所输入的单词次序char s[30];char s1[maxn][15];char s2[15];char str[15];struct node{ char *s; int原创 2012-08-01 22:11:59 · 545 阅读 · 0 评论 -
hdu 敌兵布阵 线段树基础
/*第一道线段树...参考了not only success的代码风格,挺好的.这是一道单点更新的线段树.先修改叶子,然后递归修改祖先.也可用树状数组.*/#include #include #define maxn 50001#define lson l,mid,rt<<1//<<箭头指向的为移动的方向#define rson mid+1,r,rt<<1|1i原创 2012-08-02 19:09:13 · 660 阅读 · 0 评论 -
hdu I hate it 区间最大值 线段树
#include #define maxn 200001#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int MAX[maxn<<2];int n,m;int max(int a,int b){ if(a>b) return a; else return b;}void pushup(原创 2012-08-02 19:11:07 · 774 阅读 · 0 评论 -
hdu Just a Hook 线段树成段更新.cpp
#include #define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define maxn 111111int col[maxn<<2];int sum[maxn<<2];void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void push原创 2012-08-02 19:12:31 · 495 阅读 · 0 评论 -
求最大值的条件下的位置 hdu Billboard
//思路:以竖直高度为x轴,则x轴的宽度应该为1到min(h,n)//该步骤是动态的过程,开始时横坐标为1,慢慢变为2,3,4,最大值的更新//开始是1,2的父亲,然后是2,3的最大值,接着是3,4......#include #define maxn 200200#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1i原创 2012-08-02 19:13:21 · 474 阅读 · 0 评论 -
Atlantis 线段树经典问题 矩形面积并
/*这个很多参考了NotOnlySuccess的思路。cnt用的记为精妙啊。将区间起始端点标记为1,末端点标记为-1.则进入一个矩形为1,离开一个矩形为-1,cnt不为0表示线段有重叠。先对纵坐标进行排序,在x轴上求相应区间的最大值,取根节点即可。*/#include #include #include #include #define maxn 2222#define lson原创 2012-08-03 23:22:37 · 815 阅读 · 0 评论 -
hoj 1067 Rails 栈的模拟
/*栈的一道基本的模拟题。主要分为三种情况处理。一种是不需要进入C站,直接从A到B。一种是经过C站中转。用栈模拟进出的过程。*/#include #include using namespace std;const int inf=1005;int main(){ stack s; int target[inf]; in原创 2012-06-13 22:29:17 · 585 阅读 · 0 评论 -
hoj Tree Recovery
/*树的前序遍历,中序遍历和后续遍历。用递归的方法。char s+n 表示从s的第n个字符开始读取,前面的去掉。*/#include #include void build(int n,char* s1,char* s2,char *s){ if(n<=0) return; int p=strchr(s2,s1[0])-s2; build原创 2012-06-22 22:28:39 · 362 阅读 · 0 评论 -
Complicated Translation 栈的模拟 hoj
/*对于这道题我表示非常无语。对getchar的用法不熟。主要是读入字符的问题。然后将每个词入栈。再按顺序弹栈即可。学会用getchar处理单个字符和对行数的控制。*/#include #include using namespace std;int main(){ int n,top; char a[1100];原创 2012-06-16 23:40:09 · 447 阅读 · 0 评论 -
hoj Printer Queue
/*这是一道用循环队列和优先队列模拟的题。用结构体来定义队列。使队列能够能够记录元素的值和下标。优先队列入队的同时已经自动进行排序。top()的值都为当前队列的最大值。具体模拟过程见程序*/#include #include #include struct Work{ int in; int pos;} work[110]原创 2012-06-20 22:37:45 · 414 阅读 · 0 评论 -
Sequences hoj 单调队列优化DP
/*可以用单调队列优化的DP一般是用于限定长度的区间,且区间有整体移动的趋势。即每一个元素是逐次进出区间,且只有一次。这样的题目一般都是有比较明显的模板。下面的这个就是集训的时候学长给的模板。感觉挺好写和理解。不过综合对比时间效率。感觉不一定是最高效的。题意是给你固定的区间长度范围。求该序列首端和末端的和最大值。简单。维护一个单调队列进行优化即可。有些细节看代码的注释。*/#include原创 2012-08-08 22:12:32 · 744 阅读 · 0 评论 -
Super_Stack STL模拟栈
/*这道题的题意非常清晰。实现起来个人稍有纠结。开始的时候用每次询问都遍历一遍,必定超时!后来定义了一个结构体,手写栈。每次读入数据的时候将最值更新到栈顶。最后询问时返回栈顶元素即可。*/#include #include #include using namespace std;struct sta{ long long max,min,v;} p[70000];原创 2012-07-24 22:12:02 · 645 阅读 · 0 评论 -
Data Manager 数据结构+STL
/*优先队列的小根堆的写法。水题。还有一个方法是将所有的值都变为负数,然后直接用优先队列。输出输入和输出还有字符串用c,不然tle。*/#include #include #include #include using namespace std;int main(){ priority_queue,greater > v; char s[20]; i原创 2012-07-25 21:44:53 · 486 阅读 · 0 评论 -
The Suspects 并查集基础
/*基础的并查集.每读到一个group.把后面的人都合并到第一个.最后查询的时候记录和0有相同祖先的人数即可.*/#include #define maxn 30001int f[maxn];int n,m,k,t,p;int find(int x){ if(f[x]==x) return x; else f[x]=find原创 2012-08-01 13:28:20 · 450 阅读 · 0 评论 -
Ubiquitous Religions 简单并查集
/*基础的并查集。初始值设为n。只要合并两个人一次,就n--*/#include const int maxn=50001;int f[maxn];int sum;int find(int a){ if(f[a]==a) return a; else f[a]=find(f[a]);}void unit(int a,int b){原创 2012-08-01 22:10:09 · 475 阅读 · 0 评论 -
树状数组小结(1)
树状数组其统计量的变化,可以动态删除区间,更新区间,更新节点,区间统计,单点求值。大部分题的代码在博客中有。利用对和的二分,可以快速的求解第K大。主要注重问题的转化和应用。1.hoj 2275 Number sequence 利用树状数组来统计个数,左边比他小的元素的个数,顺序将元素的个数更新为1,统计右边比他大的元素个数,可以逆序更新,取和求统计个数是动态过程。2.Ultra-Quic原创 2013-02-14 19:18:38 · 1321 阅读 · 0 评论