自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

mysterious

稳定切水!

  • 博客(28)
  • 收藏
  • 关注

原创 [HDU 1757] A Simple Math Problem (矩阵快速幂)

链接HDU 1757题意当i < 10时,f(i) = i;当i >= 10时,f(i) = f(i-1) * a0 + f(i-2) * a1 + … + f(i-10) * a9。 a0到a9都是1或0,给出a0到a9,求f(k)。题解一道比较容易的矩阵构造,新生成的那项f(new)需要之前的10项乘系数求和,显然需要一个向量(f(new-1), f(new-2), …, f(new-10))

2016-09-30 14:57:12 283

原创 [POJ 1588] Gauss Fibonacci (矩阵快速幂)

链接HDU 1588题意求若干项fibonacci数列的sum(fibonacci[j]),j = k*i + b。 fibonacci数列的等差数列项求和。题解矩阵快速幂的一个经典例题就是快速求出某项fibonacci数。 还有一个经典问题,可解决A + A^2 + … + A^n,矩阵快速幂求和。 事实上这道题目是两者的综合,fibon的第k项等价为某矩阵F的k次幂F^K(中的某项),第2

2016-09-30 14:12:52 373

原创 [POJ 3233] Matrix Power Series (矩阵快速幂)

链接POJ 3233题意A是一个矩阵,求A + A^2 + A^3 + … A^k。题解有一个经典解法,构造矩阵: |A E | |0 E | 该矩阵自乘k次,得到的矩阵为: |A^k E + A + A^1 + … + A^(k-1)| |0 E | 很容易验证。感觉它的巧妙

2016-09-30 11:30:22 229

原创 [POJ 3070] Fibonacci (矩阵快速幂)

链接POJ 3070题意求fibonacci数的第k项。题解基本上是题目告诉了你一个结论: 矩阵 |1 1| |1 0| 的k次幂就是 |fibon[k+1] fibon[k]| |fibon[k] fibon[k-1]| 由于k比较大,所以需要用到矩阵快速幂。 但是这个结论还是比较有用的,可以在logn级求出fibonacci的第k项。代码#include <cstdio>

2016-09-30 10:15:10 246

原创 [POJ 2406] Power Strings (kmp循环节)

链接POJ 2406题意给出一个字符串,输出其最短循环节长度。题解首先说一下循环节,其实每个字符串都是有循环节的,最长的循环节就是它本身。 如果一个字符串s可以写成某个字符串d复制k次得到的,那么d就是s的循环节,最短循环节就是d中最小的一个。其实这题是很容易解的,我们对该字符串s求next数组,相当于得到了所有与s后缀匹配的真前缀,一一检测即可。 但是总结这题主要是为了一个结论,其实无需求出所

2016-09-29 16:31:00 404

原创 [POJ 2778] DNA Sequence (AC自动机+trie图+矩阵快速幂)

链接POJ 2778题意给出一些关键词,问长度为n的不含有这些关键词中任何一个的字符串有多少个。 关键词和字符串均由’A’、’C’、’T’、’G’四个字符构成。题解一道关于trie图的题目。首先补充一个关于“矩阵和有向图”的知识: 现在有一个有向图含有n个点,可以用一个n*n的邻接矩阵代表该图节点间的关系。现在问你从i节点到j节点走k步,有多少种走法。 事实上我们算出该矩阵的k次幂矩阵gk,g

2016-09-29 15:44:50 281

原创 [HDU 5880] Family View (AC自动机)

链接HDU 5880题意青岛网络赛的题目,其实挺简单的裸题,不知道为什么没看到。。。还好最后申进去了。 给出一些关键词和一个长文本,需要将长文本中出现过关键词的地方用’*’代替。题解AC自动机的裸题,典型的多文本匹配。 在建trie树的时候需要传递关键词的长度len,insert后nd[now]=len。这样在建好自动机匹配的时候可以记录cover[i],表示i位置出现的长度为cover[i]的

2016-09-29 13:49:06 359

原创 [POJ 2104] K-th Number (主席树)

