
ACM_数据结构
羁绊残阳
四川大学计算机科学与技术
展开
-
Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D. Dense Subsequence 贪心 + RMQ
分析:固定长度为mm的区间不断右移动,只要这个区间内没有一个被选的元素就选择其中一个最小的,利用ST表的RMQ来做到。 这样求出必须要选择的最大的字母的次数,然后比它小的都要选。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue原创 2016-10-09 17:50:37 · 472 阅读 · 0 评论 -
SCU2016-04 H题 质因数处理 + 离线区间树状数组
Analyse: 这里求一个数左边第一不和它互质的数,用了维护质因子的方法。 求maxnmaxn以内所有数的质因子,复杂度为logmaxnlogmaxnlog^{maxn}log^{maxn} 对区间按左端点排序,离线处理。 树状数组来维护区间的和的应用: [l,r][l,r]区间满足条件的数加1,那么就是add(l,1)add(l, 1), add(r+1,−1)add(r + 1, -原创 2016-07-12 14:26:18 · 408 阅读 · 0 评论 -
SCU2016-07 N题 线段树
水线段树#include <iostream>#include <cstdio>using namespace std;#define root l, r, rt#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1struct jibancanyang{ int flower[212345 << 2], n;原创 2016-07-22 15:11:28 · 210 阅读 · 0 评论 -
SCU2016-07 O题 线段树
水线段树一颗。#include <iostream>#include <cstdio>using namespace std;#define root l, r, rt#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1struct jibancanyang{ int flower[51234 << 2], n;原创 2016-07-22 15:01:17 · 275 阅读 · 0 评论 -
2016 UESTC Training for Data Structures A题 线段树
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : 二 4/19 14:02:08 2016 *File Name : 2016 UESTC Training for Data Structures A.cpp *Pro原创 2016-04-19 14:37:01 · 347 阅读 · 0 评论 -
#bzoj 2038 莫队算法
bzoj 2038 莫队算法@(E ACMer)bzoj 2038 莫队算法题目抽象: 给定n(n<50000)n(n < 50000)个数,和q(q<50000)q (q < 50000)个询问,每个询问是[L,R][L, R]区间,问在这个区间中任意选两个数,选到相同的数的概率是多少?思路分析: - 首先容易有概率的数学公式:∁2a+∁2b+...+∁2x∁2r−l+1\frac{\com原创 2016-05-24 17:20:08 · 330 阅读 · 0 评论 -
Codeforces Round #340 (Div. 2) E 莫队算法
Codeforces Round #340 (Div. 2) E 莫队算法@(E ACMer)题目大意: 给你长度为n(n<=105)n(n <= 10^5),的序列,然后q(q<105)q(q < 10^5)个区间询问,询问该区间内有多少对(i,j)(i,j),让xi xor xi+1 xor .... xor xj == kx_i\ xor \ x_{i + 1} \ xor \ ....原创 2016-05-24 11:34:17 · 308 阅读 · 0 评论 -
cf665e.cpp 01 trie树求抑或
题意:给定一个数列,求其中抑或值大于等于kk的子序列的数量. 分析:首先知道抑或有类似于前缀和的区间性质,可以O(n2)O(n ^ 2)求任意区间抑或值.预处理前缀抑或,然后对以每个数结尾的抑或都去查其前面的子序列,显然这里复杂度是平方.然后我们就想到用trie树来维护一颗01字典树的经典用法,每次去查询当前点之前的前缀即可,而且可以有两个 剪枝最优化剪枝,如果之后的抑或值全为1都不能大原创 2016-04-26 17:25:10 · 606 阅读 · 0 评论 -
LeetCode 211.Add and Search Word - Data structure design(trie树)
题意:创建一个单词库,支持两种操作,给库里面加入新单词和查询某单词是否在库中,但是注意用’.’来做通配符,可以代替任意字符. 分析:trie树的改造.主要是通配符的处理.这里把搜索函数处理了一下,用递归实现,当配件通配符号的时候遍历它的所有26个分枝来求满足条件的.code:class WordDictionary {private: struct node { int原创 2016-03-23 20:29:09 · 307 阅读 · 0 评论 -
Codeforces E. Bear and Contribution(枚举维护)
@(E ACMer)题意:有n个人都有自己的初始成就值,对每个人可以有发博客(成就+5)和评论(成就+1).两种操作各自的花费时间分别为b和c.要求任意对任意人操纵,让最终至少有k个人有相同的成就值. 分析: 首先分两种情况讨论,如果(c∗5<=b)(c * 5 <= b),那么b操作就没有存在价值,需要执行A操作.排序之后,肯定是连续的k个(贪心一下容易理解),维护固定k长度的和即可求原创 2016-03-29 23:43:23 · 638 阅读 · 0 评论 -
SCU2016-04 G题 01trie树第k大,树上异或路径
Analyse: 树上任意路径的异或值看来是比较容易求得。 trie树求与当前数异或的第kk大,只需要记录size即可。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 二 7/12 15:23:29 2016**Pro原创 2016-07-13 00:08:45 · 1034 阅读 · 0 评论 -
SCU2016-01 C题 并查集维护
/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 7/ 4 15:09:42 2016**Problem**:**Analyse**:前提是一定有一个裁判。我们来枚举裁判,并屏蔽他,然后看剩余的时候不矛盾。判断不原创 2016-07-05 09:45:21 · 359 阅读 · 0 评论 -
SCU2016-06 Q题并查集 + set
题意:给你一些交换规则,然后求任意使用这些交换规则后,排列的字典序最大。 分析: 很容易想到贪心的满足前面的为最大的贪心。 然后对于这些交换规则建图,任意一个联通分量里的元素是可以互换的。 我们把这个联通分量的所有值加入一个set,然后从联通分量重靠前的数开始在set末尾取即可。 求联通分量用并查集即可。 心得: 并查集可以直接给连通分量标号。 二元互换关系很容易写成无向图中的边建图原创 2016-07-16 10:29:07 · 370 阅读 · 0 评论 -
Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (01trie树)
分析:01trie树经典应用,找异或最大值。这里只是多了一个删除操作,只需要记录前缀数,然后增删就可以了。 可以在每一个叶子节点记录当前数是多少。#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define pr(原创 2016-08-13 12:38:03 · 317 阅读 · 0 评论 -
Codeforces Round #371 (Div. 2) C. Sonya and Queries (01trie树)
分析:一看奇偶相互间隔,01trie树直接上,然后调试了整场…….最后Xcode单步调试才查出一个语句顺序错误,还是思维模型不真实。调试好之后只有30s提交wa5,然后发现数据是long long急忙改,还是没来得及,赛后把改了long long的交了就过了。。。 还有本场终于上紫色了JIBANCANYANGJIBANCANYANG 其实可以直接丢数组,因为2182^{18}种不多。。。。原创 2016-09-14 12:48:25 · 406 阅读 · 0 评论 -
hdu 5726 GCD (线段树 + 区间预处理)
分析:-用线段树来维护区间gcd。 -枚举右端点,从上一个右端点转移到以该点为右端点的所有区间的gcd值。 - gcd值是在10910^9的范围以内,所以用map来离散化。 - 以该点为区间右端点的话,所有区间的gcd数不会超过loga[i]log^{a[i]}。心得:求满足条件的区间的个数,通常就是枚举端点,然后区间之间相互转移。#include <iostream>#in原创 2016-07-22 11:24:51 · 524 阅读 · 0 评论 -
Codeforces Round #367 (Div. 2) E. Working routine (十字链表,二维高效交换)
分析链表和数组是两对极端,链表定位慢,增删交换快。而块状链表是二者的综合体 这里大概是一维链表高效交换的二维版本。 维护一个十字链表即可。 十字链表没有必要记录每个元素上下左右的所有元素,只需要记录下和右即可,维持要增加第0行和0列。 对于矩阵交换,暴力的更新整个矩阵周长两边的节点的值即可,复杂度O(q×(m+n)O(q \times (m + n)#include <cstdio>#in原创 2016-08-15 19:05:54 · 326 阅读 · 0 评论 -
Codeforces Round #363 (Div. 2) Problem D - Fix a Tree(并查集 + 构造)
分析: 这题得先分析,每一个连通分量的性质: - 这个连通分量要么有一个根节点,要么有一个环,且最多只有一个环。我把这些根节点转入一个容器,把这些形成环的节点(在并查集合并连通分量的时候判断)装入另一个容器。 优先选择已经成为根节点的作为根,否则选择环节点。然后把容器里的其他所有节点连接到根。 心得: 观察性质,简化代码。#include <iostream>#include <vect原创 2016-07-20 11:15:11 · 320 阅读 · 0 评论 -
SCU2016-03 K题 线段树单点更新 + 更新极限次数
Analyse: 线段树维护区间和模板题,加一个条件,因为每个数最多被开方7次 就变成1了,所以对于为1的数我们就不需要更新了。 这里就是区间和等于区间长度,表面该区间全部为1。 Get: 线段树单点更新的固定套路。/**********************jibancanyang************************** *Author* :jibancan原创 2016-07-08 13:40:50 · 519 阅读 · 0 评论 -
hdu 5774 Bubble Sort(树状数组)
分析: 对于在位置ii的数字aia_i,假设它右边有fif_i个比它小的数字,它能被移动的最右边的位置是i+fii+f_i。 二个这个数字的最左边位置要么是它的起始位置,要么是它排序后的最终位置,所以它的最左边位置就是:min(ai,i)min(a_i, i)。 求fif_i用数组数组求逆序对的方法,求它左边有多少个比它小的数字然后计算出它右边比它小的数字个数即可。#include <cstd原创 2016-07-28 16:04:27 · 377 阅读 · 0 评论 -
SCU2016-01 D题 并查集判断连通
Analyse: 判断连通用并查集。这里就是左右两边的绝境被黑色连通了,那么就不行了。 用两个特殊数字分别表示左右绝境,并查集即可。 注意黑色会和周围8个而不是4个连通。 Get: 一组就是一块。/**********************jibancanyang************************** *Author* :jibancanyang *Cre原创 2016-07-05 21:35:26 · 328 阅读 · 0 评论 -
SCU2016-01 M题
Author :jibancanyang Created Time : 二 7/ 5 15:44:46 2016 Problem: Analyse: 很容易想到状态定义:dp[i][j]dp[i][j],表示前ii天,有jj个股票的最大利润。 然后也容易写出转移方程,即使有个隔ww天,那么隔ww再转移不就好了。 dp[i][j]dp[i][j]必须继承dp[i−1][原创 2016-07-05 21:23:04 · 425 阅读 · 0 评论 -
soj 2249 Mayor's posters(带相邻处理的离散化 + 线段树)
@(K ACMer) 题意: 一堵墙,海报覆盖于其上,问可以看到的海报有多少个? 分析: 非常典型的线段树的应用,但是此题空间过大,需要离散化,而且不是一般的离散化,因为每个坐标点代表的是一个格子,而不再是一个刻度. 普通离散化的思路是,把数据中出现的数通通由小到大的排序后去重,它对应的数组下标就是其离散化后的值,每次要用二分去数组中差这个值对应的离散化后的坐标值. 比如有这样两张海报[原创 2015-11-03 21:27:24 · 604 阅读 · 2 评论 -
soj 3329: Maximum Submatrix II(单调栈)
@(K ACMer) 题意: 给你一个n *m的01矩阵,求其中元素全为0的最大子矩阵的最大面积. 分析: 最暴力的方法是枚举每一个点为子矩阵左上顶点,然后来暴力判断以它为顶点的最大0子矩阵的最大大小.这样重的复杂度是O(n4)O(n^4),TLEEEEEEEE 也可以DP一下,复杂度是O(n3)O(n ^3),还是TLEEEE.. 无法可解… 看了别人的做法: 维护一个前缀,然后对原创 2015-11-02 22:06:12 · 502 阅读 · 0 评论 -
Codeforces 596E Wilbur and Strings(序列自动机)
@(K ACMer)题意: 在一个n∗mn*m的图上,每个空格写着0−90-910个数字中的一个.有两个长度为10的数组a1,a2...ana_1,a_2...a_nb1,b2,b3,...bnb_1,b_2,b_3,...b_n,表示转移向量.当走到一个格子(x,y)(x,y)上时,如果它上面的数字为t,他必须走到(at+x,y+bt)(a_t + x, y + b_t)格子去(除了,加上偏移量原创 2015-11-25 17:45:38 · 2026 阅读 · 2 评论 -
poj 3468 A Simple Problem with Integers (线段树区间更新 + 树状数组区间更新)
@[K ACMer]题意:支持两个操作: - 求任意任意区间元素的和 - 对任意区间更新元素的值分析:就是对线段树进行区间更新的操作,用一个lazy数组来延迟下推,只有当查到这里的时候才计算.这样让区间更新的复杂度变为了log(n)log(n) 其实只是对区间完全包含的情况就把区间暂存在这里不蔓延到儿子,查寻的时候来查即可. 也可以用经典的树状数组来做: __树状数组除了最显然的是维护区间原创 2015-10-06 11:25:39 · 446 阅读 · 0 评论 -
soj 2978 Tasks
@(K ACMer) 题意 数组a全部为0,给你一个和数组a同样大小的数组b,你可以选择把任意一个a[i]a[i]变成b[i]b[i].但是保证必须保证a中所有元素的和小于t. 定义f(a)为a数组中最长的连续0的个数,求f(a)的最小值. 分析: 看起来这个题,要直接求出来最优结果似乎是不可能的,最暴力的枚举是2的指数次的显然不可行. 我们可以二分的来枚举这个最长区间的长度k.然后去判原创 2015-11-04 14:25:46 · 394 阅读 · 0 评论 -
2057 The manager's worry(树状数组)
@(K ACMer) 题意: 单点更新,区间查寻素数个数. 分析: 构造一个树状数组就可以了,定义sum[i]为[1,i][1, i]的素数个数.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#i原创 2015-11-03 11:03:24 · 368 阅读 · 0 评论 -
soj 1862 Choice Pears(优先队列)
@(K ACMer) 题意: 每次取n个堆上最小的一个的贪心策略. 分析 最小堆即可.STL里面的优先队列可过,自己写了仿函数.code#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#includ原创 2015-11-03 11:50:32 · 651 阅读 · 0 评论 -
poj 2059 单调栈
题意:求柱状图中最大矩形面积。单调栈:顾名思义就是栈内元素单调递增的栈。每次插入数据来维护这个栈,如果当前需要插入的数据小于栈顶的元素,那就一直弹出栈顶的元素,直到满足当前需要插入的元素大于栈顶元素为止。可以容易求出某个数左边或右边,第一个大于或小于它的数,且复杂度是O(n)O(n)。思路:容易先想到一个好的枚举方式:以当前柱状为扩展点,往左边和右边扩展,当遇到一个比当前柱状小的柱状时停止扩展,原创 2015-07-20 10:59:27 · 812 阅读 · 0 评论 -
挑战程序设计竞赛 二叉堆(优先队列)的实现
几个概念:完全二叉树:是指除叶子节点那层外,叶子节点以上的第k层都含有2k2^k个节点而且叶子节那层的节点都靠左方。满二叉树:与完全二叉树先比,多了连叶子节点也要全满的限制条件。堆的代码实现(数组实现):int heap[10000], sz = 0;void push(int x) { //向堆里面增加元素X int i = sz++, p; while(i > 0)原创 2015-04-17 18:26:17 · 754 阅读 · 0 评论 -
poj 3253 哈夫曼树
背景:开始自己想了一个贪心思路,结果是错的。其实这个题是哈夫曼树的思想,贪心只是哈夫曼树的证明和构造思想。 哈夫曼树:一种带权最短二叉树(也就是所有叶子节点的权重乘以深度的和最小),在实际中是用来做最高效信息编码的。信息的频率就是权重,一个频率很低的数,它的编码就应该长,树的深度就应该大。实际信息编码会根据信息字符的频率来构建一个哈夫曼树,已达到最高效。本题和哈夫曼树是一个很好的契合,解决本题原创 2015-04-26 09:03:35 · 949 阅读 · 0 评论 -
UVa 514 数据结构栈
背景:1A思路:栈模拟我的代码:#include #include #include #include #include #include #include #include #include #include #define LL long long intusing namespace std;const int M=1009,INF=0x3fffffff;i原创 2015-04-07 18:06:05 · 568 阅读 · 0 评论 -
poj 2431 优先队列&贪心
几个概念:完全二叉树:是指除叶子节点那层外,叶子节点以上的第k层都含有2k2^k个节点而且叶子节那层的节点都靠左方。满二叉树:与完全二叉树先比,多了连叶子节点也要全满的限制条件。堆的代码实现(数组实现):int heap[10000], sz = 0;void push(int x) { //向堆里面增加元素X int i = sz++, p; while(i > 0)原创 2015-04-18 17:38:12 · 556 阅读 · 0 评论 -
soj 3336 Diary(trie树)
@(K ACMer)题意: 给你一个大字符串,是日记的编码.每个女生的名字对应一个长度为10的编码.求在日记中出现次数最多的编码所对应的名字分析: 典型的trie树的应用,字符串计数.先把日记建立trie树,然后去查,每个字符串出现多少次即可.#include <iostream>#include <cstdio>#include <cstring>#include <set>#incl原创 2015-11-08 20:23:38 · 403 阅读 · 0 评论 -
#soj 3076 相同字符串(tire树)
@(K ACMer)题意: 依次给 n 个全部由小写字母构成且长度不超过 300 的非空字符串求每个字符串之前的字符串中与当前字符串完全相同的个数. 分析: 一种思路: 很直接的可以用map来查,但是map节点之间比较的时候时间比较长,就把字符串hash一下,开始裸的hash wa了,优化了hash函数加了个长度相关也就过了. 这里主要学习trie树实现的思路: 树节点维护的是当前节点为原创 2015-11-08 03:16:47 · 368 阅读 · 0 评论 -
soj 3596 Article Decryption(trie树 + dp)
@(K ACMer)题意: 给你一些单词,和一个长字符串s,s是由这些单词组成的,总共有多少种组成的可能? 分析: 问有多少种可能显然的dp,很容易的想到定义dp[i]dp[i]为s前i个字符形成的字符串最多有多少种可能,则有转移方程:dp[i]=∑j=0i−1isword(j+1,i) ? dp[j] : 0dp[i] = \sum _{j = 0}^{i - 1} isword(j +原创 2015-11-08 16:29:07 · 429 阅读 · 0 评论 -
Codeforces 597C(树状数组 + dp)
@(K ACMer)题意: 由1到n,共n个数构成的序列中长为k + 1的上升子序列有多少个? 分析: 注意到题中数字是1到n,且子序列最长只有11.我们可以这样定义状态:dp[i][j]dp[i][j]为长度为i的子序列中,末尾数以j结尾的个数. 那么容易有转移方程:dp[i][j]=∑t=1...j−xdp[i−1][t]dp[i][j] = \sum_{t = 1...j -x}dp原创 2015-11-20 12:24:54 · 1095 阅读 · 2 评论 -
soj 3085: windy's cake V
@(K ACMer)题意: 给你n个数,对于一个连续的数串,它的美味度是,他其中的最小值乘以它这个数串中所有数的和,问能得到的美味度最大的数串是多少? 分析: 首先只要我们去枚举区间的开头和结尾就必须承受O(n2)O(n ^2)的复杂度,就意味着要TLE,这里是行不通的. 我们可以换一个思路,不枚举区间而是枚举区间的最小值,再去找到这个区间.如果把当前数当做最小值,那么它的区间可以到,其左边原创 2015-11-01 19:52:07 · 469 阅读 · 0 评论 -
soj 3139 Sliding Window(单调队列)
@(K ACMer) 题意 维护固定长度子区间的最大最小值. 分析 最经典的单调队列的应用,其实究其根本是用了记忆化和剪枝的思想,使整个效率很高.剪枝的思想,就是对于下标小于当前数,且值大于当前数的数,永远没有用(维护最小值的时候).code#include <iostream>#include <cstdio>#include <cstring>#include <set>#inc原创 2015-11-01 16:37:25 · 272 阅读 · 0 评论