- 博客(25)
- 资源 (1)
- 收藏
- 关注
原创 【二分+最大流Dinic】BZOJ1305(CQOI2009)[dance跳舞]题解
题目概述一次舞会有 nn 个男孩和 nn 个女孩。每首曲子开始时,所有男孩和女孩恰好配成 nn 对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和 kk 个不喜欢的女孩跳舞,而每个女孩也最多只愿意和 kk 个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?解题报告先二分答案 mid
2017-11-30 20:39:31 374
原创 【区间DP】BZOJ1260(CQOI2007)[涂色paint]题解
题目概述一个木板,每个地方有目标颜色。每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。用尽量少的涂色次数达到目标。解题报告以前做过的题目……现在回头看发现不是非常难。定义 f[L][R][c]f[L][R][c] 表示 [L,R][L,R] 目前颜色为 cc ,涂成目标颜色的最小次数。那么每次先将左边和右边目标颜色为 cc 的地方无视掉,得到新端点 [l,r][l,r] ,然
2017-11-28 20:48:48 304
原创 【平衡树维护序列】BZOJ3506(Cqoi2014)[排序机械臂]题解
题目概述BZOJ原题意:同OJ1552。BZOJ1552:权限题。城市套路深,我要回农村。给出一个长度为 nn 的序列,执行 nn 次操作,第 ii 次操作需要找到 [i,n][i,n] 中最小的数所在的位置 pp ,并翻转 [i,p][i,p] 。ps:如果相同取位置靠前的。解题报告QAQ,查了两天,发现我没看到相同取靠前。于是我用基数排序将相同的硬是搞成了不相同的……直接Splay,只不过要多实
2017-11-28 19:08:45 304
原创 【巴什博弈】HDU2147[kiki's game]题解
题目概述一个棋盘,刚开始在 (1,m)(1,m) ,每次可以往左或下或左下走一步,问先手是否必胜。解题报告直接求 SGSG 函数就行了。但是如果把 SGSG 函数打表出来,会发现只要 nn 是偶数或者 mm 是偶数就能必胜,这好像就是巴什博弈???示例程序#include<cstdio>using namespace std;const int maxn=2000;int n,m;bool f[
2017-11-26 21:22:25 335
原创 【Anti-Nim】BZOJ1022(SHOI2008)[小约翰的游戏John]题解
题目概述有 nn 堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输。小约翰先取石子,预测一下谁将获得游戏的胜利。解题报告反 NimNim 游戏……安利ZXLdalao的博客。示例程序#include<cstdio>using namespace std;const int maxn=50
2017-11-25 11:07:11 284
原创 【SG函数】BZOJ1188(HNOI2007)[分裂游戏]题解
题目概述游戏规则:共有 nn 个瓶子,第 ii 个瓶子中装有 pip_i 颗巧克力豆,两个人轮流取豆子,每一轮每人选择瓶子 i,j,k,i<j≤ki,j,k,i<j\le k 且第 ii 个瓶子中至少要有 11 颗巧克力豆,随后这个人从第 ii 个瓶子中拿走一颗豆子并在 j,kj,k 中各放入一粒豆子。如果轮到某人而他无法按规则取豆子,那么他将输掉比赛。问先手第一次操作后使对手必败的方案数。解题报告
2017-11-25 09:35:14 320
原创 【SG函数】HDU1847[Good Luck in CET-4 Everybody!]题解
题目概述有 nn 张牌,每次可以拿走 2i2^i 张牌,拿走最后一张牌的人获胜,求先手是否必胜。解题报告先求出 [1,maxn][1,maxn] 的SG函数,然后判断SG(n)是不是 00 就可以了。这个数据范围是给 O(n2)O(n^2) 的吧……实际上 O(nlog2n)O(nlog_2n) 就行了。示例程序#include<cstdio>using namespace std;const
2017-11-23 20:20:19 218
原创 【二分】BZOJ1816(Cqoi2010)[扑克牌]题解
题目概述你有 nn 种牌,第 ii 种牌的数目为 cic_i 。另外有一种特殊的牌:joker,它的数目是 mm 。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成 11 套牌。给出 n,mn,m 和 cic_i ,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。解题报告不难……NOIP之后(期中考试之前)的放松题。首先想到二分
2017-11-18 22:25:16 326
原创 (补)NOIP2017Day2暴力记
心路历程传送门T1给出几个球的圆心坐标 (x,y,z)(x,y,z),以及所有球的半径 RR 和上边界 HH (下边界为 00 ),问是否可以从下边界穿越球到上边界。直接并查集判断一下就行了。考完之后听说要卡常QAQ,我是不是要gg了??T2给出 nn 个点 mm 条双向边,现在要选出一棵有根树,一条边权为 ww 的边 (u,v)(u,v) 的代价是 dep(v)×wdep(v)\times w ,
2017-11-18 18:48:12 672
原创 NOIP2017Day1酱油记
心路历程传送门T1求两个互素的数 A,BA,B 无法组成的最大的数。找呀找呀找规律,发现答案是 AB−A−BAB-A-B 。 对拍了一下好像没有毛病,JZdalao说他证明出来了Orz。 之后听说是小学奥数题???真是恐惧QAQ。T2给出一连串循环(可以嵌套),循环起点和终点要么是常数要么是 nn 。求时间复杂度是否与给出的一致。大力模拟题……开个栈乱搞……班主任(?)保佑我T2不炸……T3给出
2017-11-11 20:41:27 623
原创 【二分图最大独立集】BZOJ4808[马]题解
题目概述给出 n×mn\times m 的棋盘(有些位置有损坏),问最多能在其中放多少互不吃到的马(不能放在损坏位置中)。解题报告NOIP2017前的最后一题QAQ。首先将棋盘 0101 间隔染色,然后就成了二分图。由于要放最多的马,其实就是最大独立集。最大独立集 == 点数 −- 最小点覆盖 == 点数 −- 最大匹配。示例程序#include<cstdio>using namespace st
2017-11-10 21:40:15 368
原创 【桥】HDU4738[Caocao's Bridges]题
题目概述给出 nn 个点, mm 条边的无向图。求边权最小的桥。ps:这题有毒,当边权为 00 的时候要输出 11 ,图不连通时输出 00 。解题报告桥连接着两个边双联通分量,删去桥时整个图的连通块数会增加。求桥有两种方法:1.求出边双,不在边双中的就是桥。2.一条边 (x,y)(x,y) 是桥当且仅当 dfn[x]<low[y]dfn[x]<low[y] 。只求桥的时候采用后者较为方便。示例程序因
2017-11-10 16:43:12 322
原创 【期望DP】BZOJ1419[Red is good]题解
题目概述有 AA 张红牌, BB 张黑牌。现在将 A+BA+B 张牌打乱,每次翻牌。翻到红牌得到一元钱,翻到黑牌失去一元钱。可以随时停止翻牌,求在最优策略下得到钱数的期望。解题报告期望DP通用套路,倒着来。定义 f[i][j]f[i][j] 表示剩下 ii 张红牌, jj 张黑牌得到钱数的期望。那么 f[i][j]=ii+jf[i−1][j]+ji+jf[i][j−1]f[i][j]=\frac{i
2017-11-10 15:04:22 424
原创 【卡特兰数】BZOJ1856(Scoi2010)[字符串]题解
题目概述给出 n,mn,m ,若一个 0101 序列在任意位置满足 11 的个数大于 00 的个数,则该序列是满足条件的。求由 nn 个 00 , mm 个 11 组成的满足条件的序列个数。解题报告n=mn=m 的时候显然是卡特兰数, n>mn>m 其实和卡特兰数类似。先算出所有序列的个数,方案是 (n+mn)n+m\choose n ,然后算出不满足条件的序列个数。怎么算?将 11 看成向上走,
2017-11-10 11:23:29 312
原创 【组合+错排】BZOJ4517(Sdoi2016)[排列计数]题解
题目概述如果 ai=ia_i=i 则 ii 是稳定的。给出 n,mn,m ,求稳定数为 mm 的 nn 的排列的个数。解题报告其实很简单……先选出 mm 个稳定位置,然后另外 n−mn-m 强制不稳定。强制不稳定也就是 ai≠ia_i\not=i ,即错排。结果发现我并不记得错排了……于是去看了一下……读者老爷先看代码吧……我明天填坑……示例程序#include<cstdio>#include<c
2017-11-09 22:59:48 438
原创 【组合】Codeforces40E[Number Table]题解
题目概述有 n×mn\times m 的 1,−11,-1 矩阵,现在 k(0≤k<max{n,m})k(0\le k<max\{n,m\}) 个位置已经确定,求每行每列乘积均为 −1-1 的方案数。解题报告好题!注意到 0≤k<max{n,m}0\le k<max\{n,m\} ,所以至少有一行或一列是没有任何一个元素确定过了的。令 n>mn>m ,我们可以先把其他 n−1n-1 行确定下来(组合
2017-11-09 11:24:16 292
原创 【高维前缀和】Codeforces165E[Compatible Numbers]题解
题目概述给出序列 {an}\{a_n\} ,对于每个 ii ,输出任意一个满足 ai and aj=0a_i\ and\ a_j=0 的 aja_j 。解题报告这种东西马上想到高维前缀和求超集……不过只需要求任意解,所以更简单了……网上好像有用状压DP做的……我不清楚……(高维前缀和算状压吧QAQ?)示例程序#include<cstdio>#include<cctype>#include<cst
2017-11-06 15:05:42 354
原创 【DP】BZOJ1084(SCOI2005)[最大子矩阵]题解
题目概述有一个 n×mn\times m ( m≤2m\le 2 )的矩阵,选出其中 kk 个子矩阵,使得这 kk 个子矩阵分值之和最大。选出的 kk 个子矩阵不能相互重叠。解题报告因为只有两列……所以随便定义一下就行了。定义 f[i][s][k]f[i][s][k] 表示前 ii 行,第 ii 行的状态为 ss ,选了 kk 个子矩阵的最优解,状态有:00 :不选第 ii 行。11 :选第 i
2017-11-05 16:07:09 313
原创 【区间DP】POJ3280[Cheapest Palindrome]题解
题目概述给出 nn 个小写字母(有插入代价以及删除代价)以及长度为 mm 且只包含给出小写字母的字符串。插入和删除可以在任意位置进行,求最小代价使得该字符串变为回文串。解题报告千万不能想得太复杂……其实很简单……定义 f[i][j]f[i][j] 表示使原串中 [i,j][i,j] 变为回文串的最小代价,那么有三种策略:将 [i+1,j−1][i+1,j-1] 变为回文串,然后用最小代价使两端的
2017-11-04 16:51:53 198
原创 【区间DP】POJ2955[Brackets]题解
题目概述给出一个长度不超过 100100 的括号序列( ()[]()[] ),一个合法的括号序列要么是空序列,要么满足:如果 ss 是合法序列,则 (s),[s](s),[s] 也是合法序列。如果 x,yx,y 是合法序列,则 xyxy 也是合法序列。求给出括号序列的最长合法子序列的长度。解题报告显然是区间DP,定义 f[i][j]f[i][j] 表示 [i,j][i,j] 的最优解,那么根据
2017-11-04 13:32:30 521
原创 【数位DP】HDU3943[K-th Nya Number]题解
题目概述Nya数有 XX 个 44 和 YY 个 77 ( X,YX,Y 给出),求 (l,r](l,r] 中第 kk 小的Nya数。解题报告对于我这种英语盲……英文题面容易漏条件……题目要求 (l,r](l,r] 但是我看成 [l,r][l,r] ……定义 f[i][x][y]f[i][x][y] 表示选了 ii 位有 xx 个 44 , yy 个 77 的方案数。然后二分一下就行了。好像有非二分
2017-11-03 21:24:43 261
原创 【数位DP】HDU3652[B-number]题解
题目概述求 [1,n][1,n] 中含有 1313 且是 1313 的倍数的数的个数。解题报告因为在复习,所以水博客就做了一下。常用套路,定义 f[i][j][k]f[i][j][k] 表示放了 ii 位余数( mod 13mod\ 13 )为 jj 状态为 kk 的方案数( 00 :没有 1313 ; 11 :没有 1313 ,目前高位是 11 ; 22 :有 1313 ),然后直接记忆化DFS就
2017-11-03 20:33:15 346
原创 【DP】RQNOJ107[Ural的鹰蛋实验]题解
题目概述经典的鹰蛋问题,就因为懒所以不写了。解题报告不知道大家第一想法是不是二维DP,反正我不是……2015年,当我还是普及组大菜鸡(现在是提高组大菜鸡)时,我看到了这道题。然后根本不会,直到教练下发题解……题解上是……没错……区间DP f[L][R][egg]f[L][R][egg] ……(黑历史完……)显然所有区间都是等价的,唯一重要的是区间长度,所以可
2017-11-02 21:51:43 505 2
原创 【单调队列】BZOJ1047(HAOI2007)[理想的正方形]题解
题目概述有一个 a×ba\times b 的整数组成的矩阵,从中找出一个 n×nn\times n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。解题报告水博客……解法很多,可以二维ST表,线段树套线段树(雾)……O(n)O(n) 解法好……先按照行做单调队列预处理出每个点向左推 nn 个的极值,然后按照列做单调队列求出每个点向上向右推 nn 个的极值就行了。示例程序#include<c
2017-11-01 22:25:44 286
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人