链接POJ 2104题意给出一个序列,m组查询,对每个查询(i, j, k)需要输出区间[i, j]中第k大的数。题解主席树的入门题。 主席树其实就是可持久化线段树,比如现有n组操作,每组操作可更改序列中a[i]的值,并且需要支持序列求和,当然这个问题通过线段树很好解决。比如某种询问,需要你退回到第k步操作以后,这就需要可持久化线段树去解决。 事实上上述问题也有一种离线的做法,由于操作可退回到之

2016-09-27 12:48:30 312

原创 [HDU 5892] Resident Evil (二维树状数组)

链接HDU 5892题意沈阳网络赛A题。。。 给出一个n*n的矩阵,m组操作,每次操作可以向一个矩形范围内投掷多种怪兽(一共50种),每种若干只,每次操作也可以查询某个矩形范围内怪兽的奇偶性,每次输出50种怪兽的奇偶性。题解只关注怪兽的奇偶性,并且怪兽种类50只,那么每次投放的怪兽可以压缩在一个longlong变量内,就变成了二维树状数组的经典问题,区间异或问题。题解#include <cstdi

2016-09-21 14:34:49 573

原创 浅谈树状数组

时间戳对于区间更改和查询问题,之前我是一直用线段树解决的,这种结构真的很优美很强大,至于树状数组这个东西,我看到“树状数组能做的线段树都可以做,线段树能做的树状数组却做不了”类似的话以后就没当回事。 再往后是做过几道优化查询的问题,用线段树T了,改成树状数组过了,时间效率高出线段树数倍(丝毫不夸张,尽管复杂度相同),才开始关注这个结构,事实上线段树的常数是相当大的,如果题目只是优化查询,不涉及la

2016-09-21 13:25:21 378

原创 [Codeforces 341D] Iahub and Xors (二维树状数组)

链接Codeforces 341D题意给出一个n*n的矩阵,初始值均为0,然后m组操作,可以给出一个矩形区域,使其中元素都异或某值,也可以给出矩形区域,查询其中所有元素的异或值。题解二维树状数组的经典题目,跟异或操作结合。 二维树状数组的基本功能是单点更新和区间查询,当然只能查询某点到(1, 1)点的值,也可以利用差分的思想改成区间更改和单点查询。这里是异或操作,事实上跟加减法的运算规律类似,也是

2016-09-21 10:36:58 876

原创 360 2017笔试程序题

第一题题意:给出一个3x3矩阵,判断该矩阵是否关于(2, 2)对称。 题解:。。。 代码:#include <cstdio>#include <iostream>using namespace std;char g[10][10];int main(){ while(~scanf("%s", &g[1][1])) { scanf("%s%s", &g[2

2016-09-20 20:46:56 354

原创 完美世界2017C++游戏开发笔试编程题

第一题题意:给出一个序列a,需要找到一对位置(i, j)(j > i),使得a[j] - a[i]的值尽量大,同时i尽量大并且j尽量小,如果任意a[j] - a[i]都<=0,则输出-1,-1。 题解:从1到n扫一遍序列处理即可,i尽量大用>=,j尽量小用>即可。 代码:#include <cstdio>#include <iostream>using namespace std;#def

2016-09-20 18:26:02 3524

原创 [POJ 2155] Matrix (二维树状数组)

链接POJ 2155题意给出一个N*N的01矩阵,起初均为0,T组询问,一种给出矩形的左上角点和右下角点的坐标,使得矩形内元素取反,另一种给出一个点的坐标,问该点是0还是1。题解二维树状数组的一道经典题目。 二维树状数组是树状数组在二维的拓展,支持的操作是单点增减值和查询原点(1, 1)到目标点(x, y)的值总和。 但是这道题目是区间增减值和单点查询值,区间值的翻转可以在区间4个端点打一个标记

2016-09-20 18:07:36 309

原创 [HDU 5893] List wants to travel (树链剖分+区间合并)

