
ACM 数据结构
Tuesday..
这个作者很懒,什么都没留下…
展开
-
HDU 1754_I Hate It
【题意】给定区间求最大值【分析】线段树单点更新【代码】#include#includeusing namespace std;const int maxn=1<<21;const int INF=0x3fffffff;int Max=0;int mid;struct Node{ int l,r;//左孩子,右孩子 int value;}N[maxn];原创 2015-12-13 16:09:11 · 393 阅读 · 0 评论 -
Codeforces 645B Mischievous Mess Makers【逆序数】
题目链接:http://codeforces.com/problemset/problem/645/B题意:给定步数和排列,每步可以交换两个数,问最后逆序数最多是多少对?分析:看例子就能看出来肯定是不断往中间逼近,然后交换头尾两个,给定交换的对数,直接算就好了,复杂度O(1)O(1)代码:#include<iostream>using namespace std;typedef long lon原创 2016-03-19 14:28:49 · 481 阅读 · 0 评论 -
Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意:有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k。分析:dp+矩阵快速幂。 假如现在的数是m,模x余数是n,那么再从下一个block中选一个数a,a模x余数为b,那么新的数的余数就为(m∗10+a)(m*10+a)%x,也就是(n∗10+b)(n*10+b原创 2016-02-18 10:19:45 · 625 阅读 · 0 评论 -
Codeforces 651E Table Compression【并查集】
占坑补题原创 2016-03-12 10:01:38 · 602 阅读 · 0 评论 -
POJ 1741 Tree【树分治】
第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了。。 以后做题中再慢慢体会学习。题目链接:http://poj.org/problem?id=1741题意:给定树和树边的权重,求有多少对顶点之间的边的权重之和小于等于K。分析:树分治。 直接枚举不可,我们将树划分成若干子树。 那么两个顶点有两种情况:u,v属于同一子树的顶点对u,v属于不同子树的顶点对第一种情况,对子树递原创 2016-04-27 19:11:46 · 794 阅读 · 0 评论 -
POJ 2431 Expedition【贪心】
题意:卡车每走一个单元消耗一升汽油,中途有加油站,可以进行加油,问能否到达终点,求最少加油次数。分析:优先队列+贪心代码:#include<iostream>#include<queue>#include<algorithm>using namespace std;const int maxn = 10055;typedef pair<int, int>pii;pii p[maxn];原创 2016-02-07 23:21:44 · 411 阅读 · 0 评论 -
Codeforces 635D Factory Repairs【树状数组】
又是看了很久的题目。。。题目链接:http://codeforces.com/contest/635/problem/D题意:一家工厂生产维修之前每天生产b个,维修了k天之后每天生产a个,维修期间不生产。 若干操作: 1. 1 d aa 第d天要求aa个订单,一个订单对应一个物品,必须在这一天中完成。 2. 2 d 第d天开始维修,最终能得到多少订单。分析:树状数组分别维护维修前和维修后得到的原创 2016-05-10 13:14:00 · 949 阅读 · 0 评论 -
SPOJ 357 QTREE【树链剖分 + 线段树】
前几天看漆子超的论文,可是只看了树的分治没有看熟练剖分那里。(熟练剖分可以看做链分治) 今天刚好看了卿学姐的树链剖分视频,照着模板写了道入门题。题目链接:http://www.spoj.com/problems/QTREE/题意:给定一棵树,及树边端点的权值,有以下两种操作:将第ii个边的权值改为tit_i查询结点a,ba,b之间路径上的边的最大值。分析:很全面的讲解资料 http://bl原创 2016-05-13 23:44:37 · 663 阅读 · 0 评论 -
Codeforces 691E Xor-sequences【矩阵快速幂,好题】
题目链接:http://codeforces.com/problemset/problem/691/题意:给定序列,从序列中选择k(1≤k≤1e18)k(1 \le k \le 1e18)个数(可以重复选择),使得得到的排列满足xi与xi+1{x_i} 与{x_{i+1}}异或的二进制表示中11的个数是33的倍数。问长度为kk的满足条件的 序列有多少种?分析:首先每个元素自己构成一个长度为11的满足原创 2016-07-15 21:01:26 · 2078 阅读 · 0 评论 -
Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
题目链接:http://codeforces.com/problemset/problem/622/C题意:给定序列,若干查询,每个查询给定区间和tt,输出区间内任意一个不等于tt的元素的位置。分析:最初没看样例直接钦定输出每个不等于tt的元素位置,结果怎么想都是n2n^2复杂度的,后来看了样例才发现是输出任意一个。。 对于一个区间,如果区间最大值和最小值相等,那么该区间元素值全部相同,那么我们维原创 2016-07-06 22:49:17 · 621 阅读 · 0 评论 -
HDU 4777 Rabbit Kingdom【树状数组】
题意:给定序列,若干询问,求给定询问区间中互质的数的个数。分析:智商太低理解了好久好久,最后还是看别人代码明白的。 设l[i]l[i]为位置为ii的元素左边第一个与w[i]w[i]不互质的数,r[i]r[i]为右边第一个与w[i]w[i]不互质的数,那么(l[i],r[i])(l[i], r[i])区间内的所有数均与w[i]w[i]互质。 假设我们从头开始扫,为了防止重复计算,我们不管ii左边的原创 2016-07-12 12:53:30 · 761 阅读 · 0 评论 -
HDU 5046 Airport【DLX重复覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046题意:给定nn个城市的坐标,要在城市中建kk个飞机场,使城市距离最近的飞机场的最长距离最小,求这个最小距离。分析:最小化最大值,显然二分最大距离。然后我们将距离在范围内的两个城市建边,看能否选出kk个城市,使得覆盖了所有城市。 将点之间的关系转化成01矩阵的覆盖问题,重复覆盖,建好边套个DLXDL原创 2016-07-09 10:43:06 · 889 阅读 · 0 评论 -
HDU 4193 Non-negative Partial Sums【单调队列】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4193题意:给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前ii项和均大于等于0(1≤i≤n1 \le i \le n)?分析:先将数组前后拼接起来,记录每个位置的前缀和。然后去找长度为n的滑动窗口,在这个窗口内,要保证前ii项和大于等于0,也即区间[i,n+i][i,n原创 2016-03-30 11:47:15 · 475 阅读 · 0 评论 -
占坑补题
Codeforces 658 E. Bear and Contribution原创 2016-03-29 22:10:45 · 480 阅读 · 0 评论 -
POJ 1769_Minimizing maximizer
题意:一系列m个1~n区间,每个区间固定对某个子区间进行排序,顺序选择若干区间,使最终覆盖所有区间。分析: computes the length of the shortest subsequence of the initial sequence of sorters still producing correct results for all possible input data要想原创 2016-02-17 14:44:49 · 1114 阅读 · 0 评论 -
POJ 1182_食物链
题意:三种动物A,B,C,A吃B,B吃C,C吃A, 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是”1 X Y”,表示X和Y是同类。 第二种说法是”2 X Y”,表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 1) 当前的话与前面的某些真的话冲突原创 2016-02-08 00:53:15 · 386 阅读 · 0 评论 -
Codeforces 629D Babaei and Birthday Cake(线段树优化dp)
题意:nn个蛋糕编号从小到大编号,jj号蛋糕可以放在ii号上面,当且仅当jj的体积严格大于ii且i<ji<j,问最终可得的最大蛋糕体积。分析:实质为求最长上升子序列问题,设dp[i]dp[i]从头开始到第i位的最长子序列长度,可以想到O(n2)O(n^2)的做法,状态转移方程:dp[i] = max(dp[j], j >= 0&& j < i && v[j] < v[i]) + v[i];但是nn可原创 2016-03-01 13:16:07 · 593 阅读 · 0 评论 -
Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意:线段树做法分析:因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化。比线段树快了12ms~代码:#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;//[)const int maxn = 100005, INF = 0x3fffffff;原创 2016-03-01 20:14:07 · 443 阅读 · 0 评论 -
POJ 3468_A Simple Problem with Integers(线段树)
题意:给定序列及操作,求区间和。分析:线段树,每个节点维护两个数据:该区间每个元素所加的值该区间元素和代码:#include<cstdio>#include<iostream>#include<cmath>using namespace std;typedef long long ll;//[l,r)const int maxn = 300005;ll sum[maxn], ad原创 2016-02-13 11:13:32 · 364 阅读 · 0 评论 -
POJ 3468_A Simple Problem with Integers(树状数组)
完全不知道该怎么用,看书稍微懂了点。题意:给定序列及操作,求区间和。分析:树状数组可以高效的求出连续一段元素之和或更新单个元素的值。但是无法高效的给某一个区间的所有元素同时加个值。 不能直接用树状数组求,就处理一下。用两个树状数组维护两个数据,一个维护前ii项和,一个维护增加的值。设:∑j=1iaj=sum(bit1,i)∗i+sum(bit0,i)\sum_{j=1}^i a_j=sum(bit原创 2016-02-13 12:21:19 · 538 阅读 · 0 评论 -
静态区间第k大(划分树)
划分树:思想:利用快速排序思想,建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半。查询时,在建树过程中利用leftsum[p][i]leftsum[p][i]数组保存有多少个数划分到第pp层,第ii个位置的左边。每次查询计算出每个区间有多少数被放入左子树,小于等于kk则说明所求数在左子树,继续查询其左子树,反之则查询右子树。l==rl==原创 2016-02-13 22:34:02 · 856 阅读 · 2 评论 -
静态区间第k大(归并树)
POJ 2104为例思想:利用归并排序的思想:建树过程和归并排序类似,每个数列都是子树序列的合并与排序。查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数,否则递归的对子树进行求解并相加。使用STL中的merge对子序列进行合并及排序。时间复杂度O(nlogn+mlog3n)O(nlogn+mlog^3n)代码(vector实现):#include<cs原创 2016-02-15 12:05:28 · 936 阅读 · 0 评论 -
静态区间第k大(分桶法和平方分割)
思想:《挑战程序设计竞赛》中介绍的方法。 分桶法:把一排物品或者平面分成桶,每个桶分别维护自己内部的信息,已达到高效计算的目的。设一共有nn个数,一个桶有bb个数,给定区间,求小于x的数的个数对于完全包含在区间内的桶,直接二分查找满足条件的个数,每个桶处理需要O(logb)O(logb)的时间。剩余的不完全分布在其他桶的数,逐个查找,每个元素处理需要O(1)O(1)的时间。可以看出,应该原创 2016-02-15 12:33:23 · 1709 阅读 · 4 评论 -
静态区间第k大(主席树)
POJ 2104为例(主席树入门题)思想:可持久化线段树,也叫作函数式线段树,也叫主席树(高大上)。 可持久化数据结构(Persistent data structure):利用函数式编程的思想使其支持询问历史版本、同时充分利用它们之间的共同数据来减少时间和空间消耗。 主席树:对原序列的每一个前缀[1..i][1..i]建立出一棵线段树维护值域上每个数的出现次数(所以要先离散化)。线段树每原创 2016-02-16 12:52:12 · 1004 阅读 · 2 评论 -
POJ 3734_Blocks
题意:用红绿蓝黄四种颜色对一序列n个方块涂色,求出绿和红色方块数同时为偶数的染色方案数。mod=10007mod=10007分析:dp+矩阵快速幂 首先明确有三种状态:红和绿均为偶数红和绿只有一个为奇数红和绿均为奇数设前三种方案数分别为aia_i,bib_i,cic_i,则可以得到以下递推式: ai+1=2∗ai+bibi+1=2∗ai+2∗bi+2∗cici+1=2∗cia_{i+1}原创 2016-02-16 21:22:57 · 579 阅读 · 0 评论 -
POJ 3233_Matrix Power Series
题意:求n*n矩阵的幂和分析:逐个加起来时间复杂度太高,通过在矩阵中套个矩阵和,再利用矩阵快速幂,最后时间复杂度为O(n3logn)O(n^3logn)代码:#include<cstdio>#include<iostream>#include<cstdio>using namespace std;typedef long long ll;const int N= 85;int n;st原创 2016-02-17 09:34:45 · 340 阅读 · 0 评论 -
HDU 5722 Jewelry【线段树,矩形面积并】
题意:给定序列,求满足区间内存在一种珍珠正好出现xx次的区间个数。分析:枚举左端点,找右端点的可行区间。 对于每一个珍珠,从头开始枚举左端点,对于每一个左端点ll,维护满足区间[l,r][l,r]内该种珍珠正好出现xx次的右端点rr,由于存在一个连续的区间内,区间内珍珠的数目是不变的,那么我们把这些得到的满足条件的区间并起来, 就得到了左端点对应的可行右端点的区间,求区间并我们可以用线段树,类似求原创 2016-07-18 19:41:26 · 554 阅读 · 0 评论