- 博客(27)
- 收藏
- 关注

原创 欢迎访问zjunzhao的博客
大家好,我是zjz,这是我的博客。 我会在这个博客里发表一些文章,内容包括 1.算法竞赛题的题解 2.acm算法总结 3.日记 我会尽量用清晰简洁的语言来描述题目的解答过程与算法。如果您觉得我的文章有写的不好的地方,可以在评论中提出,我将尽快处理。
2017-04-01 21:57:58
488
原创 【题解】AtCoder Grand Contest 016
A:Shrinking题意:规定一种对字符串的操作:设字符串长度为N,一次操作之后可以得到一个长度为N-1的字符串,新字符串的第i个字符等于旧字符串的第i个字符或第i+1个字符。给定一个长度为n的字符串,问最少进行几次操作可以得到一个只含有一种字符的字符串。分析:假如我们要将字符串最终变为"aa...a",首先原字符串中必须得有字符a。设原字符串中字符a的位置从小到大依次为x1,x2,..
2017-06-20 13:57:20
1009
原创 【题解】codeforces792E Colored Balls
题目链接题意:给定n个正整数a[1],...,a[n],现在要将每个正整数拆成若干个小正整数的和,使得任意2个小正整数的差不超过1(即取一个正整数k,将a[1],...,a[n]拆成若干个k 与 若干个k+1)。求使得小正整数总数最少的方案,输出该方案下的小正整数总数。分析:假如我们知道最优的情况下小正整数的值应为k和k+1,那么我们很容易在O(n)的时间复杂度内求出这种情况下拆分得到的最
2017-04-03 18:08:49
670
原创 【题解】codeforces786C Till I Collapse
题目链接题意:给定一个长度为n的数组(数组元素∈{1,2,...,n}),对k∈{1,2,…,n},求最小的ans[k],使得数组可以分为连续的ans[k]段,每段内不相同的元素个数都不超过k。分析:为了使ans[k]最小,我们可以贪心地来分段,即对起点l,取最大的r,使得a[l],...,a[r]中不相同的元素个数不超过k。可以来估计一下总段数(即ans[1]+...+ans[n])的上
2017-04-01 21:37:04
971
原创 【题解】codeforces786B Legacy
题目链接题意:给定一个n个点m条带权值的“边”的有向图,其中“边”分为3类。第1类“边”是点u到点v的边,第2类“边”是点u到区间[l,r]中的点的边(即r-l+1条边),第3类“边”是区间[l,r]中的点到点u的边。求以点s为源点的最短路。分析:和atcoder2336类似。考虑给图加一些辅助点和边。对第2类“边”按如下方式处理:对点集[1,n]建立一棵线段树,线段[l,r]维护dis[
2017-03-31 22:04:28
1256
原创 【题解】codeforces786A Berzerk
题目链接题意:n个点围成一个圈,按顺时针编号为1~n。在某个点上会有一个物品C,初始位置范围是2~n。2个人A、B进行博弈,每个人都有一个数集,数集内的数x满足1≤x≤n-1。A、B轮流进行操作,每轮的操作者可以从自己的数集中选出一个数x,然后把物品C顺时针向后移动x个点。先把物品C移动到点1的人获胜。A、B都采取最优策略使得自己胜利,若无法胜利就采取最优策略使自己不败(即平局)。问A、B分别
2017-03-30 18:12:27
941
原创 【题解】codeforces741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
题目链接题意:给定一棵有根树,结点编号为1~n,根结点为结点1。每条边上有一个字母,求各子树内最长的满足“路径上的字母经过重排后可以构成回文串”的简单路径。分析:对结点u,用2进制数vec[u]表示结点u到根结点的路径上各字母的数目的奇偶性。若第i个字母数目为奇数则vec[u]的第i位为1,否则为0。子树u内满足要求的路径可以分成两类,一类经过结点u,一类不经过结点u。由于不经过结点u的路
2017-03-29 18:53:31
1371
原创 【算法】树上启发式合并算法
树上启发式合并算法是启发式合并算法在树上的应用。下面我直接通过一个例子来讲解这个算法。 例:给定一棵有根树,树的结点编号为1~n,根结点为结点1。结点i有颜色col[i],其中1≤col[i]≤n。要求回答m个询问,每个询问回答颜色c在子树u中出现多少次。 显然要将查询离线处理,即对子树u的查询都“挂”到结点u上。我们用cnt[c]表示颜色c出现的次数,那么一种
2017-03-25 17:22:50
6651
原创 【算法】一种字符串匹配算法:z-algorithm
z-algorithm是一种字符串匹配算法,能够实现功能:对字符串S,O(n)地求出S的全体后缀与S自身的最长公共前缀的长度,记录在数组z[]中(z[i]即suffix i与S的最长公共前缀的长度)。 一、算法原理与实现 约定: 字符串S的下标从0开始; S[i...j]代表字符串S[i]S[i+1]...S[j];
2017-03-23 20:01:14
4504
原创 【题解】dutoj1081 Prufer 序列
题目链接题意:略(原题的描述已经很简练了)。分析:首先需要知道的是一个prufer序列和一棵标号树是一一对应的,所以不会有S=0的情况。一个标号在prufer序列中没出现,当且仅当该标号对应的点在prufer序列对应的树中为叶结点。对图G,设其不同的生成树有cnt棵,令ans=cnt*n*(n+1)/2。考虑点u对ans的负贡献,即计算以u为叶结点的生成树的个数,设为cntu,则ans=a
2017-03-09 20:58:38
601
原创 【题解】dutoj1082 埃蒙的时空航道
题目链接题意:略(原题的描述已经很简练了)。分析:可以想到这样一个网络流模型:对星球i,源点s连边至点i,容量为pi,点i连边至汇点t,容量为si,点i连边至点i+1、...、点n,容量均为c。则最大流即为答案。由于n的规模比较大,所以直接求解这个网络流模型是不现实的。考虑该最大流模型的最小割模型,由于问题比较特殊,所以可以贪心求解。每个st-割都会将点集分成2个不相交的集合,一个集合含源
2017-03-09 20:29:23
543
原创 【题解】codeforces778C Peterson Polyglot
题目链接题意:给定一棵trie树,可以删除一层边,再将父边被删且父亲相同的结点对应的子树合并得到一棵新trie树,求新trie树的最小结点数。分析:启发式合并。在合并结点u的子树时,选择将小子树合并到大子树里,这样总的合并的时间复杂度是O(nlgn)的。 证明:合并的耗时来自于对小子树的遍历。设全体小子树的遍历总量为T,考虑每个结点u对T的贡献。设结点u可以作为小子树的第
2017-03-06 22:36:13
1068
原创 【题解】codeforces776G Sherlock and the Encrypted Data
题目链接题意:设x的16进制表示为xn-1xn-2...x1x0,定义h(x)=2^xn-1 or 2^xn-2 or...or 2^x1 or 2^x0。求l,l+1,...,r中满足x xor h(x)分析:可以发现x xor h(x) 用calc(m)计算1,2,...,m中满足x^h(x) 从高至底逐位扫描m的16进制表示,并统计答案。扫描至第k
2017-03-01 21:05:57
859
原创 【题解】codeforces765F Souvenirs
题目链接题意:给定一个长度为n的数组与m个查询。第i个查询要求输出数组下标区间[li,ri]内的数之间的距离(差的绝对值)的最小值。分析:离线处理查询。将查询区间按右端点从小到大排序,维护一个数据结构,使得将数组元素a1,a2,...,ai插入到数据结构之后能够快速查询以ai为右端点的查询区间的答案。考虑ai对查询区间的贡献,设d=|ai-aj|(j 若暴力处理ai对查询
2017-02-27 11:40:53
721
原创 【题解】codeforces776E The Holmes Children
题目链接题意:定义函数f(n),f(1)=1,f(n)=|{(x,y)|x+y=n,x≥1,y≥1,gcd(x,y)=1}|(n>1)。定义函数g(n),g(n)=Σf(n/d)(求和对n的全体约数d进行)。递归地定义函数F_k(n),F_1(n)=f(g(n)),F_k(n)=g(F_k-1(n))(k>1且k为偶数),F_k(n)=f(F_k-1(n))(k>1且k为奇数)。求F_k(n)
2017-02-24 22:50:00
416
原创 【题解】codeforces776D The Door Problem
题目链接题意:有n扇门,每扇门的状态为开(0)或闭(1)。有m种操作,每种操作可以改变若干扇门的状态。每扇门恰好可以被两种不同的操作改变状态。给出n扇门的初始状态,问是否可以经过操作把所有的门的状态都改为闭?分析:设可改变第i扇门的2个操作为ai和bi。若第i扇门的状态为开,则ai和bi操作恰好只能执行一个;若第i扇门的状态为闭,则ai和bi操作要么都不执行要么都执行。由此原问题转化为2-
2017-02-24 22:39:39
581
原创 【题解】atcoder2336 Flags
题目链接题意:给定n个数对(xi,yi),从每个数对中选出一个数,使得得到的n个数之间的最小距离最大。求最大的最小距离。分析:二分最大的最小距离mid。当选出某个数x后,对于数对(xi,yi),若|x-xi|代码#includeusing namespace std;const int maxn=4e5;struct node{ int x,i; bool operat
2017-02-19 23:31:41
596
原创 【题解】atcoder2234 Menagerie
题目链接题意:有n只动物围成一个圈,每只动物要么是羊要么是狼,羊总说真话,狼总说假话。给定一个字符串P,字符串的第i个字符为'o'代表第i只动物认为与它相邻的2只动物是同类,字符串的第i个字符为'x'代表第i只动物认为与它相邻的2只动物是异类。问是否存在一种动物的排列方案使得以上假设成立(羊总说真话,狼总说假话),若存在,给出一种方案。分析:可以发现,当第1只与第2只动物的类别确定之后,就
2017-02-18 22:27:57
613
原创 【题解】玲珑学院oj1092 Fate Dog
题目链接题意:给定n个元素,第i个元素有属性a[i],b[i],c[i],p[i]。求满足(a[i]+b[j]+c[k])(1+p[i]/100)≥H的有序点对(i,j,k)(i、j、k互不相等)的数目。分析:不等式(a[i]+b[j]+c[k])(1+p[i]/100)≥H可变形为b[j]+c[k]≥100*H/(100+p[i])-a[i],故可枚举i,对每个i求满足b[j]+c[k]
2017-02-18 15:36:03
854
原创 【题解】玲珑学院oj1087 Alice and Bob
题目链接题意:给定一棵满二叉树,每个点有一个权值。两人轮流操作,每次操作可以选一个点u,将点u的权值减小x,0分析:将叶子节点所在的层定义为第1层,向上层数递增。 记sg为奇数层节点权值的异或和。则先手必胜当且仅当sg≠0。 证明思路:1.sg≠0的状态可经过一次操作到达sg=0的状态。 2.sg
2017-02-14 21:36:18
543
原创 【题解】玲珑学院oj1088 Red Packets
题目链接题意:给定n个元素,每个元素有费用a和价值b两个属性。可以从n个元素中选取连续的若干个,满足这连续的若干个元素中除去至多m个元素之外的其他元素的费用和不超过k, 这么做可以获得的价值定义为这连续的若干个元素的价值和。求能够获得的最大价值。分析:滑动窗口。设选取的元素下标集为区间[l,r],只需对每个l求出最大的满足条件的r即可。用两个堆维护判断,一个小根堆用于存储不需要付费的元素,
2017-02-13 22:28:17
475
原创 【题解】玲珑学院oj1089 Place the Tiles
题目链接题意:用1×2的骨牌来铺带障碍格的矩形网格,使得每个网格至多被一张骨牌覆盖且无法再加入骨牌(即没有相邻的未覆盖无障碍网格)。求需要的最少骨牌数。分析:轮廓线dp。每个格子的状态用一个4进制数来表示,0代表未覆盖,1代表已覆盖且由骨牌右端或下端覆盖,2代表已覆盖且由骨牌左端覆盖,3代表已覆盖且由骨牌上端覆盖。转移按如下分类进行: 1.障碍格:将当前格状态改成1
2017-02-13 18:57:25
348
原创 【题解】codeforces441E Valera and Number
题目链接题意:给定整数x、k和概率值p,对x进行k次随机操作,每次操作有p概率对x乘2,有1-p概率对x加1。求操作结束后,得到的数的二进制表示末尾的连续的0的数目的期望。分析:设f[i][S][k]为第i次操作后得到的数的二进制0~8位为S且第8位起向后与第8位相等的数位数为k的概率。转移枚举第i次状态为(S,k)时的操作,计算对第i+1次状态为(newS,newk)的贡献即可。代码
2017-02-10 16:35:17
642
原创 【题解】atcoder2304 Cleaning
题目链接题意:给定一棵带点权的树,允许进行如下操作:选取2个不同的叶子u、v,将u到v的路径所经过的点的点权减1。问能否经过有限次操作使得全体点权变为0。分析:取一非叶结点作为树的根。设结点u的点权为a[u],结点u的经过父节点的点权为b[u](即从子树u某个叶结点出发,经过u的父节点的路径数)。 对任意非叶结点u,设u的儿子的b之和为sum,设x为经过u且在子树u中的路
2017-02-09 16:35:20
743
原创 【题解】atcoder2303 Boxes
题目链接题意:给定n个非负整数a1,a2,...,an,进行操作。每次操作可以选定一个位置i,然后将a(i+j)减去j(当i+j>n时将a(i+j-n)减去j)。问能否经过有限次操作把所有数都变成0。分析:设对位置i操作了xi次,则可以得到如下方程组 n*x1+(n-1)*x2+(n-2)*x3+...+1*xn=a1 1*x1+n*x2+(n-1)*x
2017-02-09 09:26:18
803
原创 【题解】codeforces766D Mahmoud and a Dictionary
题目链接题意:有n个单词,给定m个关系,每个关系要么表示单词a与单词b相同,要么表示单词a与单词b相反。并且“相同”与“相反”有性质:若a与b相同,b与c相同,则a与c相同(从而单词的相同关系是等价关系);若a与b相反,b与c相反,则a与c相同。按顺序判断这m个关系是否可以成立,若可以成立,则加上这个关系,否则忽略。再给定q个询问,每个询问 查询单词a与单词b的关系(相同、相反或未知)。分
2017-02-08 16:41:45
1035
原创 【题解】codeforces766E Mahmoud and a xor trip
题目链接题意:给定一棵树,树的每个点有点权,定义2个点u和v之间的距离为u到v的路径上的点的点权的异或和。求全体点对(u,v):1分析:考虑按位处理距离和。设有ans[i]个点对的距离的第i位为1,则距离和=ans[0]*2^0+ans[1]*2^1+...+ans[20]*2^20。从而问题转化为点权为0或1的情况。对于转化后的问题,我是用树分治处理的:对于子树u的所有点对路径,要么
2017-02-08 13:46:36
768
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人