链接HDU 5893题意沈阳网赛的第二题。。。 给出一棵N个点的树,边含权,然后是M个操作,每个操作“Change a b c”改变节点a到节点b的路径上权值为c,“Query a b”询问节点a到节点b路径上有多少个权值相同的段。 差不多是裸的树链剖分,维护好树链以后就可以利用线段树记录区间左右端点值做合并了。 这里需要注意的是树上的链的合并计数也需要链的端点值,u、v两点可能需要跨很多链最

2016-09-19 18:16:15 266

原创 [SPOJ QTREE] Query on a tree (树链剖分)

链接SPOJ QTREE题意给出一个树,边带权,然后给出若干个询问,询问分QUERY a b和CHANGE i ti两种,前者查询节点a、b之间经过不重复路径的最大边权,后者改变第i边权值为ti,对每个QUERY操作输出相应结果。题解树链剖分的裸题。 沈阳网赛上吃了亏,补一下比较高级的数据结构,其实树链剖分并没想的那么复杂(对深搜做法而言)。 大致介绍一下树链剖分,和记录它的整个过程如下: 树

2016-09-19 09:18:20 210

原创 [HDU 5649] DZY Loves Sorting (线段树+二分)

链接HDU 5649题意给出一个1到n的全排列,然后m组操作,对每组操作(opt, l, r),若opt为0,则将区间[l, r]内元素升序排序,若opt为1,则倒序排序,最终给出一个k,问m组操作后,第k个元素的值。题解是一道很棒的二分题,注意到题目条件的特殊性,一个在于“全排列”,一个在于最终只给出了一个需要查询的位置。 想象下m组排序过后序列的样子,如果我们将大于等于b的元素看做1,小于b的

2016-09-13 18:51:41 495

原创 网易2017运维工程师笔试题(程序题)——山寨题解

第一题题意:某人想买n个苹果,水果摊只有6个一袋和8个一袋两种售卖方式,问是否能按袋买进正好凑足n个,如果可以,输出最少包数,不可以则输出-1。 题解:跟蓝桥杯初赛题目难度类似。排列问题,n规模很小,不超过100,深搜一下,每层递归保存剩余苹果数目,先尝试放8个,如果无解再尝试放6个,到某层如果剩余数目为0则满足条件,输出层数后返回。 代码:#include <cstdio>#include

2016-09-12 21:17:31 3437

原创 [HDU 5869] Different GCD Subarray Query (线段树GCD+离线算法) (好题)

链接HDU 5869题意2016大连站网赛1002题。 给出一个长度为N的序列和Q个询问,对每个询问[l, r],输出该区间和其子区间产生的不同gcd个数。题解一道比较好的线段树gcd离线处理的题目,据说FZU2222是原题。 有个类似的题目,HDU3333,也是线段树加离线处理。先将Q个区间离线记录,按照右端点排序。然后从左向右枚举区间端点,记录以i为区间右端点的各个子区间产生的不同gcd和产

2016-09-12 16:41:32 419

原创 [HDU 5875] Function (单调栈/(RMQ+二分))

链接HDU 5875题意2016大连站网赛的1008。 给出一个长度为N的序列,和Q组询问,对每组询问[l, r],输出a[l] % a[l+1] % … % a[r],l等于r的时候输出a[l]即可。题解这题网上貌似有各种解法花式AC,这里给出两种。第一种是预处理+暴力,对序列a,对a[i]求出其右侧第一个小于等于a[i]的值的下标,因为大于某个余数的值是没有意义的,在查询的时候可以加速计算,跳

2016-09-12 13:19:08 351

原创 [HDU 8577] Weak Pair (DFS+线段树)

