09 2016 档案

摘要:$dp$。 记$dp[i][j]$表示已经放了$i$个数字,并且第$i$个数字放了$j$的方案数。那么$dp[i][j] = \sum\limits_{k|j}^{} {dp[i - 1][k]}$。答案为$\sum\limits_{k=1}^{m} {dp[n][k]}$ 阅读全文
posted @ 2016-09-30 21:07 Fighting_Heart 编辑
摘要:线段树。 线段树维护区间矩阵和,操作都是最简单的线段树。$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高。 阅读全文
posted @ 2016-09-29 23:06 Fighting_Heart 编辑
摘要:位运算。 又涨姿势了:$a + b = (aXORb) + 2*(aANDb)$,$ (aXORb)$是不进位的部分,$2*(aANDb)$为进位之后的部分,相加就是$a + b$。 知道了这个转换,这题就很容易了。设$n=a+b$,$m=(aXORb)$,$x=(aAND b)$;$n$、$m$和 阅读全文
posted @ 2016-09-29 18:48 Fighting_Heart 编辑
摘要:$KMP$。 $n=1$和$n=2$的时候可以单独计算。$n>2$时,可以拿字符和数字分别做一次匹配,然后扫描一遍判断一下就可以计算出答案了。 阅读全文
posted @ 2016-09-29 14:48 Fighting_Heart 编辑
摘要:暴力。 虽然$a[i]$最大有${10^9}$,但是$m$最大只有${10^6}$,因此可以考虑暴力。 记$cnt[i]$表示数字$i$有$cnt[i]$个,记$p[i]$表示以$i$为倍数的情况下,最多能选出多少个数字。 $p[i]$可以暴力计算出来,最后就是找到$p[i]$最大的$i$,然后输出 阅读全文
posted @ 2016-09-28 21:02 Fighting_Heart 编辑
摘要:简单题。 第一次交换$1$和$n$,第二次交换$2$和$n-1$,第三次交换$3$和$n-2$.....计算一下就可以了。 阅读全文
posted @ 2016-09-28 13:31 Fighting_Heart 编辑
摘要:简单模拟。 阅读全文
posted @ 2016-09-28 13:31 Fighting_Heart 编辑
摘要:枚举,三分。 首先,这$n+1$个人一定是连续的放在一起的。可以枚举每一个起点$L$,然后就是在$[L,R]$中找到一个位置$p$,使得$p4最优,因为越往两边靠,距离就越大,在中间某位置取到最优解,所以三分一下就可以了。 阅读全文
posted @ 2016-09-28 13:29 Fighting_Heart 编辑
摘要:二分,拓扑排序。 二分答案,然后进行拓扑排序检查,若某次发现存在两个或者两个以上入度为$0$的节点,那么不可行。 阅读全文
posted @ 2016-09-28 13:26 Fighting_Heart 编辑
摘要:$dp$,贪心。 不得不说这题出的很$6$,解法更$6$。 首先要会统计一个字符串有多少个本质不同的子序列,有两种$dp$策略: ①$dp[i]$表示$[1,i]$内的字符有多少种本质不同的子序列,$dp[i]=2*dp[i-1]-dp[pre[s[i]]-1]$,如果$s[i]$是第一次出现,那么 阅读全文
posted @ 2016-09-28 13:04 Fighting_Heart 编辑
摘要:树状数组,$map$。 可以理解为开一个数组$f[i][j]$记录:$i$这个数字在时间$j$的操作情况。 操作$1$:$f[x][t]++$。操作$2$:$f[x][t]--$。操作$3$:$f[x][1]$至$f[x][t]$求和。 数组开不出来,但可以开$map$,状态最多$100000$个, 阅读全文
posted @ 2016-09-26 16:28 Fighting_Heart 编辑
摘要:模拟。 每个奇数走的步长都是一样的,每个偶数走的步长也是一样的。 记$num1$表示奇数走的步数,$num2$表示偶数走的步数。每次操作更新一下$num1$,$num2$。最后输出。 阅读全文
posted @ 2016-09-25 08:31 Fighting_Heart 编辑
摘要:模拟。 把操作记录一下,倒着复原回去。 阅读全文
posted @ 2016-09-25 08:28 Fighting_Heart 编辑
摘要:$dp$。 这题的突破口在于要求数字是连续的。 可以分别记录两个串以某个数字为结尾的最长上升长度,然后枚举一下以哪个数字为结尾就可以得到答案了。 因为$case$有点多,不能每次$memset$,额外开一个数组记录一下这组$case$中数字有没有出现过。 阅读全文
posted @ 2016-09-25 08:24 Fighting_Heart 编辑
摘要:$dp$预处理,贪心。 因为$t$串前半部分和后半部分是一样的,所以只要构造前一半就可以了。 因为要求字典序最小,所以肯定是从第一位开始贪心选择,$a,b,c,d,...z$,一个一个尝试过去,如果发现某字符可行,那么该位就选择该字符。 第$i$位选择字符$X$可行的条件: 记这一位选择字符$X$的 阅读全文
posted @ 2016-09-25 08:12 Fighting_Heart 编辑
摘要:简单题。 阅读全文
posted @ 2016-09-23 12:34 Fighting_Heart 编辑
摘要:简单题。 统计一下懂每种语言的人分别有几个,然后$O(n)$扫一遍电影就可以得到答案了。 阅读全文
posted @ 2016-09-23 12:33 Fighting_Heart 编辑
摘要:简单题。 阅读全文
posted @ 2016-09-23 12:33 Fighting_Heart 编辑
摘要:二分。 二分一下答案,然后验证一下。 阅读全文
posted @ 2016-09-23 12:31 Fighting_Heart 编辑
摘要:链表,模拟。 写一个双向链表模拟一下过程。 阅读全文
posted @ 2016-09-23 12:30 Fighting_Heart 编辑
摘要:模拟。 首先暴力找到答案的位数,然后就是分类讨论输出答案。 阅读全文
posted @ 2016-09-23 12:29 Fighting_Heart 编辑
摘要:矩阵快速幂,欧拉定理。 $g(n)$递推式:$g(n)=5g(n-1)+5g(n-2)-g(n-3)$,可以构造矩阵快速求递$n$项,指数很大,可以利用欧拉定理降幂。 阅读全文
posted @ 2016-09-21 20:41 Fighting_Heart 编辑
摘要:$AC$自动机。 用$AC$自动机匹配一次,开一个$flag$记录一下以$i$位置为结尾的最长要打$*$多少个字符,然后倒着扫描一次就可以输出了。 阅读全文
posted @ 2016-09-21 20:10 Fighting_Heart 编辑
摘要:树的直径。 比赛的时候想着先树$dp$处理子树上的最长链和次长链,然后再从上到下进行一次$dfs$统计答案,和$CCPC$网络赛那个树$dp$一样,肯定是可以写的,但会很烦.......后来写崩了。 然后有一种新思路,很容易写。 假设下图中红线是树的直径,圆圈是直径上的节点,黑线表示一颗树。 如果删 阅读全文
posted @ 2016-09-21 13:43 Fighting_Heart 编辑
摘要:预处理,$01$背包,$bitset$优化。 可以预处理出每一种询问的答案,用$01$背包计算答案,$dp[i][j][k]$表示,前$i$个数字中,选择了$j$个,能否凑出$k$这个数字,可以开成$bitset<90>dp[55][12]$,第三维$bitset$位运算优化。 $HDU$不稳,有时 阅读全文
posted @ 2016-09-21 07:29 Fighting_Heart 编辑
摘要:欧拉回路。 首先根据连通性以及欧拉回路存在条件判掉不可能的情况,剩下的情况都存在解。 如果有两个奇度的点,那么答案是唯一的。(可以利用度来求解每一个点被走了几次) 如果全是偶数度的点,那么答案不唯一,但是去掉起点被多访问一次的答案也是唯一的,因此只需枚举起点就可以了。 阅读全文
posted @ 2016-09-19 22:42 Fighting_Heart 编辑
摘要:打表,二分。 满足条件的数字个数不多,可以全部找出来,排个序,每次询问的时候二分一下。 阅读全文
posted @ 2016-09-19 22:37 Fighting_Heart 编辑
摘要:打表,预处理。 因为只要保留$5$位小数,所以$n$大于某个数字的时候,答案都是一样的,通过寻找可以发现$n$大约为$2000000$。读入的时候需要用字符串。 阅读全文
posted @ 2016-09-19 22:35 Fighting_Heart 编辑
摘要:简单题。 阅读全文
posted @ 2016-09-19 22:33 Fighting_Heart 编辑
摘要:二分,验证。 二分$k$,然后进行验证。有一个地方需要注意一下:如果$n$个数,每次合并$k$个,最后一次不能合$k$个,那么一开始需要补$0$之后再合并才是最优的。合并的时候用优先队列合并时间复杂度过高,可以用两个队列模拟一下,优化掉一个$log$。 阅读全文
posted @ 2016-09-19 22:32 Fighting_Heart 编辑
摘要:背包,$map$,优化。 和普通背包一样,$map$加一个$erase$优化一下就可以跑的很快了。 阅读全文
posted @ 2016-09-19 22:28 Fighting_Heart 编辑
摘要:并查集,$dfs$。 从大的数字往里加,每加一个数字合并一下连通块,判断连通块内数字个数是否够,以及k能不能被当前加入的数字整除。然后$dfs$一下构造答案。 阅读全文
posted @ 2016-09-19 11:11 Fighting_Heart 编辑
摘要:$dp$,前缀和。 记$dp[i][j]$表示$i$轮结束之后,两人差值为$j$的方案数。 转移很容易想到,但是转移的复杂度是$O(2*k)$的,需要优化,观察一下可以发现可以用过前缀和来优化。 我把所有的数组全部开成$long$ $long$超时了,全改成$int$就$AC$了...... 阅读全文
posted @ 2016-09-17 10:10 Fighting_Heart 编辑
摘要:离散化,树状数组,组合数学。 这题的大致思路和$HDU$ $5700$一样。都是求区间交的问题。可以用树状数组维护一下。 这题的话只要计算每一个$i$被统计了几次,假设第$i$点被统计了$ans[i]$次,累加和就是答案。 $ans[i]$就是看$i$点之后有多少个区间右端点,假设有$m$个,那么$ 阅读全文
posted @ 2016-09-16 10:01 Fighting_Heart 编辑
摘要:递归,$RMQ$。 因为$n$较大,可以采用递归建树的策略。 对每一个点标一个$id$。然后按照$v$从小到大排序,每一段$[L,R]$的根节点就是$id$最小的那个。 因为二叉搜索树可能是一条链,所以不能暴力找$id$最小的,需要用线段树或者$RMQ$预处理快速寻找。 阅读全文
posted @ 2016-09-15 20:22 Fighting_Heart 编辑
摘要:暴力。 每个人找到一个入口,也就是从回收站到这个入口走的路程由人的位置到入口的路程来替代。 因此,只要找两个人分别从哪里入口就可以了。注意:有可能只要一个人走,另一人不走。 阅读全文
posted @ 2016-09-15 13:28 Fighting_Heart 编辑
摘要:$dp$。 题意中有一个词组:$in$ $a$ $row$,是连续的意思.... 因此这题只要倒着$dp$一下就可以了。$f[i][0]$表示从$i$位置往后割两个能否割,$f[i][1]$表示从$i$位置往后割三个能否割。 阅读全文
posted @ 2016-09-15 10:42 Fighting_Heart 编辑
摘要:思维。 当$k$趋向于正无穷时,答案会呈现出两种情况,不是$0$就是$1$。我们可以先判断掉答案为$1$和$0$的情况,剩下的情况都需要计算。 需要计算的就是,将最小的几个数总共加$k$次,最小值最大会是多少,以及将最大的几个数总共减$k$次,最大值最小可能是多少。两者相减就是答案。 阅读全文
posted @ 2016-09-14 22:22 Fighting_Heart 编辑
摘要:贪心,递推,线段树,$RMQ$。 假设我们记$ans[i]$是以$i$点为起点对答案的贡献,那么答案就是$\sum\limits_{i = 1}^n {ans[i]}$。 $ans[i]$怎么计算呢? 首先,$[i+1,a[i]]$区间上肯定都是$1$(即上图紫线)。 然后在$[i+1,a[i]]$ 阅读全文
posted @ 2016-09-14 15:02 Fighting_Heart 编辑
摘要:最短路。 $dis[i][j][k]$记录到点$(i,j)$,门的状态为$k$时的最短路。转移的时候有$8$种方案,即直接走向周围四个点,或者进行旋转。比较烦的是判断两个相邻的点在状态$k$下是否连通,仔细一些就可以了。 阅读全文
posted @ 2016-09-14 10:47 Fighting_Heart 编辑
该文被密码保护。
posted @ 2016-09-14 09:01 Fighting_Heart 编辑
摘要:$dp$,树状数组。 很明显这是一个$DAG$上的$dp$,由于边太多,暴力$dp$会超时,需要优化。 例如计算$dp[x][y]$,可以将区域分成四块,$dp[x][y]$取四块中的最小值,每一块用一个二维树状数组维护最小值即可。 每次扩展一层需要一个新的树状数组,因为每次初始化树状数组会超时,所 阅读全文
posted @ 2016-09-13 20:03 Fighting_Heart 编辑
摘要:$dfs$,贪心。 阅读全文
posted @ 2016-09-13 15:34 Fighting_Heart 编辑
摘要:随便判了几个条件就过了,也不知道对不对的。 正解应该是: $[1].$${s_1} + {s_2} + {s_3} + ...... + {s_n} = n(n - 1)$ $[2].$${s_1} + {s_2} + {s_3} + ...... + {s_i} ≥ i(i - 1)$ 阅读全文
posted @ 2016-09-12 21:10 Fighting_Heart 编辑
摘要:广搜。 因为路径的长度均为$1$,所以每个节点只会被更新一次。 思路:对于一个还未确定路径长度的点$i$,如果他除了与他直接相邻的点之外有别的点已经确定了最短路,那么这个点现在也可以确定最短路了。 阅读全文
posted @ 2016-09-12 20:37 Fighting_Heart 编辑
摘要:公式,矩阵快速幂,欧拉函数,乘法逆元。 $an{s_n} = \frac{1}{n}\sum\limits_{d|n} {\left[ {phi(\frac{n}{d})×\left( {fib(d - 1) + fib(d + 1)} \right)} \right]}$。 阅读全文
posted @ 2016-09-12 20:29 Fighting_Heart 编辑
摘要:离线操作,树状数组,$RMQ$。 这个题的本质和$HDU$ $3333$是一样的,$HDU$ $3333$要求计算区间内不同的数字有几个。 这题稍微变了一下,相当于原来扫描到$i$的之后是更新$a[i]$的情况,现在是更新$log$级别个数的数字(因为以$i$为结尾的区间,最多只有$log$级别种不 阅读全文
posted @ 2016-09-12 20:28 Fighting_Heart 编辑
摘要:结论。 如果颜色数量$≥$人数的平方除以$4$,那么一定可行;反之不行。 阅读全文
posted @ 2016-09-12 20:24 Fighting_Heart 编辑
摘要:线段树。 因为是取模运算,所以数字减少的速度是很快的,因此只要每次寻找一下比当前取完模之后的数小的数就可以了。用线段树寻找一下。 阅读全文
posted @ 2016-09-12 20:23 Fighting_Heart 编辑
摘要:$dfs$序,线段树。 可以统计每一个节点作为$root$的子树上对答案的贡献,可以将树转换成序列。问题就变成了一段区间上求小于等于某个值的数有几个。用线段树记录排好序之后的区间序列,询问的时候,属于询问区间的每个节点二分一下统计答案即可。 阅读全文
posted @ 2016-09-12 16:06 Fighting_Heart 编辑
摘要:$dfs$,后续遍历。 如果某个节点$a[i]=i$,那么$i$的后继的$a[i]$都要指向$i$,直到出现新的后继$j$,$a[j]=j$。利用这个可以判断是否有解。 如果有解的话,那么只要输出后序遍历的结果就可以了。 阅读全文
posted @ 2016-09-10 22:12 Fighting_Heart 编辑
摘要:$dp$,最长公共子序列变形。 $f[i][j][h][0]$表示:$s[1 \cdots i]$与$t[1 \cdots j]$,分成了$k$段,并且$s[i]$与$t[j]$之后没有切的最优解。 $f[i][j][h][1]$表示:$s[1 \cdots i]$与$t[1 \cdots j]$, 阅读全文
posted @ 2016-09-09 21:29 Fighting_Heart 编辑
摘要:树的重心,树形$dp$。 记录以$x$为$root$的子树的节点个数为$sz[x]$,重儿子为$son[x]$,重心为$ans[x]$。 首先要知道一个结论:以$x$为$root$的子树的重心$ans[x]$,一定在$ans[son[x]]$到$x$的路径上,即以$x$的重儿子为根的子树的重心到$x 阅读全文
posted @ 2016-09-09 09:26 Fighting_Heart 编辑
摘要:二分。 统计过程如下图: 先统计红线上的个数,然后统计绿线上的个数,然后统计咖啡色线上的个数......一个一个往下统计就可以了。 阅读全文
posted @ 2016-09-06 18:06 Fighting_Heart 编辑
摘要:最短路,自适应$Simpson$积分。 看了别人的题解才知道有个东西叫自适应$Simpson$积分。 有这样一个积分公式:$\int_a^b {f(x)dx} \approx \frac{{b - a}}{6}\left[ {f(a) + 4f\left( {\frac{{a + b}}{2}} \ 阅读全文
posted @ 2016-09-06 09:56 Fighting_Heart 编辑
摘要:莫队算法,$dfs$序。 题目要求计算将每一条边删除之后分成的两棵树的颜色的交集中元素个数。 例如删除$u->v$,我们只需知道以$v$为$root$的子树中有多少种不同的颜色(记为$qq$),有多少种颜色达到了最多数量(记为$pp$),那么以$v$为$root$的子树与另一棵树的颜色交集中元素个数 阅读全文
posted @ 2016-09-06 08:32 Fighting_Heart 编辑
该文被密码保护。
posted @ 2016-09-05 12:24 Fighting_Heart 编辑
摘要:容斥原理,组合数。 找出有$cnt$个数字还有没放,那么总方案数就是$cnt!$。 总方案数里面包含了正确的和非正确的,我们需要将非正确的删去。 先删去$1$个数字$a[i]=i$的情况,发现会多删,要加回两个数字$a[i]=i$的情况,发现会多加......就是一个容斥原理的过程。 阅读全文
posted @ 2016-09-05 10:29 Fighting_Heart 编辑
摘要:$dp$,背包。 $f[i][j][s]$表示前$i$个物品,凑出$j$价格的情况下,能否凑出$s$价格,$f[i][j][s]=1$表示能,否则不能。 转移很简单:如果$f[i][j][s]=1$,那么$f[i+1][j][s]=1$,$f[i+1][j+c[i]][s]=1$,$f[i+1][j 阅读全文
posted @ 2016-09-05 09:52 Fighting_Heart 编辑
摘要:数论。 如果$x$不唯一,假设存在两个解,较大的为${x_1}$,较小的为${x_2}$。 那么, $\left\{ {\begin{array}{*{20}{c}}{{x_1}\% {c_i} = {x_2}\% {c_i}}\\{{x_1}\% k \ne {x_2}\% k}\end{arra 阅读全文
posted @ 2016-09-04 21:05 Fighting_Heart 编辑
摘要:枚举,二分,$RMQ$。 对于一个序列来说,如果固定区间左端点,随着右端点的增大,最大值肯定是非递减的,最小值肯定是非递增的。 因此,根据这种单调性,我们可以枚举区间左端点$L$,二分找到第一个位置${{p_1}}$,使得$\mathop {\max }\limits_{i = L}^{{p_1}} 阅读全文
posted @ 2016-09-04 12:57 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$H$题 规律,递推。 这种问题一看就有规律。可以按位统计对答案的贡献。即第$1$位对答案作出了多少贡献,第$2$位对答案作出了多少贡献.....累加和就是答案。 先写一个暴力的程序来找找规律: #pragma comment(linker, "/STACK:1 阅读全文
posted @ 2016-09-04 09:09 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$J$题 计算几何。 阅读全文
posted @ 2016-09-03 22:31 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$B$题 拓扑排序,$dp$。 首先,这是一个$DAG$。 做这类套路题,特别需要注意,不能看着题目的式子走,按照题目式子来只会想不出来。 再来看看这式子:$\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {count( 阅读全文
posted @ 2016-09-03 22:23 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$G$题 $RMQ$,前缀和。 把左括号记为$1$,右括号记为$-1$,记$[1,i]$的前缀和为$sum[i]$。 有一个充分必要条件:正确匹配的括号串 $ \Leftrightarrow $ $sum[i] > = 0$且$sum[n]=0$。 因此,判断一 阅读全文
posted @ 2016-09-03 22:14 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$A$题 枚举。 处理一下$\% 2016$之后的数分别有几个,然后$2016*2016$枚举一下统计方案数就可以了。 阅读全文
posted @ 2016-09-03 22:11 Fighting_Heart 编辑
摘要:湖南省第十二届大学生计算机程序设计竞赛$F$题。 最短路。 如果只记录到某个节点的最短路,显然是错误的。这题的状态有两个量决定,即到了哪一个节点,最后一辆乘坐的是几号线。这个可以用$map$记录一下。 要注意的是:如果用$SPFA$,因为要标记某个状态是否在队列中,还需要额外开一个$map$,这样可 阅读全文
posted @ 2016-09-03 22:08 Fighting_Heart 编辑
摘要:枚举。 枚举每一条边,如果发现边的一端$f[u]=1$,另一端$f[v]=0$,那么更新答案,取最小值就好了。 阅读全文
posted @ 2016-09-03 09:55 Fighting_Heart 编辑
摘要:简单题。 阅读全文
posted @ 2016-09-03 09:54 Fighting_Heart 编辑
摘要:贪心。 肯定是两个$a$之间的那些字符都$-1$,没有$a$就全部$-1$。如果输入的串全是$a$,那么把最后一个$a$改成$z$。 阅读全文
posted @ 2016-09-02 21:34 Fighting_Heart 编辑
摘要:分类讨论。 先对$n$个坐标进行排序。如果$a$在$x[1]$左边,那么肯定是$x[n]$不走。如果$a$在$x[n]$右边,那么$x[1]$不走。 剩下的讨论一下是$x[1]$不走还是$x[n]$不走,几种情况都算一下取最小值即可。 阅读全文
posted @ 2016-09-02 21:32 Fighting_Heart 编辑
摘要:简单题。 阅读全文
posted @ 2016-09-02 21:30 Fighting_Heart 编辑
摘要:二分,排序,贪心。 最优比率生成树,可以二分$+$贪心来实现,不过这样做精度不行。 如果是这样一个问题,该如何解决:问你$n$个里面选择$k$个,能否使得$\frac{{\sum\limits_{j = 1}^k {{v_{{i_j}}}} }}{{\sum\limits_{j = 1}^k {{w 阅读全文
posted @ 2016-09-01 22:23 Fighting_Heart 编辑
摘要:简单$bfs$。 仔细一些就能过。 阅读全文
posted @ 2016-09-01 22:22 Fighting_Heart 编辑
摘要:枚举,排序。 先将所有点按双关键字排序,然后枚举线的顶点$P$,剩余的点以$P$为中心进行极角排序,可以取个$gcd$,这样一样的点就排在一起了,然后统计一下更新答案。 阅读全文
posted @ 2016-09-01 22:22 Fighting_Heart 编辑
摘要:博弈。 $n>=3$,后手赢,否则先手赢。 阅读全文
posted @ 2016-09-01 22:19 Fighting_Heart 编辑
摘要:枚举。 看了这个方法:$http://www.cppblog.com/shiming413/archive/2008/12/21/29671.html$ 将数字归类的地方不能用$vector$,会超时。$vector$换成数组就可以过,类似于邻接表。 因为题目给出的$16$个数字都是不同的,所以时间 阅读全文
posted @ 2016-09-01 22:14 Fighting_Heart 编辑
摘要:主席树,区间第$k$大。 阅读全文
posted @ 2016-09-01 09:44 Fighting_Heart 编辑