自定义博客皮肤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

稳定切水!

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

原创 D. Ralph And His Tour in Binary Country

传送门http://codeforces.com/problemset/problem/894/D给出一个平衡的二叉树,带边权,每组询问等价于求到A点距离不超过H的所有点到A点的距离和。思考为什么是“平衡二叉树”,其具有层数不超过logn,只有每个节点最多有两个子的特点。 对每个点将其子树所有点到该点的距离维护成一个有序表,由于是静态的,排序即可。之后就可以使用lower_bound去找有多少个点

2017-11-22 01:07:26 338

原创 [UVa 11212] Editing a Book (迭代加深搜索)

链接UVa 11212题意给出一组1到n(n < 10)的排列和一种操作“剪切粘贴”,可以选定排列的一段剪掉并且粘贴在任意其他位置形成新的排列,问最少执行几次操作可以得到排列1, 2, … n。题解将一个排列看做一个状态就是标准的宽搜题,9!并不大,但是后继状态特别多,宽搜肯定是妥妥地超时。 迭代加深搜索,如刘汝佳所说是一个“长期以来被低估的算法”,它由于限定了深度maxd,给搜索过程提供了剪枝的

2016-12-06 10:09:38 462

原创 2016赛季总结——关于“死亡回归”,感谢队友

一路漫谈真正开始学习算法的时候是去年的9月份,跟队友A说来年的比赛我们一起打。到了寒假队友B加了进来,我们的队伍是那个时候诞生的。两位队友都很厉害,高中打过NOIP,我起步慢一点,一开始学习也没有什么套路,只感觉茫茫多的知识点,想找个时间系统去撸一遍。其实现在感觉算法的学习不一定是系统的,做题的时候顺便清理吸收知识点也不错。寒假参加了whu的培训,感觉武大的学生真厉害,有大一学生就拿过NOI银牌了。

2016-12-05 15:56:41 629

原创 [UVa 1601] The Morning after Halloween (双向广搜)

链接UVa 1601题意类似“推箱子”,将n个小写字母推到对应的大写字母的位置。每一步对每个小写字母可推最多一次,且不可发生冲突。题解将“局势”看做状态,就是一道隐式图搜索,但是状态数比较多,时间上还是挺紧的。 由于有>1/4的格子都是障碍物,可以将可走的格子抽出单独建图,邻接表存储,再广搜即可。 在此基础上可以将算法改进为双向广搜,这样速度更快(实测快了有一倍)。双向广搜有个坑,就是要正反向每

2016-12-05 14:38:28 370

原创 [HDU 5696] 区间的价值 (单调栈+RMQ)

链接HDU 5696题意给出一个长度为n(1 <= n <= 100000)的序列,区间权值为区间最大值乘以区间最小值,输出长度为1到n的区间的最大权值。题解先利用单调栈算出以a[i]为最小值的最大区间延伸,设该区间宽度为L,则更新ans[L](这里用到st表查询该区间最大值),最后从宽度较大的区间刷新宽度较小的区间的长度,即为答案。为什么是对的,可以证明一下,从结果考虑,宽度为k的区间的最优值一定

2016-10-22 08:56:21 580

原创 [UVALive 3486] Cells (dfs序)

链接UVALive 3486题意给出一个n个节点的树(n <= 20000000),和m个询问,每个询问给出a、b,问a是否是b的祖先。题解跑一遍dfs序,记录每个节点子树的域,如果b是a的后代,则st[a] < st[b] && nd[a] >= st[b],注意输入给的有相同的节点,是个坑点,这种情况是No。 另外,直接跑递归是会爆栈的(注意n的规模),应用循环写dfs。代码#include

2016-10-22 02:06:47 284

原创 [UVa 1619] Feel Good (单调栈+前缀和)

链接POJ 2796题意给出一个长度为n的序列(1 <= n <= 100000),某个区间的权值为该区间内元素和乘以区间内元素最小值,求全职最高的区间和对应的权值,多个解输出任意值。题解首先说一下,UVa的数据有问题,建议直接做POJ的2796。是一道简单题,对每个元素找到以该元素为最小元素的最长区间即可,利用单调栈可以迅速算出每个元素左右端首个小于自身的元素下标,然后遍历枚举即可。代码#incl

