
数据结构
azheng51714
欢迎加入 老生畅坛 微信公众号
展开
-
UESTC 1717 LCA+DIJ
/*第一次写最近公共祖先问题,用的邻接表指针。对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个点所有的祖先结点中深度最大的一个结点。 0 | 1 / \ 2 3比如说在这里,如果0为根的话,那么1是2和3的父亲结点,0是1的父亲结点,0和1都是2和3的公共祖先结点,但是1才是最近的公共祖原创 2013-06-05 13:01:40 · 734 阅读 · 0 评论 -
hdu 2473 简单并查集
/*题目大意,就是输入的如果为M,那就合并两个集合,否则将此点分离出去,问一共有多少个集合*/#include#include#include#include#include#includeusing namespace std;const int maxn=2000012;int n,m,fa[maxn],ans,idx[maxn],vis[maxn];char op[2];原创 2013-01-11 15:37:24 · 423 阅读 · 0 评论 -
hdu 1271 简单并查集
#include#include#include#includeusing namespace std;const int maxn=100002;int father[maxn],vis[maxn],n,m,ans,t,tmp;int Find(int x){ if(father[x]==x)return x; return father[x]=Find(fath原创 2013-01-10 18:06:58 · 411 阅读 · 0 评论 -
hdu 3172 字典树+并查集
题意: 用map+并查集在hdu提交过了,但是在web diy上TLE了。。。果断有写了一个字典树#include#include#include#include#include#include#includeusing namespace std;const int maxn=22;const int maxm=100002;int t,m,n,fa[maxm],su原创 2013-01-11 17:45:03 · 576 阅读 · 0 评论 -
hdu 1829 并查集
/*题意:题意:有n个人,给你m对关系,问有没有同性恋的。题解:典型并查集 0.0 有点类似于食物链我们定义:fa[i]表示i节点的父节点,bug[i]表示i节点所属性别 0代表男性,1代表女性*/#include#include#include#include#include#includeusing namespace std;const int maxn=2013;原创 2013-01-10 14:53:29 · 447 阅读 · 0 评论 -
poj 2377 最大生成树 最小生成树的变形
/*题目大意:求最大生成树。 题目分析:转换一下思维,将最小改为最大就可以了,题目数据有重边,使用kruskal算法无影响,*/#include#include#include#includeusing namespace std;const int maxn=20002;int n,m,father[maxn],ans,sum;struct node{原创 2012-11-20 12:23:23 · 1006 阅读 · 0 评论 -
poj 3067 树状数组
树状数组题意:有两排城市,这两排之间有一些城市之间有连接的道路,给出所有道路,问有多少道路是相交的。分析:求逆序数 我们先把所有的道路按照a升序,a相同时b升序的方法排列!JapanTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 156原创 2012-11-19 19:33:01 · 376 阅读 · 0 评论 -
poj 2155 二维树状数组
/*题意: 给定一个n*n的0-1矩阵,执行一些如下的两种操作:C a,b,c,d :将矩阵中(a,b)到(c,d)的格子中的0-1进行“非”操作Q a b :询问当前(a,b)位置的元素的值思路: 二维树状数组本题给出的要求正好与树状数组的操作"相反",但是还是可以转换成树状数组的操作。本题的要求是对二维数组的某一个矩形范围进行异或操作,而是询问单个元素的值。一种思路是用一个二维数原创 2012-11-19 21:03:21 · 406 阅读 · 0 评论 -
poj 3321 树状数组
/*题意: 一棵具有n个节点的树,一开始,每个节点上都有一个苹果。现在给出m组动态的操作:(C,i)是摘掉第i个节点上面的苹果(若苹果不存在,则为加上一个苹果),(Q,i)是查询以第i个节点为根的子树有几个苹果(包括第i个节点)。解法: 只是要注意把深搜的时间戳当作是数组的下标,而且如果是根节点, 为保证唯一性,结束时间和开始时间应该是一个值, 而非根节点原创 2012-11-19 13:37:01 · 487 阅读 · 0 评论 -
poj 3928 树状数组
/*题意是要组成许多比赛,比赛的要求是,两个人比赛一个人作裁判,裁判的能力值必须要在两个人之间,位置也是,问一共有多少种不同的比赛方式。每个人的能力值各不相同。*/#include#include#include#includeusing namespace std;const int maxn=100000;int n,t;__int64 c[maxn],lmin,lma原创 2012-11-19 16:58:35 · 963 阅读 · 0 评论 -
hdu 3333 树状数组
题意:给出一组序列,问某个区间内序列的和,跟普通求和不同的是,要求值相同的元素只能算一次。树状数组 Or 线段树 :刚开始以为和前两道题目思路差不多,就考虑了考虑,离散化写了起来!!但中间突感有的数据没有处理!!于是考虑二分+离散处理query区间的数据!!!于是乎:#include#include#include#includeusing namespace st原创 2012-11-16 16:52:18 · 695 阅读 · 0 评论 -
poj 2481 树状数组
/*题目描述草地上有一群牛数量为N(1<=N<=100000)分别从1到N编号。现在有一个矩形草场长度为S(0<=S<=100000)每头牛都有自己的食草领地领地宽与草场相同这样从草场长的一侧来看每头牛相当于都有一个左右食草区间[L,R](0<=L<R<=100000)。规定如果牛i的区间完全包含牛j的区间即Li=Rj,(Ri-Li)>(Rj-Lj)就说牛i比牛j强原创 2012-11-16 11:56:03 · 550 阅读 · 0 评论 -
hdu 2818 带权并查集
/*题目大意:有N个砖头,编号为1~N, 然后有两种操纵,第一种是M x y, 把x地点的那一堆砖头全部移动放到y地点的那堆的上方。第二种操纵是C x, 即查询x下面有几许个砖头,并且输出。*/#include#include#include#includeusing namespace std;const int maxn=30002;int p,fa[maxn]原创 2013-01-13 14:05:35 · 541 阅读 · 0 评论 -
hdu 2586 LCA离线算法 Tarjan+并查集 O(n+q)
/*第一次写最近公共祖先问题,用的邻接表指针。对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个点所有的祖先结点中深度最大的一个结点。 0 | 1 / \ 2 3比如说在这里,如果0为根的话,那么1是2和3的父亲结点,0是1的父亲结点,0和1都是2和3的公共祖先结点,但是1才是最近的公共祖原创 2013-01-13 16:50:40 · 679 阅读 · 1 评论 -
poj 1470 LCA 离线算法
/*LCA求每个点被作为最近公共祖先的次数*/#include#include#include#includeusing namespace std;const int maxn=4012;//nodeconst int maxm=252;//queryint flag[maxn],n,m,N,M,t,query,cnt[maxn],head[maxn],Head[maxn]原创 2013-01-13 17:29:49 · 471 阅读 · 0 评论 -
hdu 4547 Tarjan LCA 离线算法
题意,你网上搜搜吧。。。解法就是LCA 离线模版变形题#include#include#include#include#include#include#includeusing namespace std;const int maxn=100012;//nodeconst int maxm=422222;//queryint n,m,head[maxn],Head[原创 2013-06-04 17:39:02 · 936 阅读 · 0 评论 -
hdu 4417 离线树状数组 胡乱搞搞
/*题意:给你一个数列,然后有m次查询,每次查询一段区间 [l,r] 内不大于 h 的值的个数。解法:离线 树状数组1、若 a[i].h > q[j].h,则从 i 以后的 a[i].h 也不会再对这个查询的解有影响。此时我们可以得到这个查询的解 getsum(r) - getsum(l-1) 。2、若 a[i].h <= q[j].h,则它会且仅会对从 j 以后的每个 q[j].h原创 2013-05-23 21:07:25 · 879 阅读 · 0 评论 -
zoj 3686 简单线段树更新 好久没写这个东东了!!!
/*感觉是颗线段树,一开始没什么好的思路,偷窥了网上的转换方法!题目大意:一棵树有n个结点(1现在有2种操作o操作:(o,x)对结点x及其所有子孙结点的标签值取反(和1异或)。q操作:(q,x)输出结点x及其所以子孙结点的标签值为1的个数。操作次数为m次(1题目思路:从根开始中序遍历每一个结点,给每一个结点按照遍历顺序重新编号(beg)。这样原创 2013-04-20 16:07:04 · 586 阅读 · 0 评论 -
优先队列实现堆
#include #include #include #include #include #include #include #include #include #define N 400005#define INF 0x6f6f6f6f#define debug(a) cout<<#a<<' '<<a<<endl;typedef long long LL;using n原创 2013-04-28 10:54:32 · 577 阅读 · 0 评论 -
hdu 3486 RMQ+二分 简单应用
题目大意: 给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之。现在让我们找最小的k使得和严格大于m。n<=20万,m #include#include#include#include#include#includeusing namespace std;#define M 222222#define MAXN原创 2013-01-30 14:29:38 · 534 阅读 · 0 评论 -
poj 3368 RMQ 模版应用
#include#include#include#include#include#includeusing namespace std;#define M 111111#define MAXN 500#define MAXM 500int dp[M][30];int dp2[MAXN][MAXM][10][10];int l[M],r[M],a[M];/**一维RMQ原创 2013-01-30 10:38:13 · 1014 阅读 · 0 评论 -
hdu 3183 RMQ 应用
题目大意是,给你一个1000位的数,要你删掉m个为,求结果最小数。思路:在n个位里面删除m个位,也就是找出n-m个位组成最小数 所以在区间 [0, m]里面找最小的数,对应的下标标号i接着找区间 [i+1,m++]里面的最小数,对于下标为ii接着找区间 [ii+1,m++]里面的最小数……这样就会找n-m个数了。区间这样安排的目的是为了保证取出来的数的顺序。#inclu原创 2013-01-30 12:31:24 · 634 阅读 · 0 评论 -
poj 2912 并查集
/*集合的合并与维护和食物链那道题一样。不过多了个裁判。注意到N<=500,所以可以枚举裁判,然后判断是否出现了矛盾。(忽略裁判)如果有矛盾,则这个人不是裁判。*/#include#include#include#includeusing namespace std;const int maxn=2013;int n,m,fa[maxn],rank[maxn],ans[m原创 2013-01-14 17:57:10 · 505 阅读 · 1 评论 -
hdu 3047 带权并查集
转自:http://www.cnblogs.com/newpanderking/archive/2012/10/31/2748567.html分析:这是一道比较简单地并查集题目。(1)弄清题意,找出出现冲突的位置,判断冲突很简单就是当两个人在同一行坐,同时他们到根节点的距离差值正好是他们之间的差值,此时就出现了冲突了。(2)关键有两个地方,这也是并查集题目的难点,就是压缩集合,和求原创 2013-01-14 12:15:17 · 1301 阅读 · 0 评论 -
hdu 2874 LCA 离线算法
/*第一次写最近公共祖先问题,用的邻接表指针。对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个点所有的祖先结点中深度最大的一个结点。 0 | 1 / \ 2 3比如说在这里,如果0为根的话,那么1是2和3的父亲结点,0是1的父亲结点,0和1都是2和3的公共祖先结点,但是1才是最近的公共祖原创 2013-01-14 10:25:34 · 727 阅读 · 0 评论 -
HNOI 2002 营业额统计 Splay Tree
1588: [HNOI2002]营业额统计Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3822 Solved: 1184[Submit][Status][Discuss]Description营业额统计Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出原创 2013-01-28 14:47:16 · 872 阅读 · 0 评论 -
Codeforces #159 224 E E. XOR on Segment 二十几颗线段树 成段更新 成段求和
E. XOR on SegmentYou've got an array a, consisting ofn integers a1, a2, ..., an. You are allowed to perform two operations on this array:Calculate the sum of current array elements on原创 2012-11-15 16:11:01 · 917 阅读 · 0 评论 -
poj 2299 求逆序数 树状数组入门
/*这一题题意很简单...就是求将其排列好后所需的最小排列顺序.....我们可以按照冒牌排序的思想来看....也就是说....统计每个数比它本身小且在它之后的数的个数....感觉这里不该叫做离散化,应该叫做 "紧凑化" 才对把 n 个数据范围很大的数据 一映射到a[(1~n)] = 1.2.3...上然后对于每个数,把它更新,求和就是求前面小于自己的数的个数,用原创 2012-11-14 15:16:46 · 392 阅读 · 0 评论 -
hdu 4325 线段树 成段更新
题意: 给出花的开花时间st[i]与凋谢时间ed[i],要求在一个时间点上开了多少花!!(花解法: 线段树区间更新+离散化+区间求值!!!以前都有结构体来解决这些问题,但感觉牛人的代码的确够简洁,所以就忍不住拿来学学,过不其然,怎一个爽字了得!/*转自 傻崽大牛博客的一段话离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们原创 2012-08-02 09:29:40 · 851 阅读 · 0 评论 -
线段树 单点更新
hdu 1166 区间求和#include#include#includeusing namespace std;const int maxn=50002;int sum[maxn<<2],s[maxn],n,t;char str[10];void pushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; return;}原创 2012-07-30 23:57:02 · 502 阅读 · 0 评论 -
hdu 1754 线段树
hdu 1754 区间求最大值#include#include#include#includeusing namespace std;const int maxn=200002;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rint Max[maxn<<2],n,m,s[maxn];char op[2];voi原创 2012-07-31 08:57:30 · 426 阅读 · 0 评论 -
hdu 1856 并查集
题意:求并查集中最大的集合的数据的个数#include#include#include#includeusing namespace std;const int maxn=10000002;int m,a,b,ans;struct node{ int fa,cnt;}father[maxn];int Find(int x){ if(father[x].fa==原创 2012-07-30 19:17:16 · 404 阅读 · 0 评论 -
hdu 1272 并查集简单题目
题目分析:1.每两点之间有且仅有一条路径,有路径,要保证只有一个父亲结点(即所有的房间都只指向一个房间), 仅有一条,在合并两个房间时,他们的父亲结点要不一样,如果一样说明有回路#include#include#include#includeusing namespace std;const int maxn=100002;int father[maxn],原创 2012-07-30 15:36:51 · 514 阅读 · 0 评论 -
数据结构——并查集
http://zh.wikipedia.org/zh-cn/%E5%B9%B6%E6%9F%A5%E9%9B%86转载 2012-07-30 11:47:34 · 468 阅读 · 0 评论 -
poj 1330 LCA
题目:http://poj.org/problem?id=1330Nearest Common AncestorsTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 12128 Accepted: 6446DescriptionA root原创 2012-08-14 11:11:31 · 387 阅读 · 0 评论 -
hdu 1247 字典树
字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有原创 2012-08-06 20:12:59 · 3438 阅读 · 0 评论 -
hdu 4339 线段树 单点更新
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4339题意:Problem DescriptionYou are given two strings s1[0..l1], s2[0..l2] and Q - number of queries.Your task is to answer next queries:原创 2012-08-04 11:30:00 · 499 阅读 · 0 评论 -
zoj 3633 线段树单点更新 区间最大值
/*解法是,先把所有数字从小到大排序,相同的按出现的先后顺序排序。更新时,对于每一个数x,如果前面的y==x的话,那么在线段树中,在x的坐标位置上赋值上y的坐标位置。查询时,[a,b]就是查询区间[a,b]中大于等于a的最大值。如果最大值都小于a,那么就说明没有重复的。比如上面的数据1 2 3 1 2,排序后就是: 1 1 2 2 3pos:1 4 2 5 3原创 2012-09-05 17:41:42 · 693 阅读 · 0 评论 -
zoj 3635 线段树 区间求位置 单点更新
zoj 3635 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4803/*题意:输入一个n,表示有 n 个空位,接下来就是 n 个数,第 i 个数 ai 表示第 i 个人要在坐在第 ai 个空位上;在输入一个 m 表示有 m 次访问,每次访问输入一个整数 bi 表示第 bi 个人坐的位置标号。分析:采原创 2012-09-06 08:18:40 · 494 阅读 · 0 评论 -
hdu 4107 线段树 成段更新
题意:给定区间,每次对一个区间加一个值,如果区间中某个节点的值大于等于P的话,则加的值乘二做法:线段树,维护当前区间的最大值、最小值、标记值#include#include#include#includeusing namespace std;const int maxn=200002;#define lson rt<<1,l,mid#define rson rt<<1|1,原创 2012-09-07 16:44:38 · 563 阅读 · 0 评论