数据结构
文章平均质量分 82
johsnows
正在静下心来学算法的acmer
展开
-
csp 第十七次认证 推荐系统
一道血妈坑的题目,输出应该是按照score从大到小排序,score相同按id从小到达排序,然而题目说是直接按id从小到大,估计是出题人标程写错了,直接用的原来的set存的输出,不知道现场赛有没有说明 太坑了。另外看到一个人的博客,我以为是错的,也能满分https://blog.csdn.net/qq_37038938/article/details/103146771他只枚举了前K大的商品,事实上会有商品一开始不在前K大,但是因为有商品受限制而进入被选择的K个商品中....估计是数据太弱了...原创 2020-06-17 19:20:01 · 390 阅读 · 0 评论 -
bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (时间分治+带撤销并查集)
可加边删边,询问两个点连通性的一个题。好像可以lct。但是跟着金桔学了时间分治+带撤销并查集的做法,第一次写时间分治。时间分治的话就是以操作序号为时间,对应对一颗线段树上去,然后在线段树上分治找到操作时间对应的节点,进行操作。对于一条边,它存活的时间就是【加边的时间,删边的时间】这样一个区间,然后我们这条边pushdown到线段树上去,分散的存在各个节点,注原创 2017-06-16 10:57:43 · 1066 阅读 · 0 评论 -
codeforces 617 E. XOR and Favorite Number(莫队)
题意:n个数,m个区间,问区间内有多少对(i,j)a[i]^a[i+1]^......a[j-1]^a[j]==k,k已给出。解题思路:离线的查询,用莫队最好了。第一次写莫队,所以理解还比较浅。莫队算法的原理是基于由已知[l,r]的答案推到[l,r-1],[l-1, r],[l, r+1], [l+1, r]的答案是o(1)的,所以我们可以先算出一个区间的答案,然后再逐原创 2017-06-02 21:48:29 · 457 阅读 · 0 评论 -
zoj 3602 Count the Trees (dfs+哈希)
题意:给出两棵树,问这两棵树有多少对子树,分别来自两棵树且结构相同。思路:一开始想着去给没课字符编号,然后map统计,但是没想出编号的办法。编号的话我们可以根据二叉树每个节点的两个儿子来编号,pairpair中两个值分别表示出了两个左右子树的结构,这棵树的结构也就表示出来了,这种做法倒是加深了对树的理解,已经如何构造编号也是深受启发。然后对两颗树分别dfs就可以了。原创 2017-05-05 15:05:35 · 471 阅读 · 0 评论 -
hdu 3584 Cube(三维树状数组)
题意n*n*n空间内,对一个以(x1, y1, z1), (x2, y2, z2)连成的线为体对角线的长方体的值取反,查询(x,y,z)的值。初始值为0解题思路:用三维树状数组区间更新单点查询。三维的树状数组容斥起来麻烦一点。代码:#include using namespace std;int n, m;int bit[105][105][105]原创 2017-04-21 21:50:44 · 494 阅读 · 0 评论 -
hdu 1698 Just a Hook(线段树)
三个区间覆盖操作的线段树题,蛮简单的,貌似我多写了一个query,不过写了就算了吧代码:#include #define lson o<<1#define rson o<<1|1using namespace std;const int maxn=1e5+5;int n;struct p{ int sum; int lazy;}a[maxn<<4]原创 2017-04-21 19:49:00 · 357 阅读 · 0 评论 -
uestc 1593 老司机破阵(线段树 or multiset)
老司机破阵Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status老司机的女朋友被坏人抓起来了,护女票心切的老司机心急火燎的赶到坏人藏匿女票的地点想要救出她,但是老司机的神通广大坏人们早有耳闻,等老司机赶到时已经有一原创 2017-05-23 17:07:58 · 772 阅读 · 0 评论 -
hdu 5221 Occupation (树剖+线段树)
题意:一棵树每个点都有权值,有三种操作1 从x节点走到y节点,并将路径中的点的权值都取出来2 将x节点的权值减去3 将以x为根节点的子树的所有节点的值取出来。每次操作后查询一次现在取出来的值为多少。解题思路:入门树剖+线段树题吧第一次写树剖,写错了一个地方wa了好几发。 while(ty!=tx) { if(dee原创 2017-05-11 16:43:43 · 424 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers (树状数组区间更新)
题意:给出N个数,进行Q次操作,有两种操作,一种是区间查询,一种是区间更新.由于这题感觉没什么附加条件,比较裸,博主懒得写线段树,直接上了树状数组,但是区间更新的时候我是区间内每个点去更新的,所以返回结果果断tle.然后去网上学了一发树状数组区间更新的姿势,比线段树要快,也很巧妙.用两个bit数组维护前缀增量 即二维数组bit[2][maxn]当[l,r]区间增加c时, 不难得出, [原创 2016-08-17 21:47:10 · 479 阅读 · 0 评论 -
hzau 1207 Candies(线段树 区间更新 区间查询)
题意:给出一段长度为n的字符串,只包好A和B,一个操作是把区间[l,r]内的字符都替换为A或B,一个询问是问区间[l,r]内最大的连续的B的长度。解题思路:线段树很明显,但是对我来说比较难写。这个题从恐惧于写lazy的过程,到发现自己对合并的理解不够深其实并没有那么可怕,到无限tle,认识到用build比对每个点更新快,再到发现区间合并的时候有个bug,并且区间合并写好了省原创 2017-04-28 21:13:16 · 401 阅读 · 0 评论 -
codeforces 831 E Cards Sorting(bit+stl)
题意:n个牌,牌上有数,每次从牌顶取出一张牌,如果这张牌是当前的最小值那么就把它扔掉,不然放到牌堆底,问需要多少次操作把牌扔光。解题思路:将牌记录下初始位置,按大小排序,然后按顺序取出,用树状数组查询扔牌的时候前面访问了多少张牌。但是需要注意个问题,从一个最小值取完的时候,下一个最小值的牌的选择应该要从上一次扔牌的右边第一张开始。比如32 1 2这组数据,扔原创 2017-07-14 15:25:47 · 561 阅读 · 0 评论 -
FZU 2105 位运算 (线段树)
由于各项数据范围都是0-15,所有把一个数拆成四位二进制数来维护,对应三种操作分别不同分别跑循环操作一下就可以。更新lazy的时候会比较麻烦。要注意如果你默认lazy操作为and, or, xor对应的lazy值分别为0,1,1(因为只有这些值会对结果产生影响),对xor对应的值直接异或的话,需要把异或后为0的lazy标记直接抹去。大概就是这样了,然后不要整个数组都memset原创 2017-07-05 17:58:40 · 409 阅读 · 0 评论 -
poj 2750 Potted Flower(线段树)
题意:给出一个环,让找到一段连续区间,使得和最大,不能不取,也不能全取。解题思路:不是一个环的话,就是连续子段和的线段树简单题,不会可以看前面的博客:http://blog.csdn.net/johsnows/article/details/70214095然后求环的话,我一开始很蠢的去特判了一下,反正最后对拍出来错误也很难调试。看了金q的博客后原创 2017-06-14 16:52:22 · 347 阅读 · 0 评论 -
hdu 6183 Color it(cdq分治+线段树)
题意:两种操作1:在x,y这个点上涂上颜色c。2:查询1,y1和x,y2组成的矩形包含多少种颜色。代码:矩形区域查询点,赛时直接把之前cdq分治+bit的代码贴上然后开了50个树状数组去做,时间复杂度是n*logn*logn*50,直接十几e的复杂度,tle,而且因为树状数组的logn和50是不随数据变的,所以跑起来还没有暴力快,然后暴力代码ac了。。。50原创 2017-09-01 11:31:27 · 844 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+中国剩余定理)
非常巧的一个题。运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射。但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住的。如果仔细观察这个数可以发现,这个数本身不是素数,但是可以分解为4个素数的乘积7*13*17*19。如果你学过中国剩余定理,就应该知道已知一个数x对m1,m2,m原创 2017-07-29 08:20:00 · 399 阅读 · 0 评论 -
hdu 6133 Army Formations(线段树合并)
其实题目要求的就是一颗子树上把所有的权值从小到大排序,每个值对应第k大,把k和值乘在一起加和,就是这个子树对应的根的答案。说到底就是有多少个数大于一个值,这个值就要多加几次。然后我就死在这个理解上,因为要考虑值相同的情况,这句话没错,但是容易忽略值相同的情况。对于每个点我们建一颗权值线段树,表示以这个点为根的子树上的权值分部情况。然后右子树上有多少值大于左子树上的值,以及左子树上有原创 2017-08-20 17:26:35 · 523 阅读 · 0 评论 -
洛谷 排列LCS P1439 (LCS)
看到黑书上写着,LCS是稀疏匹配,只需要关注能让答案更新的地方就可以了。也就是当a[i]==b[j],dp[i+1][j+1]=dp[i][j]+1.这种情况。所以对于每一个i,我们只需要关心,和a[i]相等的值再b种的位置j,记为pair[i]。所以i从0开始更新,去找出pair[j]小于pair[i]的最大的dp[j],这个过程用个线段树或者树状数组优化就好原创 2017-07-27 09:38:21 · 411 阅读 · 0 评论 -
bzoj 2212 [Poi2011]Tree Rotations(线段树合并)
题意:一棵二叉树有n个叶子节点,每个叶子节点有权值,可以交换左右子树,问先序遍历这棵树,得到的最小逆序对数。思路:应该算是线段树合并的入门题。暴力每个非叶子节点,用ans1记录不交换左右子树时,跨越左子树和右子树的答案,即左子树大于右子树的数的对数,ans2记录交换左右子树时的答案。查询左子树中大于右子树的对数可以对左右子树各建一棵权值线段树,在线段树合原创 2017-08-18 22:16:56 · 331 阅读 · 0 评论 -
poj 2763 Housewife Wind(线段树+树剖)
将边的值转成深度大的端点的点值,然后就是树剖找lca通过dfs序把一条链的点映射到线段树上的区间去查询就好了。需要注意的一点是,传入线段树的是dfs序,但是线段数的操作不需要去管dfs序,直接根据传进来的参数做就行了,这是一个容易写错的地方。代码:#include #include #define MID int mid=(l+r)>>1;#define lson原创 2017-08-09 22:26:53 · 310 阅读 · 0 评论 -
hdu 4417 Super Mario(主席树||cdq分治+树状数组)
主席树和cdq分治都可以,而且都是很入门的做法。这道题主席树的写法要好写一些,但是如果带修改的话,就得用cdq分治了。主席树代码:#include using namespace std;const int maxn=1e5+5;struct node{ int l, r, x;}val[maxn*40];int tot, root[maxn], a[ma原创 2017-08-09 17:43:35 · 446 阅读 · 0 评论 -
codeforces 811 E Vladik and Entertaining Flags(线段树+并查集)
题意:n*m的矩形,每个格子上有一个数字代表颜色,有q次询问,问(1,l),(n,r)这两个点对应的矩形的连通块有多少个。1解题思路 :这题最麻烦的就是写合并了,然后也是让我对并查集又重新认识了一下。。只要往线段树那个方向想了,想到每个区间维护左右两个列应该不难,然后再想一想这个题目要求连通块个数,那么应该也能想到左右两个列应该是并查集。然后需要注意的是L(原创 2017-05-31 20:54:56 · 894 阅读 · 2 评论 -
codeforces 785 E. Anton and Permutation(分块)
参考了某神牛的博客:http://blog.csdn.net/aozil_yang/article/details/62396346题意:给你一个只包好1-n的数的数列,初始为a[i]=i。有q次操作,每次操作把位置a,b的数交换,问每次操作后序列存在的逆序对数。思路:算法太渣,根本不知道有分块这种东西,今天第一次见识到。分块,顾名思义就是把序列或者操作数分块,原创 2017-03-17 12:31:47 · 1123 阅读 · 0 评论 -
spoj Can you answer these queries I(线段树 单点更新 区间查询)
题意:给你一个序列,有m次查询,查询一个区间最大连续子序列和最大值。思路:之前做过一个最大连续子序列和的题,那个题有个分治的做法,在回溯的时候,区间最大连续子序列和的最大值只有三个可能,左区间的最大值,右区间的最大值,左区间从最右边开始到左边的最大连续子序列 和加上右区间从最左边开始到右边的最大连续子序列和。这个题也类似了,由于是区间查询,所以我们需要使用线段树去维护,相当原创 2017-03-15 21:07:15 · 465 阅读 · 0 评论 -
poj 1860 (弗洛伊德水过)
Currency ExchangeTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 26472 Accepted: 9784DescriptionSeveral currency exchange points are working in our city原创 2016-08-02 21:42:42 · 525 阅读 · 0 评论 -
poj 1125 Stockbroker Grapevine (最短路求最长距离)
Stockbroker GrapevineTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 33855 Accepted: 18707DescriptionStockbrokers are known to overreact to rumours. You原创 2016-08-02 21:52:28 · 1344 阅读 · 0 评论 -
poj 3259 Wormholes(spfa判断负环)
WormholesTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 43863 Accepted: 16107DescriptionWhile exploring his many farms, Farmer John has discovered a原创 2016-08-03 11:11:12 · 401 阅读 · 0 评论 -
Labeling Balls poj 3687(拓扑排序反向建图)
题意是求一系列盒子,给出相同数量不同重量的球,再满足题目所给轻重关系下让编号小的盒子里的球的重量最轻.注意要反向建图,博主也不明白为什么..代码:#include #include #include #include #include #include using namespace std;int b[205][205];int c[205];int原创 2016-08-16 21:03:10 · 440 阅读 · 0 评论 -
POJ 2002 Squares (哈希表)
题意:在二维坐标上给一堆不重复的点,问能组成多少个正方形.解题思路:一开始的方法是记录每条边的距离,找出相同距离的边,然后想办法判断这两条边是不是一个正方形的对角线,用叉积相乘等于零以及中点相等两个点来判断,这样做答案正确,但是明显超时,总共有50W条边,每找到一组重复边再去判断两两之间是不是满足关系,复杂度最坏的情况相当于O(N^3),可怕...然后换了一原创 2016-08-19 15:25:01 · 389 阅读 · 0 评论 -
cf 721 d(优先队列+贪心)
题意:给一个数列,一种操作,操作是:给定X,可以对数列里的数加x或者减去x。给定数字k,允许操作k次,求经过k次操作后,使数列的乘积最小,输出操作后的数列。思路:看示例后发现这个题应该把最小的数尽量往小了减,直到出现负数,是最终结果值为负,然后去找绝对值最小的值,不管它们正负,去把绝对值加大。这样子想只想对了一部分,没有考虑一开始数列有可能就存在负数,使值为负,也有可能一开始有负数原创 2016-10-02 22:22:37 · 419 阅读 · 0 评论 -
hdu6012(bestcoder 91) Lotus and Horticulture(离散化+前缀和)
题意:这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望。Lotus将所有的nn株盆栽都放在新建的温室里,所以所有盆栽都处于完全相同的环境中。每一株盆栽都有一个最佳生长温度区间[l,r][l,r],在这个范围的温度下生长会生长得最好,但是不一定会提供最佳的研究价值(Lotus认为研究发育不良的盆栽也是很有研究价值的)。Lotus进行了若干次试验,发现若第ii原创 2017-01-23 19:50:34 · 470 阅读 · 0 评论 -
poj 2492 A Bug's Life(并查集)
题意:有两种性别的bug,研究发现他们每个bug只和不同性别的人交流,给出一些bug之间交流记录,问这个研究是否正确解题思路:定义ran[i]记录i与祖先的关系,用带权并查集来存储bug之间的关系。如果交流记录里出现有两个bug在同一棵树上了,而且他们还是同一个性别,那么说明研究不正确,如果没有这样的两个bug,那么说明研究正确。代码:#include #in原创 2017-02-10 10:11:04 · 470 阅读 · 0 评论 -
poj 1703 Find them, Catch them(并查集)
题意:城市里有两帮犯罪团队,给你m条信息,D x y表示x和y不是同一帮,A x y是查询x和y的关系。解题思路:用带权并查集可以很好的解决这个问题,定义ran[i]为i与祖先节点的关系,0表示同帮,1表示不同帮。查询的时候如果两个点不在一棵树上,说明有节点的信息还没有给出过,那么不能确定两者之间关系,如果在同一棵树上而ran[x]==ran[y],那么说明他们是同帮,反之不同原创 2017-02-10 09:36:43 · 227 阅读 · 0 评论 -
Finding Nemo POJ 2049(bfs+dp思想)
Finding NemoTime Limit: 2000MS Memory Limit: 30000KTotal Submissions: 8804 Accepted: 2069DescriptionNemo(现场转播节目) is a naughty(顽皮的) boy. One day he went into t原创 2016-08-01 18:44:19 · 425 阅读 · 0 评论 -
pat 城市救援 最短路
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetic原创 2016-07-01 17:16:55 · 960 阅读 · 0 评论 -
poj 2528 Mayor's posters(线段树)
Mayor's postersTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 62535 Accepted: 18059DescriptionThe citizens of Bytetown, AB, could not stand that the原创 2017-03-14 22:10:39 · 340 阅读 · 0 评论 -
hdu 5316 Magician (线段树)
题意:给一个长度为n的序列,m个操作,操作有两种,1种是将a位置的数改为b,第2种是查询a到b位置的区间完美子段和,完美子段和要求相邻的两个数的位置的奇偶性不同。n,m范围都是【1,100000】, b的范围是【1000000000 ,1000000000】解题思路:线段树简单题查询次数过多肯定不能去暴力,需要用到线段树去维护。虽然是简单题但是弱渣还是做了蛮久。这个题的难点就是原创 2017-03-13 16:18:41 · 316 阅读 · 0 评论 -
poj 2155 Matrix (二维树状数组)
题意:一个初始为0的n*n矩阵,有m个操作,c为区间取反,q为单点查询解题思路:对于区间更新单点查询的题目,用树状数组是极好的,更新区间(a,b)我们update(a, 1), update(b+1, -1),然后查询的时候直接输出query(x)就是单点的值。这个题需要扩展到二维,其实解法类似, update(x1, y1, 1); update(x2+1, y1,原创 2017-04-07 22:09:56 · 301 阅读 · 0 评论 -
pta 是否完全二叉搜索树 (树的遍历)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入格式:输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。输出格式:将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,原创 2017-03-13 08:27:34 · 1127 阅读 · 0 评论 -
poj 2559 Largest Rectangle in a Histogram(单调栈)
题意:在二维坐标上,有n个相邻的矩形,每个矩形的宽为单位长度,高不相同,问能组成的最大子矩形面积。配合图片使用更佳:阴影部分即样例的最大矩形。解题思路:我们考虑每一个单位矩形,它能否以自己的高度和相邻的矩形组成一个新的矩形取决于旁边的矩形的高度是否不小于它,那么,我们如果能知道一个矩形左边第一个高度小于它的矩形的位置l,右边第一个高度小于它的矩形的位置r,那么我原创 2017-04-07 09:11:49 · 369 阅读 · 0 评论 -
pta 9 目录树 (30分) (树的遍历)
在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。输入格式:输入首先给出正整数N(\le 10^4≤104),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):原创 2017-03-10 21:12:18 · 2976 阅读 · 0 评论