2016-10-21 21:22:36 559

原创 [POJ 1741] Tree (点分治)

链接POJ 1741题意给出一棵树,n个节点(n <= 10000),边含权,问有多少对点对之间的距离不超过k。题解楼教主男人八题之一,貌似是点分治的入门题。这里大致介绍下点分治的过程: 实际上有个很早就接触过的分治算法叫“归并排序”,貌似是从那时候我才对分分治和nlogn算法有一些体会,归并排序的每层都是O(n),重点在于层数很少,只有logn层,因为每次都将区间分成原来的一半。 树上的点分治

2016-10-21 21:16:49 246

原创 [HDU 5558] Alice's Classified Message (后缀数组+LCP+单调栈)

链接HDU 5558题意题意较复杂,可看原题。 基本上等同于对一个字符串的若干个位置i求其前方位置j(0 <= j < i)的后缀suf(j)和suf(i)的LCP,多个答案输出最小j。题解裸的后缀数组+LCP问题,我加了一个单调栈优化常数。代码#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#

2016-10-12 23:39:39 419

原创 [HDU 5147] Sequence II (树状数组+前缀和)

链接HDU 5147题意给出一个1到n的全排列,问有多少个四元组(a, b, c, d)满足a < b < c < d,且q[a] < q[b]、q[c] < q[d]。题解对每个位置记录其前方比它大的有多少个left[],其后方比它大的有多少个right[],这个利用树状数组逐个插入元素很容易做到。 直接枚举的话复杂度就还是O(n^2),需要记录left的前缀和sum,然后枚举right[i]

2016-10-07 21:47:26 477

原创 [HDU 5086] Revenge of Segment Tree (前缀和)

链接HDU 5086题意给出一段序列,求所有连续区间和。题解求两次前缀和sum[], sum2[],答案就是total[sum[i]*i - sum2[i-1]]。代码#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;typedef long long

2016-10-07 20:12:17 306

原创 [HDU 1059] Dividing (多重背包+二进制优化)

链接HDU 1059题意给出6种硬币,价值分别为[1, 6],每种硬币有xi个,问是否能将这些硬币分为两组,每组硬币的价值为总价值的一半。题解是一种简化版的多重背包问题。先考虑这样一个问题,给出n个物品,每个物品占用空间为vi,问时候能选择若干物品能填满容量为V的背包。 这是一个01背包问题,但是没价值,只有容量,怎么办? 考虑将问题“复杂化”,每个物品的价值为1,问装满容量为V的背包需要最多多

2016-10-07 18:37:22 310

原创 [HDU 5536] Chip Factory (trie树+异或)

链接HDU 5536题意给出n个数(n >= 3),求n个数中任意三个不同的数a、b、c的(a + b) ^ c的最大值。题解一种trie树的经典用法,和异或操作结合求最值的问题。 将输入的数二进制化后,全部存在trie树中(注意补齐到31位),然后枚举a和b,在trie树中寻找相应的c即可。 由于要满足a、b、c不同,在选定a、b后需要将他们的二进制串从trie树中消除,得出结果后再添加进去,

2016-10-07 16:26:43 315

原创 [HDU 5534] Partial Tree (完全背包问题) (好题)

链接HDU 5534题意给出一个数n,和一组关于度(degree)的函数f(d),若某点的度为d,则提供f(d)的贡献,问n个点构成的树中最大贡献值。题解2015年长春赛区的1006,很不错的题目。首先要知道一颗含有n个节点的树结构,其所有节点的度之和为2*(n-1),因为只有n-1条边;并且只要保证每个节点的度都>0,总度为2*(n-1),则一定有一个树结构对应。由于每个点需要至少度为1,则成了,

2016-10-07 16:18:55 406

原创 [HDU 5927] Auxiliary Set (DFS+树上LCA)

