算法&数据结构
算法,数据结构,刷题,ACM,面试,笔试
孤鸿子_
just for fun/前ACMer/前MSRAer/ZJUer/编程爱好者/学生/
展开
-
生成全排列----std::next_permutation 算法解析
今天遇到个问题,让用java写生成全排列,结果用惯了next_permutaion(),gg……这篇blog安排如下: 1. next_permutation 算法解析 2. 算法数学原理 why right?next_permutation我的系统里 STL里面的code是这样的template<typename Iter>bool next_perm...原创 2018-03-12 20:55:07 · 910 阅读 · 0 评论 -
hihocoder 1684 车队(LIS)
题目链接hihocoder 1684分析 裸的LIS, 可以发现最终车队一定单调递减,那么把序列反过来其实就是求LIS了. AC code#include #define INF64 0x3f3f3f3f3f3f3f3f#define pb push_back#define mp make_pair#define fi first#define se se原创 2018-01-14 14:39:33 · 372 阅读 · 0 评论 -
codeforces 894 D (DS)
题目链接D. Ralph And His Tour in Binary Country分析由于给出的是完全二叉树,那么我们可以预处理每颗子树的路径和,这样查询的时候就只需往上走 log nlog\ n 次就行了. 考虑合并的时候就可以只用把两个儿子节点用归并排序的思路合并就行. 我用的是库函数.比较trick 的是查询,开始一直没懂怎么查询我们从查询节点往父亲方向走,那么包含查询节点的子子树已经查询原创 2017-11-22 13:13:37 · 517 阅读 · 0 评论 -
CS Academy cube coloring(Burnside lemma)
题目链接Cube Coloring nn 种颜色给正6面体着色,相邻面颜色不同,给出每种颜色可以着的面数,问本质不同的着色方案有多少种.即旋转一样视为相同.分析这题其实是裸的burnside lemma. 由于相邻的颜色不同,我们考虑使用的颜色数目,只会有四种情况. 6种颜色均不相同. 1种颜色相同. 2种颜色相同 3种颜色相同原创 2017-11-21 19:06:00 · 407 阅读 · 0 评论 -
codeforces 894 E(scc + dp)
题目链接E. Ralph and Mushrooms分析很显然如果在同一个连通分量内,它可以重复踩直到踩完.而重复踩,能踩到的蘑菇数可以预处理,然后二分求得.那么我们将它求强连通再缩点后,问题就简单了,求出每个scc的权值作为节点权值,然后dp就行.感觉本人代码有点搓,估计是很久没写过 scc缩点了,等会儿去看看大佬的姿势再更AC code#include <bits/stdc++.h>usin原创 2017-11-20 17:06:02 · 717 阅读 · 0 评论 -
Codeforces 888G XOR MST(分治)
题目链接Codeforces 888G XOR MST(分治)分析 这是很经典的问题,可以分治. 从最高位开始考虑,这些点一定分成两组,一组最高位为1,另外一组为0,两组之间选一条最小的边就行了,这个过程一可以分治,具体看代码,写的很详细AC code#include <bits/stdc++.h>using namespace std;#define ms(x,v) (memset((x)原创 2017-11-12 20:53:32 · 1391 阅读 · 0 评论 -
GYM 100962F Problem F. Frank Sinatra(树上莫队+分块)
题目链接Problem F. Frank Sinatra分析这题和前面那个题唯一不一样的地方是,这题访问的是边上的,因此可以将边上的值算做入边顶点的值,这样就 u,vu,v 对应的区间就是 [dfl[u]+1,dfl[v]][dfl[u]+1,dfl[v]], 这样开个桶记录访问到的数就行了.code#include <bits/stdc++.h>using namespace std;#def原创 2017-11-09 20:11:22 · 587 阅读 · 0 评论 -
SPOJ Count on a tree II(树上莫队)
debug 到想吐.... 各种撒比错误,一晚上就没有了, 总结如下几点:两个不同参数的数组,(n,m) 的最大值不一样,最好开到同样大树上莫队注意重复节点的拆分 树型数据简单生成技巧: * i rand()%i 树上莫队的桶是 (q[i].l/S) not u/S( saaaa…)题目链接Count on a tree II:分析 如果你学了树上莫队,对这题应该不会原创 2017-11-07 23:38:24 · 264 阅读 · 0 评论 -
loj #2053. 「HNOI2016」大数(莫队)
题目链接#2053. 「HNOI2016」大数分析记录后缀mod p的值,当且仅当两个后缀相等时候这时会 整除p 所以这就变成经典的莫队计数了,由于p很大离散化一下 注意p为2和5的时候特判一下AC code#include <bits/stdc++.h>using namespace std;#define ms(x,v) (memset((x),(v),sizeof(x)))#defi原创 2017-11-05 22:46:07 · 381 阅读 · 0 评论 -
loj #2051. 「HNOI2016」序列(莫队+ST+单调栈)
题目链接#2051. 「HNOI2016」序列求 l,rl,r 所有子集最小值和分析又是区间查询,上莫队了.首先想[l,r]-> [l,r+1] 它的增量是多少. 设[l,r+1] 的最小值的位置是 pp, 那么显然增加的贡献为 a[p]∗(p−l+1)+(r+1)为右端点的贡献a[p]*(p-l+1)+(r+1)为右端点的贡献, 设 sl[i]sl[i] 表示以 ii 为右端点的所有区间的贡原创 2017-11-03 22:28:01 · 619 阅读 · 2 评论 -
loj #6164. 「美团 CodeM 初赛 Round A」数列互质(莫队 数据结构 链表hash)
题目链接#6164. 「美团 CodeM 初赛 Round A」数列互质询问 l,r,kl,r,k 中次数的次数与互质的个数.分析维护区间中数的个数,这一眼看过去不就是 莫队吗,可以看到对于次数的次数最多只有n−−√\sqrt n 种因此我们可以暴力处理每次查询,用一个链表维护次数的次数就好复杂度O(nn−−√+Qn−−√logn)O(n\sqrt n+ Q\sqrt nlog n)开始用hash原创 2017-11-03 18:29:32 · 444 阅读 · 0 评论 -
loj 2013. 「SCOI2016」幸运数字(线性基+lca倍增)
题目连接2013. 「SCOI2016」幸运数字 给一颗树,每个点有一个值aia_i,求u∼vu\sim v路径上异或最大值分析涉及异或的东西,就是线性基了,如果你对这玩意不熟,可参考这个Sengxian’s Blog然后由于线性基合并是log2Vlog^2V 因此,可以暴力合并,也就是采用倍增思想,计算u,vu,v 到公共祖先路径上的线性基,然后合并就行了Ac code#include <bit原创 2017-11-03 18:16:48 · 360 阅读 · 0 评论 -
loj 6062 (hall定理+ 线段树)
题目链接loj 6062. 「2017 山东一轮集训 Day2」Pair给出一个长度为nn的数列{ aia_i }和一个长度为mmm的数列{ bib_i },求{ aia_i }有多少个长度为mm的连续子数列能与{ bib_i }匹配分析 这个题目和今年西安的k 题非常相似……首先bib_i 的孙序不影响匹配,有hall 定理,二分图存在完全匹配当且仅当对于,集合X∀X,|N(X)|≥|X|X\fo原创 2017-10-31 18:35:03 · 1063 阅读 · 0 评论 -
bzoj 4017 小Q的无敌异或(所有子区间异或的和 与和的异或)
题目链接 小Q的无敌异或 长度为 nn 的序列 求所有子区间的异或的和% 998244353,与所有子区间的和的异或。分析感谢skywalkert 提供题解 按位计算就好AC code#include <bits/stdc++.h>using namespace std;#define ms(x,v) (memset((x),(v),sizeof(x)))typedef long long原创 2017-10-31 17:37:38 · 773 阅读 · 0 评论 -
PAT 甲 1014. Waiting in Line (30)(优先队列)
题目链接1014. Waiting in Line (30)分析感觉这些题都好水的~~,直接优先队列模拟就好了AC code#include<bits/stdc++.h>using namespace std;#define se second#define fi first#define mp make_pairconst int maxn = 1e3+10;const int MAX原创 2017-10-25 23:17:47 · 361 阅读 · 1 评论 -
codeforces 883 I. Photo Processing(dp+二分)
题目链接I. Photo Processing分析 这题比赛的时候没做出来,原来就是很简单的二分啊,只是check的时候用到dp. dp[i]:将1~i划分成满足条件的区间,能划分最远的地方,那麽显然n处若dp[n]==n则当前解满足,答案变小AC code#include <bits/stdc++.h>using namespace std;const int maxn = 3e5+10;原创 2017-10-23 17:30:34 · 1132 阅读 · 0 评论 -
HDU 5952 2016沈阳现场赛E Counting Cliques (团计数暴力)
题目链接Count Cliques分析 直接上BornKer好像不行了,各种T,还不如直接暴力AC code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF 0x3f3f3f3f#de原创 2017-10-22 21:16:22 · 393 阅读 · 0 评论 -
codeforces 875C - National Property(图表示关系 2sat)
题目链接875C - National Property分析官方 但这题也有2sat 的做法AC code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF 0x3f3f3f3f#d原创 2017-10-22 19:40:12 · 693 阅读 · 0 评论 -
PAT (甲)1004 Counting Leaves (30)(dfs)
PAT原创 2017-10-20 22:03:43 · 1335 阅读 · 0 评论 -
codeforces 871C. Points, Lines and Ready-made Titles (与图相关的计数)
题目链接C. Points, Lines and Ready-made Titles分析 可以发现如果将相邻两个点(X,或者Y坐标相同)用一条边连起来,建一个无向图,那麽就可以单独考虑连通分量了,而一个连通分量中可以发现如果没有环,那麽答案是 2X+Y−1 X:=连通图里不同的X坐标 Y:=同上 2^{X+Y}-1\\ X:=连通图里不同的X坐标 Y:=同上 如果有环 2X+Y原创 2017-10-19 16:21:50 · 422 阅读 · 0 评论 -
HDU 5534 Partial Tree(dp 背包)
题目链接Partial Tree分析 总共 2(n−2)2(n-2) 度, 度数为 i 价值是f[i], 先给每个点一度,那麽剩余 n-2 个点分配就好,这不就是背包吗 但是很奇怪的是,我用滚动数组倒着dp的时候wa了????为什么???AC code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define P原创 2017-10-13 19:14:37 · 280 阅读 · 0 评论 -
2016 四川省赛F. Floyd-Warshall(LCA + brute force)
这是我第一次使用输入输出外挂,没错,第一次…….. 被卡成傻逼了.题目链接Floyd-Warshall分析题解icpc_camp 上面已经写的很清楚了. https://post.icpc-camp.org/d/576-2016-hints 只需要将至多200个链接非树边的点离散出来,然后在对这两百个点做bfs找出以他们为起点的单元最短路就好了. 不过用并查集来找非树边会T成撒比,找了几份网原创 2017-10-11 21:09:17 · 391 阅读 · 0 评论 -
2016 四川省赛 H AroundtheWorld(BEST定理)
题目链接BEST 定理分析是时候好好学一波BEST定理了,这东西就是拿来专门统计有向图的欧拉回路计数的 BEST定理 和这里不加证明的给出BEST定理,有向图G,di=d−i=d+iG,d_i = d_i^-=d_i^+的欧拉回路数目为 Tv∗∏i∈V(G)(di−1)!T_v*\prod_{i\in V(G)}(d_i-1)! i其中TvT_v 为任意顶点vv 的 in_tree 或者原创 2017-10-09 20:33:12 · 527 阅读 · 0 评论 -
2016 JAG E Similarity of Subtrees(hash)
迷一样的hash.....题目链接2016 JAG E Similarity of Subtrees分析啊这位大佬的图非常到位hash函数的定义方式是将深度为 dd 的顶点给一个权重pdp^d, 取 pp 为素数就好AC code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)原创 2017-10-08 20:49:33 · 361 阅读 · 0 评论 -
HDU 5925 Coconuts(二维离散化权值统计 经典)
题目链接这是2016 ccpc 东北的银牌题,很经典. Coconuts分析直接二维离散化,然后记录下各压缩了多少行和列,将其权值相乘便是离散化的图里的权重. dfs or bfs 统计一下就行了.//Problem : 5925 ( Coconuts ) Judge Status : Accepted//RunId : 22331126 Language : G++ Aut原创 2017-10-08 20:16:55 · 506 阅读 · 0 评论 -
HDU 5528 Count a * b 2015 长春现场赛(积性函数)
题目链接Count a * b分析这是很有意思的积性函数问题反过来定义 h(m)=m2−f(m)=∑a,b[a∗b%m=0]=∑a=1,bmgcd(a,m)|b=∑a=1mgcd(a,m)=∑d|md∗ϕ(m/d)\begin{align}h(m) &= m^2 - f(m)\\&=\sum_{a,b}[a*b\%m=0]\\&=\sum_{a=1,b}^m gcd(a,m)|b\\&=原创 2017-09-29 12:37:06 · 343 阅读 · 0 评论 -
HDU 5517 2015沈阳现场赛(二维树状数组)
题目链接Triple题目分析首先分析集合C中的不同点不会超过10510^5个,因为每个ee 只会对应唯一的一个aa,因为我们只需要对每个bb存一个最大的a就行. 然后将CC中的点集排序,重大到小排序,重大到小遍历,用二维树状数组判断 ≥(c,d)\ge (c,d) 的点的个数,若多于1个则说明这个点不符合情况,否则符合条件,因为在二维树状数组中的点的a都比当前点大,所以一次少过去就好.注意计算重点原创 2017-09-25 22:55:29 · 307 阅读 · 0 评论 -
2017北京网络赛hihocoder 1580 matrix(dp)
题目链接1580 : Matrix分析和最大子矩阵和类似,扩展一维就好了. 详细分析请见这位老歌写的blog 注意特判Ac code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF原创 2017-09-25 21:29:29 · 327 阅读 · 0 评论 -
HDU The Closest M Points(KD-tree模板题)
题目链接HDU 4347 The Closest M Points分析kd-tree模板题AC code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#define INF 0x3f3f3f3f#defi原创 2017-09-25 16:13:06 · 655 阅读 · 0 评论 -
2015沈阳现场赛F (HDU 5514)(经典问题 数论phi函数)
题目链接Frogs分析首先我们可以发现能跳到的数一定满足 存在i,gcd(ai,m)|x i,gcd(a_i,m) | x,即存在 ii gcd(ai,m)|gcd(x,m)gcd(a_i,m) | gcd(x,m) 将 x,按照 gcd(x,m)=dx,按照 gcd(x,m)=d 分类,最多有 mm的因子个集合,那麽每个集合的和为 ∑gcd(x,m)=dx=d∗∑gcd(x/d,m/d)原创 2017-09-23 11:33:51 · 300 阅读 · 0 评论 -
HDU 4109 Instrction Arrangement(差分约束)
题目链接Instrction Arrangement分析这是一道简单的差分约束的题目,关于差分约束,这个blog写的很好 设tit_i 表示第i条指令完成的最短时间,那麽对于一个约束x,y,zx,y,z有ty−txtx−ty≥z≤z\begin{align}t_y -t_x&\ge z\\t_x - t_y &\le z\end{align} 这不就是差分约束的标准形式吗,要求完成的最原创 2017-09-13 21:56:28 · 345 阅读 · 0 评论 -
poj 3317 Stake Your Claim(极大极小搜索经典 a-b+剪枝+记忆化dp)
poj 3317 Stake Your Claim分析哇这题也算把我卡得够死了,怪我没能正确理解所谓a-b剪枝的姿势. 其实alpha-beta剪枝不用也是可以过的,非得我不用才找到了错误首先这道题只有10种选择,每种选择有3种状态,共310<600003^{10} <60000,因此直接记忆话搜就行了.用3进制状压一下.然后就是枚举空点的时候也可以状压一下这样枚举快.AC code//Source Cod原创 2017-09-12 00:34:53 · 1964 阅读 · 0 评论 -
ACM概率期望dp刷题总结
这个周刷了很多概率期望有关的dp题目,缘起2016青岛D题和取log的神操作题HDU 5988 2016青岛区域赛 (最小费用流)这类题目没有固定的模板,而且概率可以很容易插入一些经典模型,比如下面的 TSP。最小费用流。 我刷的这部分题目,无一例外均可用dp解决,主要是找到状态,很多题目都可以抽象成马尔科夫链下面记录一下刷的经典题目B - Discovering Gold 一排1到n的格子,每个原创 2017-09-07 22:10:48 · 3633 阅读 · 0 评论 -
codeforces 854 D. Jury Meeting(dp水题)
题目链接D. Jury Meeting分析昨晚打正式赛的时候太急了,代码写的有点毒,下了课后一看,立马发现bug…..将去的航班表和返回航班表分别按照时间最小和最大排序,对于去的航班来说,挨个扫描过去,对每一个人维护当前的最小花费,若时间总的航班满足等于 nn 说明这一天可以作为起始时间,更新这一天的花费dp[d]=now_ansdp[d] = now\_ans,now_ansnow\_ans 记录原创 2017-09-07 12:10:53 · 586 阅读 · 0 评论 -
HDU 5988 2016青岛区域赛 (最小费用流)
题目链接HDU 5988分析这题一看就是一个网络流的模板题,不过需要注意建边的费用!! 首先很容易想到,s与每个区域连一条边,费用为0,容量为 sis_i,区域与 tt 连一条边 容量为 bib_i 费用为0。然后就是考虑区域与区域之间的连边了。我们想象一下最终的分配方案,假设对于边 eije_{ij} 来说,我们让 kijk_{ij} 个人通过,那么eije_{ij} 不被破坏的概率是 (1−p原创 2017-09-06 16:46:46 · 2303 阅读 · 0 评论 -
codeforces 851 D. Arpa and a list of numbers(前缀和+bruteforce)
题目链接D. Arpa and a list of numbers分析是我太天真了,暴力枚举素数还是计算还是有问题的,复杂度太高,不过你可以发现只需要再处理一个前缀和就可以了….下面进入正题首先显然可以想到枚举素数,那么最终就是对于每个素数的计算问题了,如果暴力计算的化肯定是要超时的,其实我们可以在O(1)O(1) 计算花费.对于素数 kk 来说,不为kk 的倍数的数都要加到kk 的倍数,所以只需要原创 2017-09-05 09:11:21 · 772 阅读 · 0 评论 -
codeforces 840B. Leha and another game about graph(构造,dfs)
题目链接B. Leha and another game about graph分析思维题,仔细分析题意其实一点也不难。详情见官方文档ac code#include<bits/stdc++.h>#define pb push_back#define mp make_pair#define PI acos(-1)#define fi first#define se second#defin原创 2017-08-28 20:51:08 · 706 阅读 · 0 评论 -
codeforces 840 C. On the Bench(多重集合的交错排列经典题目)
题目链接C. On the Bench分析这是一道多重集合交错排列的经典题目,经典的题意是这样的: 设集合 AA 有 n1个a1,n2个a2,...,ni个ain_1 个 a_1,n_2个a_2 ,...,n_i 个a_i 问使其相邻两个数不相同的排列有多少种.我们先来解决这个经典题目,然后再来解决codeforces的这个题目. 可以用 dp+容斥做 先来解决一个简化的问题 设 dp[原创 2017-08-28 11:15:29 · 1288 阅读 · 0 评论 -
HDU 4609 3-idiots(多项式计数 + FFT卷积优化)
题目链接3-idiots分析这是第一道FFT,本想拿模板试试手的谁知道直接来了一个错误的模板……debug好久,具体分析就不说了,比较像构建生成函数,然后计数,中途用了卷积优化kungbin大佬的blog写的很好我先用内建complex交了一发,1300ms 大概比手写慢500ms(233333)AC codeProblem : 4609 ( 3-idiots ) Judge Status原创 2017-08-21 22:11:58 · 445 阅读 · 0 评论 -
HDU 6143 Killer Names(容斥原理)
题目链接Killer Names分析记 f(x)f(x) 为长度为n的字符串恰好用 xx 个字符填充有多少种取法,用容斥原理f(x)=xn+∑i=1n−1(−1)i(xi)(x−i)nf(x) = x^n + \sum_{i=1}^{n-1}(-1)^i\binom{x}{i}(x-i)^n 暴力计算 n2lognn^2logn,遗憾的是我居然超时了,所以我先暴力计算了 xnx^n 打了原创 2017-08-18 17:46:51 · 445 阅读 · 0 评论