
数据结构
文章平均质量分 83
Balloons2012
这个作者很懒,什么都没留下…
展开
-
spoj 3267
离线+树状数组 给出N (1 区间 [i, j] 内有多少个不同的数。Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to ret原创 2012-08-12 22:09:47 · 748 阅读 · 0 评论 -
hdu 1542 (poj1151) Atlantis ( 线段树求矩形面积并)
离散化+扫描线+线段树。 虽然这题直接离散化也能过,但想要学习一下线段树求矩形并,就网搜各种线段树求矩形并的方法。其实做法还是跟离散化的做法差不多。先介绍离散化+扫描线的做法(这种情况适应矩形数目不是很多的时候):1,将矩形的四条边无限延长,则将平面区域分为了多个小矩形区域。我们要求的区域面积就是其中一些的小矩形的面积的和。(这一步只是理解,无实际操作)2,分别将上述水平的划分线和竖直原创 2012-10-18 00:05:13 · 1420 阅读 · 1 评论 -
poj 3667 Hotel
线段树处理区间合并问题。#include#define MAX 50010#includeusing namespace std;int L[4*MAX+1],R[4*MAX+1],M[4*MAX+1],covered[4*MAX+1];void pushup(int l,int r,int rt){ int k=R[rt<<1]+L[rt<<1|1]; int m=(原创 2012-10-16 21:02:14 · 529 阅读 · 0 评论 -
hdu 3308 LCIS (线段树)
线段树处理区间合并的问题。主要是记录一个区间包括左端点的最长的长度,包括右端点的最长的长度,整个区间的最长的长度,这三个信息。这样在合并两个区间时有足够的信息支持求出合并后区间最大的连续递增序列的长度。查询时注意细节,特别是(a,b)分两段查询时,具体见代码。#include#include#include#define MAX 100010using namespace std;原创 2012-10-11 22:04:51 · 663 阅读 · 0 评论 -
hdu 2665 (poj 2104) 划分树
poj2104题目要求弱一些,n个数是不同的。hdu2665中没有这样的限制。所以在划分左右区间时需要处理一下相同的数怎么划分。#include#include#include#define M 100010using namespace std;int tr[20][M],num[20][M],sorted[M];void build(int l,int r,int d){原创 2012-10-10 15:53:11 · 634 阅读 · 0 评论 -
块状链表
/** 本模板支持以下操作:* 1.在任意位置插入一个整数* 2.插入一个块(Block),包含多个整数* 3.删除一个整数* 4.输出第i位上的整数* 注意:所有Insert(pos,data),均是在pos之后插入。* BlockList::N是sqrt(n)的结果,它决定了块状链表的效率*/#include #include #include #include #d转载 2012-10-06 10:09:52 · 1448 阅读 · 0 评论 -
hdu4277 USACO ORZ
import java.util.HashSet;import java.util.Scanner;public class Triangle { int a,b,c; int arr[]=new int[1010],n,sum; long M=200010; HashSet mp=new HashSet(); void dfs(int d){ if(d>n){ if(a转载 2012-10-05 16:33:19 · 536 阅读 · 0 评论 -
hdu 4267
按余数对数分组,tree[i][j]表示被i除余j的数的序列; 然后用10*10个树状数组就可以做了。是区间更新,单点求值。#include#define lowbit(x) ((x)&(-x))#includeint tree[11][11][50002];int a[50002]; int n;void update(int k,int i,int j,int c){原创 2012-09-11 16:56:43 · 593 阅读 · 0 评论 -
字典树的两种实现
hdu1251 动态链表实现:#include#includeusing namespace std;typedef struct Node{ int prefix; Node* next[27]; Node(){ prefix=0; memset(next,0,sizeof(next)); }}Node;Node rt; char c='a';No原创 2012-09-06 15:27:32 · 1935 阅读 · 0 评论 -
poj2528 (线段树+离散化)
本题有个小trick,就是离散化时相邻两个数相差大于1时,经过离散化就会使得两个数差为1.而在本题中这是有区别的,因为题目中的数表示单位长度,不是一个点,所以要在差大于1的两个数之间插入一个数,然后再离散化。#include#include#includeusing namespace std;#define maxn 80005#define lson l,m,rt<<1#defi原创 2012-08-19 10:04:42 · 600 阅读 · 0 评论 -
poj 2823 (单调队列)
原来这个是单调队列,第一次写,纪念一下。#includetypedef struct{ int key,tag;}Node;Node node[1000010]; int a[1000010];int mn[1000010],mx[1000010];int main(){ int n,k,i,j,head,tail,h,idx; scanf("%原创 2012-08-29 09:25:12 · 706 阅读 · 0 评论 -
线段树模板 (poj 3468)延迟标记
参考了胡浩大牛的代码风格。#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn = 100010;long long add[maxn*4+1]; long long sum[maxn*4+1];void pushup(int rt){ sum[rt] = sum[rt<<1] + sum原创 2012-08-18 11:20:22 · 1275 阅读 · 0 评论 -
bnuoj 17184 代数 (带权并查集 )
代数Case Time Limit: 1000msMemory Limit: 65536KB 现有N个未知数A[1],A[2],…A[N],以及M个方程,每个方程都是形如A[s]+A[s+1]+A[s+2]+…A[t-1]+A[t]=c。现在求解这个方程组。Input 输入的第一行为两个整数N和原创 2012-08-17 21:29:58 · 1129 阅读 · 0 评论 -
hash小模板
#define MAX 1000010struct{ int next,value,num;}edge[MAX]; int e=0; int num=0;int head[MAX]; int hash(int x){ int h = x % MAX; for(int i = head[h]; i != -1; i = edge[i].next) {原创 2012-08-16 10:27:21 · 453 阅读 · 0 评论 -
poj 1182 (带权并查集)
Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是"1 X Y",表示X和Y是同类。第二种说法是"2 X Y",表示X吃Y。此人对N个动物,用上述两原创 2012-08-15 22:52:05 · 8051 阅读 · 3 评论 -
并查集
并查集是一种优秀的数据结构,能够支持快速的查找某元素所在的集合以及合并操作。最常见的并查集的实现方式是森林,通过记录所有结点或者部分结点(下面会看到)的父节点来记录森林。并查集的详细实现方式可以参考CLRS第二十一章。 信息学竞赛中基本的并查集题目比较少,大多要对并查集进行一些拓展,多记录一些信息以完成计算。竞赛的题目有很大一部分是询问两个结点的相对信息,结点a相对结点b的信息用f(转载 2012-08-14 21:55:04 · 636 阅读 · 0 评论 -
树形结构转线性结构的方法
在图论中经常遇到一些很常见的问题,比如一个非常简单的例子,给你一棵树,每一个点都有一个权值,现在动态更新一个点的权值,叫你查询一个点对路径上所有点权的和,这种问题和图论的Tree Problem非常类似,我们可以利用树形结构转线性结构的方法来处理,我们考虑随便取一个点,比如说1,作为根,这样我们就可以得到一个DFS序列,注意我们维护一个长度为2*N的DFS序列,每次访问开始的时候,向序列中加入一转载 2012-08-12 22:26:37 · 2599 阅读 · 0 评论 -
hdu 3255 Farming(线段树求长方体体积并)
把价值p看做这个矩形上的高也就是长方体了。然后解法与线段树求矩形并差不多,就是多了一个枚举高度的循环。#include#define maxn 30010#include#includeusing namespace std;typedef struct{ int l,r,y,s,h,tag;}Seg;Seg ss[4*maxn]; int sum[10*maxn]原创 2012-10-18 20:36:05 · 1394 阅读 · 0 评论