codeforces
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
CF 700D Huffman Coding on Segment(huffman编码分块+莫队)
题意:给定一段序列a,q个询问l,r, 求a[l]..a[r]的huffman编码长度。首先huffman编码长度怎么算呢。。其实就是以每种字符出现的次数为点权,建一棵huffman树,边权为1,它的WPL其实就是这段字符huffman编码的长度。所以我们就用莫队维护一下每个字符出现的次数啦,然后模拟建huffman树求WPL啦(可以用优先队列)。结果就TLE了。想想怎么可能这么简单吗!!我们对于原创 2017-07-20 16:12:47 · 569 阅读 · 0 评论 -
CF 375D Tree and Queries(子树询问,转化为序列莫队)
题意:给定一棵树,每个点有颜色,m个询问vi,ki,问以vi为根的子树中有多少种颜色出现的次数>=ki。首先我们可以通过dfn把子树询问变成序列询问。(不会看代码,一颗子树中的顶点的dfn一定是连续的,画画就知道了)然后就是经典的莫队了,至于ans怎么更新,见代码啦~原创 2017-07-20 16:02:15 · 387 阅读 · 0 评论 -
CF 833B The Bakery(dp+线段树)
题意:把n个数分成k部分,使得每部分价值之和最大。每部分的价值为不同数的个数。很容易的可以想到dp,用dp[i][k]表示把前i个数分成k部分所获的最大值。则dp[i][k]=max(dp[j][k−1]+num[j+1][i],k−1≤j<i)dp[i][k]=max(dp[j][k-1]+num[j+1][i],k-1\leq j<i) num[i][j]表示a[i..j]的不同数的个数,但是原创 2017-07-31 21:05:52 · 2006 阅读 · 0 评论 -
CF835D Palindromic characteristics(dp)
题目大意:给你一个串,让你求出k阶回文子串有多少个。k从1到n。k阶子串的定义是:子串本身是回文串,而且它的左半部分也是回文串。首先明确: 1、如果一个字串是k阶回文,那他一定还是k-1阶回文。 2、如果一个串是k阶回文,那么这个串需要满足: 1.它本是是回文的。 2.他的左半部分是k-1回文的。 有点递归的意思。。所以我们采用dp。 dp[i][j]表示子串s[i..j]最大是几阶的,原创 2017-08-01 12:51:55 · 717 阅读 · 0 评论 -
CF835E The penguin's game(异或性质+二分查找)
题目大意:有n个数,其中有且只有两个数为y,其他的都为x,让你找到这两个为y的位置pos1,pos2。你可以问20个问题,每个问题为你给出一个集合,系统回馈给你他们的异或和。首先,每个集合中要不只有1个y,要不有0或2个y。我们通过问一个问题就可以知道这个集合中y的个数是奇数还是偶数。分以下四种情况: 1、集合大小为偶数,y有偶数个,则x有偶数个,那么返回值为0 2、集合大小为偶数,y有奇数个,原创 2017-08-01 18:10:57 · 849 阅读 · 0 评论 -
CF471D MUH and Cube Walls(差分+KMP)
先差分,然后kmp匹配。注意m==1的情况。#include #include #define N 200010int s[N],t[N],n,m,fail[N],ans=0;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9') {if(ch=='-')f=-1;ch=getchar();} whil原创 2017-07-24 18:11:23 · 439 阅读 · 0 评论 -
CF494B Obsessive String(KMP+DP)
这道题的题目真是太难读了。。。推了半天样例。其实就是让你求合法的集合数目。合法的集合定义为:1、集合中的所有串都是s的子串,且互不重叠 2、集合中的所有串都含有子串t。设串s长度为n,串t长度为m,我们首先用kmp在s中匹配t,匹配成功的位置我们打下标记flag[i]=1(s[i-m+1...i]=t[1..m]).以下角标均针对串s:设dp[i]表示合法且集合中最后一个子串为s[j.原创 2017-07-24 22:23:00 · 709 阅读 · 0 评论 -
CF 86D Powerful array(莫队)
挺裸的莫队,然而我用lld输出T掉了???改成I64d输出就过了???有毒。#include #include #include #include #define ll long long#define N 200010int n,m,a[N],f[1000005],block;bool vis[N];ll ans=0,ANS[N];inline int read(){ i原创 2017-07-26 12:37:03 · 362 阅读 · 0 评论 -
CF 832D Misha, Grisha and Underground(Tree+lca)
题目大意:给你一棵树,n个节点。q个询问,给你a,b,c三个点,任意对应s,f,t,记s到f的路径为(s,f),让你求(s,f),(t,f)两条路径上的点的交集大小最大为多少。首先我们发现,对于给定的a,b,c,就三种情况即f=a,f=b,f=c.所以我们只需计算三次s,f,t,取最大即可。现在考虑对于给定的s,f,t,如何计算路径上的点的交集。设l1=lca(s,f),l2=lca(t,f),l原创 2017-07-26 13:30:18 · 411 阅读 · 0 评论 -
CF527C Glass Carving(模拟+线段树)
用1和0 表示每一条可被切割的线是否被切割,然后用两棵线段树分别统计长和宽的最长连续零的个数。最大矩阵面积即为最长的长*最长的宽,即(长的最长连续零+1)∗(宽的最长连续零+1)(长的最长连续零+1)*(宽的最长连续零+1) 时间复杂度O(n* max( log2(w) , log2(h))) 求线段树最大连续子段和,最大连续0的个数等,为了满足区间加法,需另记附加信息lsum,rsum,即左起原创 2017-08-11 22:08:04 · 633 阅读 · 0 评论 -
Codeforces Round #428
CF839A Arya and Bran(模拟)CF839B Game of the Rows(贪心)CF839C Journey(树+概率)原创 2017-08-13 12:35:34 · 317 阅读 · 0 评论 -
CF413E Maze 2D(线段树)
一个节点代表一个矩阵(1,l,2,r)。维护四个信息:四个角之间的最小距离,到不了就是inf,使得这四个信息具有可加性。即可用线段树进行维护。原创 2017-08-13 13:37:04 · 608 阅读 · 0 评论 -
Codeforces Round #429
CF841A Generous Kefa(模拟)CF841B Godsend(博弈+数学)CF840A Leha and Function(贪心+组合数学)原创 2017-08-19 22:02:34 · 303 阅读 · 0 评论 -
CF417A Elimination(完全背包)
水水的完全背包。就两件物品。体积为n,价值为c的物品1,体积为1价值为d的物品2。要价值最小。合法的背包容量是n*m-k~n*m,找最小值即可。(大于n*m的可以证明一定不会比n*m更优)。#include <cstdio>#include <cstring>#define inf 0x3f3f3f3f#define N 10005int f[N],c,d,n,m,k;inline int原创 2017-08-07 12:19:38 · 435 阅读 · 0 评论 -
Codeforces Round #432
CF851A Arpa and a research in Mexican wave(水题)CF851B Arpa and an exam about geometry(几何)CF850A Five Dimensional Points(数学)原创 2017-09-05 10:50:50 · 367 阅读 · 0 评论 -
CF295B Greg and Graph(离线+Floyd)
每次删一个点,询问最短路长度和。离线后,倒着做,一个点一个点往里加,做floyd即可。原创 2017-09-13 16:19:05 · 717 阅读 · 0 评论 -
CF500B New Year Permutation (贪心+并查集)
把能互相交换位置的都合并成一个集合,用并查集维护。每一个集合中的位置都是可以两两互换的,所以我们对于每一个集合的位置从小到大排列,这些位置上的数也从小到大排列,一一对应,保证小数尽量在前面,即为最优。原创 2017-09-05 21:30:22 · 327 阅读 · 0 评论 -
CF840C On the Bench(dp+组合数学)
首先我们对n个数进行一个分组,把乘积为平方数的数分在一组(可以证明:同一组内的数两两乘积为平方数,不同组的两个数乘积一定不是平方数),记作一共分了nn组,则同组的数只要不相邻即可满足题意。即原问题转化为 n个物品,分成了nn组,要求同组物品不能相邻,问共有几种排列方案。我们dp解决这个问题,f[i][j]表示前i组,有j个相邻的同组的方案数。 我们现在考虑插入第i组,第i组的大小为size[i]原创 2017-08-22 20:46:19 · 969 阅读 · 0 评论 -
CF427C Checkposts(tarjan求强连通)
每个强连通分量记最小值,及最小值的个数。原创 2017-09-14 09:42:50 · 562 阅读 · 0 评论 -
CF853B Jury Meeting(dp)
把航班按出发时间从小到大排序。从前往后扫,求出dp[i]表示i时刻全都已出发的最小花费(i时刻全部已出发,也就是说可选航班是一个时间均小于i的前缀,在这些航班中选择n个人的最小花费,具体处理见代码)。类似的,从后往前扫,求出dp1[i]表示i时刻开始走,全部返回的最小花费(也就是说可选航班是一个时间均大于i的后缀)。然后枚举i时刻全部出发,则i+k+1时刻开始返回,更新答案。原创 2017-09-06 22:37:53 · 393 阅读 · 0 评论 -
CF516B Drazil and Tiles(拓扑排序)
预处理出每个 . 邻近的 . 有多少个,即有几种方法覆盖这个 . 。然后用类似拓扑排序的方法,每次把只有一种方法覆盖的点覆盖,并更新临近的点。如果最后还剩下了 . ,说明无法完全覆盖,或者方案不止一个。原创 2017-09-15 10:14:52 · 1155 阅读 · 0 评论 -
CF835C Star sky(模拟+二维前缀和)
题目大意:给你个100*100的棋盘,有些点上有点权,会随时间改变。设点权为x(x<=10),则在时间t他的点权为(t+x)%(c+1)(t+x)\%(c+1)。每次询问给你时间t,和一个矩阵范围(x1,y1,x2,y2),问你矩阵覆盖区域内的点权和是多少。因为棋盘范围很小,权值种类也很少,所以我们预处理一个数组cnt[k][x][y],表示(1,1,x,y)矩阵内点权为k的点的个数。用容斥原理处理原创 2017-08-01 13:45:08 · 679 阅读 · 0 评论 -
CF384E Propagating tree(线段树+思路题)
首先把子树通过dfn化为连续的区间。然后看操作: 1.对x加val,对他的儿子们-val,对他的儿子的儿子们+val,直到叶子。 2.求一个位置的数是多少。 第一个操作比较难搞,我们发现它是隔层做的,也就是说把每个点按照深度分成两组,做x点时,他的子树中与他同组的都+val,不同组的都-val。我们可以维护两棵线段树,分别维护每组加了多少,最后问pos是多少时,他的答案就是a[pos]+同组一原创 2017-09-24 22:03:50 · 265 阅读 · 0 评论 -
Codeforces Round #434
CF858A k-rounding(数论)CF858B Which floor?(暴力)CF858C Did you mean...(贪心)原创 2017-09-18 14:24:49 · 609 阅读 · 0 评论 -
Codeforces Round #433
CF854A Fraction(gcd/数学)CF854B Maxim Buys an Apartment(思路)CF853A Planning(贪心+优先队列)原创 2017-09-06 22:37:41 · 352 阅读 · 0 评论 -
Codeforces Round #431
CF849A Odds and Ends(贪心)CF848A From Y to Y(暴力CF849B Tell Your World(模拟)原创 2017-09-02 15:24:20 · 271 阅读 · 0 评论 -
CF204E Little Elephant and Strings(同bzoj3277)
原题,还写了好久orz。传送门原创 2017-10-07 14:11:41 · 585 阅读 · 0 评论 -
Codeforces Round #439
CF869A The Artful Expedient(暴力/异或性质)CF869B The Eternal Immortality(数学+模拟)CF869C The Intriguing Obsession(组合数学/dp)原创 2017-10-07 15:21:01 · 339 阅读 · 0 评论 -
CF272C Dima and Staircase(线段树/贪心)
线段树直接维护区间最大值即可。或者可以发现,最大值只可能出现在最左端或最右端,贪心解决。原创 2017-10-07 22:31:43 · 337 阅读 · 0 评论 -
CF343D Water Tree(线段树+dfs序+思路)
首先对于操作一,我们按照老套路把树上结点用dfs序变成序列,每个结点的子树均为in[x]~out[x]连续的一段,段修改即可。对于操作2,往上找父亲肯定不好实现,怎么办呢?我们只改这一个点,把他改为0,然后在询问x点的时候,我们查询x的子树中是否有0,有的话他一定也是0(他一定是那个点的父亲)。这样就很巧妙的把一个点会影响他的所有祖先转化成了单点修改,查询子树。需要注意的是,这样做的话,做操作1时要原创 2017-10-07 22:39:49 · 359 阅读 · 0 评论 -
CF482B Interesting Array(线段树+位运算)
限制是区间按位与的结果必须为x,则根据按位与的性质,区间内的每一个数都至少“有”x,因此我们可以给这个区间的所有数或上x。因此我们先根据m个操作进行m个区间或操作。然后m次查询区间与是否满足要求。因此我们还要维护区间与。线段树即可。原创 2017-10-08 13:00:19 · 439 阅读 · 0 评论 -
CF295A Greg and Array(差分+前缀和)
区间加法,用差分的思想变成点修改,然后每次操作就可以O(1)搞了。原创 2017-10-08 13:32:00 · 576 阅读 · 0 评论 -
CF276C Little Girl and Maximum Sum(贪心+差分)
统计每个点被加的次数(区间加,差分+前缀和即可),然后贪心地,让被加次数多的尽量大。(CF以前还有这种水题的?(捂脸逃 )原创 2017-10-08 13:41:54 · 431 阅读 · 0 评论 -
Codeforces Round #441
CF876A Trip For Meal(贪心水题)原创 2017-10-17 21:09:24 · 333 阅读 · 0 评论 -
CF875C National Property(简化版的2-sat)
这题原来是2-sat,果然还是我太弱,哪会什么2-sat呀。。以为随便模拟呢x 这题应该是个简化版的2-sat,先把前缀都合并了,然后考虑两个相邻串的大小问题,显然只与第一个不同的数字有关,记前一个串的为x,后一个串的为y。 则若x>y,为了满足条件,x必须大写。 若x< y,为了满足条件,如果y大写了,x也一定要大写,我们就建一条有向边(y->x)。然后用一遍dfs把所有需要变成大写的都变成原创 2017-10-17 22:20:14 · 574 阅读 · 0 评论 -
CF811E Vladik and Entertaining Flags(线段树+并查集)
这题不错,jy神犇一语中的,道破此题本质。%%% 然而维护的信息还是比较需要细节的。然而写完bzoj1018这题简直就是小菜一碟~因为n很小,所以我们考虑用线段树维护每一列的信息。区间合并的时候我们需要知道合在一起的两列的联通情况,因此对于每个节点我们需要记录l[n],r[n],区间左右端点的连通信息。为了查询我们还需要知道区间连通块个数。因此再维护一个tot。考虑区间合并,我们可以用并查集来O(原创 2017-10-08 21:29:02 · 348 阅读 · 0 评论 -
CF870D Something with XOR Queries(异或+暴力枚举)
首先考虑如果n^2的询问我们都问了,如何算出答案。我们已知了两两数之间的异或和,则我们可以枚举p0的取值,根据p0的取值算出所有数的取值,然后去检查是否合法即可。那我们现在最多只能问2n个问题,如何实现n^2个问题的效果呢?我们先得到p0与bi的所有异或值,用掉n个问题,然后再得到b0与pi的所有异或值,用掉n-1个问题。 对于p0^pi,可以直接通过p0^b0^b0^pi得到。然后对于pi^bj原创 2017-10-18 08:49:33 · 639 阅读 · 0 评论 -
CF870E points, Lines and Ready-made Titles(并查集+图论+快速幂)
我们把每条线看做并查集上的一个点,那么图上的每个点相当于连接了两条线。我们去维护一下每个联通快内有多少条边,是否有环。如果没环,也就是n个点,n-1条边,是一棵树,由于每条边最多只能贡献一个点,所以显然不能实现n个点的情况。总情况数为2^n -1。如果有环,可以实现所有情况,总情况数为2^n。都乘起来就好了。(显然互不影响的边只要用乘法原理乘起来就好啦)orz leoly原创 2017-10-18 10:44:23 · 432 阅读 · 0 评论 -
CF16E Fish(概率dp+状压dp)
这题好像思路还是很简单的。。。概率推了一会。。。太弱了。。。原创 2017-10-18 17:21:15 · 556 阅读 · 0 评论 -
CF678E Another Sith Tournament(概率dp+状压dp)
这题又想了会???一开始题都没读对orz。。其实就是让你安排一个比赛顺序,要求1最后存活的概率最大,求这个最大的概率。dp[s][i]表示状态s时擂主为i+1,最后1活下来的最大概率 。我们考虑倒着推(因为正着推难以统计答案x),则状态转移很显然:见代码。。。初始值给dp[1][0]=1,因为要求最后1存活下来。复杂度O(2^n*n^2)原创 2017-10-18 22:14:08 · 486 阅读 · 0 评论