×××××××数据结构×××××××
WePlayDirty
emmmmmmm
展开
-
poj3321 Apple Tree
dfs搜索记录每个节点的dfs序l,以及其子节点最大的dfs序r,dfs序在区间[l,r]之间的就是dfs序为l的节点的子孙节点。查询节点P的果实个数,即使查询P对应的dfs序区间的和。要把用树状数组维护的区间上的某一点改为num,可以先记录每个位置的值,计算出增量,再update。有点坑的是卡vector,TLE#include#include#include#includ原创 2016-07-25 09:11:32 · 2290 阅读 · 0 评论 -
(多校第一场1004)HDU5726 GCD(区间GCD查询+)
题意:给出n个数,区间为(1,n),查询区间(l,r)的GCD,以及区间(1, n)有多少子区间的GCD等于区间(l,r)的GCD。做法:使用线段树,或RMQ维护区间GCD,并且要预处理出所有可能出现的GCD值 的区间数量。针对固定左端点,一直向右GCD阶梯状减小的特性,大概有两种做法。1)对于某一固定起点(以选定左端点L=i为例),从最右端R开始,二分枚举GCD突变位置pos,这一段阶梯的长度就是R-pos+1,定义INTERGCD(L,R)=区间(L,R)的GCD,则GCD值等于 INTERGC原创 2016-07-21 22:02:04 · 4230 阅读 · 0 评论 -
poj2528 离散化+线段树区间更新
就是看区间内有多少张不同的海报,唯一的问题是墙太长,需要离散化一下海报的宽度;最好的理解方式就是阅读代码:#include#include#include#include#include#define maxn 500010using namespace std;int _set[maxn*2];bool vis[11000];int fin_ans;void原创 2016-04-28 17:58:21 · 2183 阅读 · 0 评论 -
poj2352 Stars(树状数组)
问题要求统计左下角(x,y均小于当前star的star)有0颗星星、1颗星星.……n-1颗星星的星星个数,顺序输出。题目中给的数据是按y从小到大,所以对于star i(xi,yi),可能在它左下角的star(y#include #include #include #include #include #include #include #include #include #in原创 2016-08-11 08:50:18 · 2707 阅读 · 0 评论 -
通过前序(后序), 中序遍历建立二叉树 求解层次遍历
题目链接不管是二叉树的建立 求前遍历 后遍历 还是层次遍历,都是利用中序遍历的性质 和一个前序遍历或后序遍历,讲一个节点的左支所有的数,右支所有的数,和该节点的数分开,然后根据题目重新排序;前序遍历:该节点的数、左支的数、右支的数;中序遍历:左支的数、该节点的数、右支的数;后序遍历:自己想想...左支的数、右支的数、该节点的数(前序遍历就是节点的数总是在原创 2015-01-26 20:05:52 · 2375 阅读 · 0 评论 -
LCS(最长公共子序列) GST(最长公共子串,广义后缀树)
最长公共子串(LCS)最长公共子串(LCS),有三种情况:1.公共子串的元素必须相邻. 2.公共子串的元素可以不相邻联单3. 求多个字符串而不是两个字符串的最长公共子串1.公共子串的元素必须相邻: LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位转载 2015-08-14 21:01:11 · 5433 阅读 · 2 评论 -
POJ1789 Truck History
就是最小生成树,就记得第一次做的时候题意坑,但还是忘了到底是啥,这次还是没理解题意。// #include#include#include#include#include#include#include#include#define LL long long#define maxn 2100using namespace std;char str[maxn][10];原创 2016-07-23 09:34:17 · 2069 阅读 · 0 评论 -
(多校第四场1012)HDU5763 Bubble Sort (树状数组)
给出一串数是(1~n)的一个排列,问在冒泡排序过程中,每个数会出现的最右端位置和最左端位置的差。一开始想用归并排序做,但是发现归并和冒泡的交换次数相同,但是每个数出现的位置是不同的。所以归并不可行。最后发现,由左向右冒泡(题目中给的程序是从右向左冒泡,其实结果一样),每个数向左移动的次数就是其前面比他大的数的个数,而其最左端位置就是(未排序的位置-前移的位置),而每个数的最右端位置就是ma原创 2016-07-30 11:17:58 · 2243 阅读 · 0 评论 -
(多校第四场1001)HDU5763 Another Meaning (DP、KMP)
先给出一个母串str,再给出一个模式串pat,每一个pat有两个意思,问母串能表示几个意思。用dp解决,dp【i】表示到i位置可以表示的意思个数,首先有dp[i]=dp[i-1],设pat的长度是len1,如果以i结尾的前缀字符串的最后了len1个字符与pat匹配,那么dp[i]+=dp[i-len1];而对于每个以i结尾的位置能不能被替换,可以用kmp计算出。#include#原创 2016-07-30 10:37:24 · 2440 阅读 · 0 评论 -
(多校第四场1006)HDU5769 Substring 后缀数组
套了一个后缀数组的模板,求出sa和height数组后,对于每一个后缀字符串,他能产生的不同子串的数量就是len-sa[i]-height[i];而本题还要求必须包含目的字符tar,这就需要另外一个数组haha,haha[i]表示从第i个字符向后几位找到tar,例如abbabb,tar=a,则haha{0,2,1,0,2,1,0};而对与每个后缀字符串能产生的包含tar的不通字符串个数就是l原创 2016-07-29 13:48:54 · 2234 阅读 · 0 评论 -
线段树详细讲解
原帖出处线段树(segment tree)线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树:(PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本性质和操作线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L转载 2015-01-30 10:55:36 · 2817 阅读 · 0 评论 -
poj2299树状数组解法(转发备忘)
转载:树状数组,具体的说是 离散化+树状数组。这也是学习树状数组的第一题.算法的大体流程就是:1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的,2.接着,运用树状数组的标准操作来累计数组的逆序数。算法详细解释:1.解释为什么要有离散的这么一个过程? 刚开始以为999.999.999这么一个数字,对于int存储类型来说是足够了转载 2015-08-07 15:44:05 · 2074 阅读 · 0 评论 -
poj2886 Who Gets the Most Candies?
题意:输入n,k表示n个人,第k个第一个离开圆环,之后n行,每行一个名字和一个数字m,表示从这个人开始顺时针(数字大于0)或逆时针(数字小于0)第m个人离开圆环。 每个人离开时会有一个得分,得分=F(离开次序i); F(i)=能整除i的数的个数;求这个人的名字和得分。思路:首先打表枚举[1,500000]的F(i); 然后模拟求这个人的名字,对于[1,n]中原创 2016-07-17 20:48:55 · 2239 阅读 · 0 评论 -
poj2750 Potted Flower(线段树单点更新)
线段树还可以维护最大连续子序列和啊。。没想到对于这种首尾相接的数列,所求为其中一部分连续子序列的,可以分两种结果讨论(以序列a1,a2,a3,a4,a5为例):要么在序列中间,要么在序列两头1)所求结果子序列没有被分成两段(例如结果为a2,a3,a4);2)所求结果子序列分布在两端(例如a4,a5,a1,a2);对于本题,如果是第一种情况,结果就是(整个序列的最大连原创 2016-07-18 10:57:48 · 2688 阅读 · 0 评论 -
poj1195 Mobile phones
裸的二维树状数组#include#include#define maxn 1100int tree[maxn][maxn];int lowbit(int x){ return x&(-x);}void update(int x,int y,int num,int R,int C){ int i,j; for(i=x;i<=R;i+=lowbit(i))原创 2016-07-25 09:33:28 · 2149 阅读 · 0 评论 -
poj2892&&HDU1540 Tunnel Warfare(线段树)
poj都给hint,D x摧毁x,R恢复最近摧毁的点,Q x查看和x相连的点的个数(未摧毁)。做法:1)训练计划上把这题分到静态二叉检索树上,所以先想到用线段树做,线段树维护每段中被消除点的最大位置和最小位置,摧毁点k就把k添加到位置k,查询k,就查询段[1,k]的中的最大值和[k,n]的最小值,然后相减得到结果。初始化时最大值为0,最小值为n+1,这样在区间如果没有被摧毁的点也能返回正确原创 2016-08-10 14:12:12 · 2258 阅读 · 0 评论