链接HDU 5927题意CCPC东北四省的1006。给出一个树,和一个点集,点集外的点为“重要的点”,如果某个点集内的点是两个“重要的点的LCA”,那么它也是“重要的点”,其他点为“非重要的点”。 求出重要的点的个数。 数据规模看原题吧,不能直接dfs,会超时。题解这是一个LCA的题目(第一次做正经的LCA题),用到一个LCA的重要性质,同一个节点的不同子树中的任何节点的LCA为该节点本身。

2016-10-06 20:05:12 831

原创 [HDU 5929] Basic Data Structure (脑洞题)

链接HDU 5929题意CCPC东北四省的1008。需要实现一个双端栈结构,可以从两端push和pop,存的元素只有1/0两种,并且需要支持查询左端到右端或右端到左端元素依次nand的值。题解感觉就是个脑洞题,一开始想复杂了,可以发现nand这种操作并不满足交换律和结合律,所以线段树啥的基本维护不了。 需要看出来nand到0的时候一定是1,并且如果一段数全是1,那么nand的值和奇偶性是相关的。这

2016-10-06 17:32:28 551

原创 [HDU 5879] Cure (数学+打表)

链接HDU 5879题意求sum(1/k^2),k可能非常大。题解容易观察出当k特别大的时候,提供的贡献微乎其微,保留5位小数的话,到某个阶段基本上不会再增长了,找到那个值就好了。代码#include <cstdio>#include <iostream>#include <cstring>using namespace std;typedef long long lint;#define

2016-10-06 17:20:02 372

原创 [HDU 2825] Wireless Password (AC自动机+状态压缩DP)

链接HDU 2825题意给出若干个关键词,问长度为n并且含有至少k个关键词的字符串个数。题解ac自动机上状态压缩dp。 定义d[i][j][k]:长度为i、位于trie树中j节点、状态为k的字符串个数。 状态携带有含有哪些关键词的信息,由于关键词不超过10个,很容易在1<<10个状态内将其编码,然后通过“或运算”进行情况合并。 另外,这题不需要建立trie图,如果用trie图做状态转移貌似耗时

2016-10-05 17:23:33 306

原创 [HDU 5918] Sequence I (kmp)

链接HDU 5918题意CCPC的H题。 给出序列a、b和一个周期p,找出b出现在a中的位置:a[q + kp](k from 0 to len(b) - 1),q的个数。题解很简单的匹配问题,容易将a分成周期为p的p组,每组跟b进行匹配,匹配次数就是答案。代码#include <cstdio>#include <iostream>#include <cstring>#include <ve

2016-10-05 15:32:00 776

原创 [HDU 5919] Sequence II (主席树)

链接HDU 5919题意CCPC的I题。给出一个序列,问区间[l, r]中所有不同元素出现的第一个位置(取最左)组成的序列中的中位数。 第i个询问区间依赖于第i-1个询问的答案,所以是强制在线的。题解比较经典的主席树维护区间种类问题的变形。相同元素只取最左侧位置,所以对序列a,从a[n]到a[1]建立主席树,插入新元素到主席树中时取消相同元素的贡献,只保留最左侧元素。 查询[l, r]的时候,查

2016-10-05 14:55:23 1002

原创 [POJ 1625] Censored! (AC自动机+DP+高精度)

链接POJ 1625题意给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种。 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母。 最终答案不进行取模,所以可能非常大。题解给出模式串找不含其中任何一个的串的种类数,这类的题目大多可以用trie图+矩阵快速幂解决。但是这道题目的答案不取模,显然要用高精度,如果用在矩阵快速幂中套用高精度。。。感觉即使不MLT也TLT了,所

2016-10-03 20:07:19 321

原创 [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 277

原创 [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 366

原创 [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 222

原创 [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 239

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

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

2016-09-29 16:31:00 389

原创 [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 275

原创 [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 324

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

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

2016-09-27 12:48:30 307

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

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

2016-09-21 14:34:49 562

原创 浅谈树状数组

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

2016-09-21 13:25:21 369

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

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

2016-09-21 10:36:58 866

原创 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 349

原创 完美世界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 3511

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

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

2016-09-20 18:07:36 302

原创 [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 259

原创 [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 203

原创 [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 484

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

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

2016-09-12 21:17:31 3432

原创 [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 412

空空如也

空空如也

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

TA关注的人

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