链接HDU 8577题意给出一棵树,每个节点含有一个权值,问有多少个节点对满足存在祖先后代关系,并且满足权值之积不大于k。思路对树进行一次深搜,很容易保存某节点所有祖先的权值,这里我们需要把到达节点的祖先的权值维护成一个有序表,这样我们算出和当前节点的权值相乘不大于k的最大因子,在有序表里查询不大于k的权值个数即可。 这样的有序表可以用线段树维护,但是权值范围太大,需要做一次离散化(sort+un

2016-09-11 20:29:22 295

原创 Codeforces Round #370 (Div. 2) 山寨题解

Codeforces Round #370 (Div. 2)链接Codeforces712A Memory and Crow题意:给出序列a,a[i] = b[i] - b[i + 1] + b[i + 2] - b[i + 3]…,求序列b。 题解:容易看出b[i] = a[i] + a[i+1],扫描一遍输出。712B Memory and Trident题意:给出一个包含’L’、

2016-09-11 20:11:57 211

原创 [HDU 3333] Turing Tree (线段树+离线算法)

链接HDU 3333题意给出一个长度为N的序列和Q组询问,对于每组询问[l, r],输出区间内不同值的和(即每个数的贡献只算一次)。思路一般区间询问问题都会相当用线段树去做,然而这题在线查询是不可做的。 做法是将所有区间记录下来(即“离线化”),并且按照右端点进行排序。对位置建立线段树,然后从左向右扫一遍序列,把当前位置的数a[i]插入线段树的i位置中,并且记录a[i]的新位置为i,如果a[i]在

2016-09-11 19:29:24 352

原创 [POJ 3415] Common Substrings (后缀数组+单调栈优化)

链接POJ 3415题意给出两个字符串s1、s2和一个整数K,求有多少个长度大于K的公共子串。思路后缀数组的一个经典问题,对height数组分组后使用单调栈将复杂度优化至O(n),单调栈还真是强大啊。。。整个过程是先将s1、s2串起来,用比较小的数分隔,求出后缀数组,按照K的公共前缀长度去分组,对组内每个s2后缀,前方出现的每个同组s1后缀都与其存在长度不小于K的公共前缀。之后再计算一遍组内s1后缀

2016-09-08 22:00:42 352 1

原创 [POJ 2823] Sliding Window (单调队列)

链接POJ 2823题意给出一组长度为N的序列和一个区间宽度K,要求从左到右输出宽度为K的各个区间中的最大值和最小值。思路这道题目叫做“滑动窗口”,也是最优解法“单调队列”的另一个名称。 数据规模1e6,容易想到的一种解法是RMQ,st表或线段树均可,复杂度为O(n*logn)。 下面介绍“单调队列”: 单调队列的作用是“维护区间最值”,但它的局限性还是相当大的,只能从序列一侧滑向另一侧,对于

2016-09-07 14:58:48 263

原创 [BZOJ 2160] 拉拉队排练 (manacher+差分数组+前缀和)

链接BZOJ 2160题意给出一个长度不超过1e6的字符串,求其中前K(<=1e12)长的奇数回文串长度的乘积,结果对19930726取余。思路这是一个回文串计数问题,先跑manacher对每个位置求出最长回文半径,由于只考虑奇数长度回文串,不需要在字符两端加’#’字符。由字符串的单调性,以某个字符为回文中心的最长回文半径R[i]会给[1, R[i]]区间的回文串个数提供+1的增益。之后用差分数组+

2016-09-03 16:54:36 302

原创 [POJ 3264] Balanced Lineup (ST表)

链接POJ 3264题意给出N个整数,Q个询问,每个询问给出一个区间[l, r],要求得出区间内整数的最大值与最小值之差。思路典型的一个RMQ问题,之前是用线段树做的,这次用st表试一下。 st表是专门用来处理区间最值查询的数据结构,它跟线段树不同,线段树是在O(n)内构建,单次查询/更新为O(log(n))的复杂度,但是线段树能处理更复杂的问题,比如更新整个区间(lazy标记)和对区间做计数统计

2016-09-03 11:04:08 271

原创 CPPC网络选拔赛 C题 [HDU 5834] Magic boy Bi Luo with his excited tree (树形dp)

链接HDU 5834题意给出N个节点的树,每个节点含权,且点权值只可获得一次,每条边也含权,但每次通过边时都会减少相应边权的价值。对每个节点求出,从该节点出发能获得的最大总价值。思路模型是一道很经典的树形dp:HDU 2196 对所有节点都求出最值。本题为该模型的复杂化版本,数据规模大,需要在线性级别的树形dp内取得对所有点的最值。 仍然是一次dfs下去,对多有节点取得“ 子关系”上的局部最优解,

2016-09-01 10:33:19 353

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除