08 2020 档案
摘要:题目 解析 看到这题,没想到 \(dp\) 果断打了暴力 暴力理应只有 $30$ 左右的样子 然而我加上了些奇技淫巧竟然有 $80$ 分! 惊到我了! 我 $80$ 分的暴力: 很容易想到找到所有可找的路计算方差取最小值 然后发现计算方差的所有数中,最大最小差值越小越好 于是果断二分差值,然后枚举最
阅读全文
摘要:解析 设 \(dp_i\) 表示处理完前 \(i\) 个时所花费的最小费用加上 \(i\) 因多分一组对后面产生的费用 \(dp_i = dp_j + sumt_i \times (sumf_i - sumf_j) + S \times (sumf_n - sumf_j)\) 然后斜率优化即可(\(
阅读全文
摘要:不能算解析的解析 很神仙的题 知道做法后很容易实现 这里不写题解 推荐一个:4417. 【HNOI2016模拟4.1】神奇的字符串 感谢写此博文的神犇! \(Code\) #include<cstdio> using namespace std; const int N = 1e5 + 5; int
阅读全文
摘要:题目 解析 很容易想到的 \(dp\): 设 \(f_i\) 表示已经处理完 $1..i$ 并且 \(i\) 是直接复制的需要的最小花费 那么 \(f_i=f_j+(i-j) \times (i-j-1)+c_i\) 这就是经典的斜率优化 \(dp\),一般我们考虑两个决策谁会更优 考虑 \(j,k
阅读全文
摘要:一天一次的规律题或组合数学题 然而这种复杂规律都有不少人能“打表可得”?? 答案 \(\binom{n+m}{m}-\binom{n+m}{m-1}\) \(Code\) #include<cstdio> #include<iostream> using namespace std; typedef
阅读全文
摘要:板子,正好温习一下主席树的写法 记得数组开 $32$ 倍!! \(Code\) #include<cstdio> using namespace std; const int N = 1e6 + 5; int rt[N] , a[N] , n , m , size; struct Segment{
阅读全文
摘要:题目 略,luogu上有 解析 一眼费用流 然而怎么建图? 首先我们要挖掘题中的限制条件和性质 一个点只能经过一次 能走的天数最长 满足第二条的条件下走过的路程最短 那么显然是最小费用最大流了 对于后两条,我们发现我们求的最大流就要对应天数,最小费用就要对应路程最短 再联系第一条 一个点只能经过一次
阅读全文
摘要:仅仅是个模板 \(Code\) #include<cstdio> #include<queue> #include<iostream> #include<cstring> using namespace std; const int M = 50000 , N = 5000; int n , m ,
阅读全文
摘要:题目 解析 \(Code\) #include<cstdio> #include<map> #include<iostream> #include<cstring> using namespace std; typedef unsigned long long LL; const int N = 7
阅读全文
摘要:题目 解析 多种解法:有上下界费用流(nb),树形DP等 而由于我太菜,前者待日后再补 下面介绍树形DP的解法 首先我们等发现一些性质: 最后使方差最小,树的每个点权值必然在 \([sum/n..sum/n+1]\) 之间,其中 \(sum\) 指石油总和 那么我们可不可以试试枚举最后有多少个点为
阅读全文
摘要:解析 也就是说建一棵权值线段树维护这些信息。要注意的是每次的最优解必然是 \(b\) 小的先做,故离线排序确定离散后的下标再依次求解 \(Code\) #include<cstdio> #include<algorithm> #define ls (k << 1) #define rs (ls |
阅读全文
摘要:解析 这道题比较水。 求最快什么时候做完作业? 如果要最快完成第i份作业,那么是i的前继那些作业都要完成之后才能够完成i,所以,为了尽快完成i,我们要把i的前继的作业全部先做完。 最慢什么时候做完作业? 也就是说再不完成i的前提下,我最多能够做多少作业。那哪些作业是不可以做呢?其实就是它的后继。 那
阅读全文
摘要:题目 求十进制 \(n!\) 在 \(m\) 进制下末尾 $0$ 的个数 分析 签到题 只要看 \(n!\) 有多少个 \(m\) 的倍数就好了 考虑分解 \(m\) 的质因子 然后根号计算每个因子在 \(n!\) 中有多少个 取能取到的最小值就行了 \(Code\) #include<cstdio
阅读全文
摘要:分析 近乎裸的 \(cdq\) 分治数点问题 我们考虑一个数被删去,它对删后区间逆序对个数的影响就是减去现存序列中前面比它大的个数再减去现存序列中后面比它小的个数 那么我们考虑如何处理时间限制 既然是“现存序列中”,也就是说删去时间比它晚的 那么能产生贡献的数对 \((i,j)\) 就要满足 \(i
阅读全文
摘要:题目 解析 设 \(f_{i,j}\) 表示 \(i+1..n\) 个人能受到 \(j\) 次攻击的概率 因为选人出局的顺序是无所谓的,所以我们设从 $1..n$ 依次选人出局 那么转移时需要分类,分类即加 选第 \(i\) 个人出局,那么 \(i+1..n\) 会受到 $1$ 次攻击。先前攻击了
阅读全文
摘要:题目 思路 结论题,我不会证明: 找到第一个 \(|S_n| \leq m + 1\),那么答案就是 \(m - |S_{n-2}|\) 证明?我说了我不会,就当结论用吧 这已经很恶心了 然而这题还要打高精度?! 斐波那契数列太大了 注意有很多细节问题 就当留个高精度的优美板子吧! \(Code\)
阅读全文
摘要:真正的模板!! 网上的标臭得一匹!! \(Code\) #include<cstdio> #include<algorithm> using namespace std; typedef long long LL; const int N = 1e6 + 5; int n , X[N << 1];
阅读全文
摘要:题目大意 用边长为 \(k\) 的正方形在平面内覆盖,求它能覆盖的最大点权和 思路 $60$ 分:其实很容易想到按它们的横坐标先后排序,然后单调队列维护。复杂度 \(O(n k \log k)\) 然而考试时我直接修改了队列,导致 \(WA\) 到了 $10$ 分!改后又由于各种问题使它只 \(TL
阅读全文
摘要:留个高精度的模板 \(Code\) #include<cstdio> #include<cstring> using namespace std; int n , a[5005] , b[5005] , c[5005]; inline void Mul() { while (c[0]) c[c[0]
阅读全文
摘要:题目 求满足 \(a_i \leq a_j,b_i \leq b_j,c_i \leq c_j\) 的三元组的个数 输出个数范围为 \([0..n-1]\) 的每种个数出现的次数 解析 \(cdq\) 分治版题,三维数点 先让第一维排序,然后归并思想排序第二维 考虑分治的左区间对右区间的贡献 每次用
阅读全文
摘要:思路 注:上图只是个例子,其实建图时 $5$ 是不会连向 $6$ 的 \(Code\) #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n , m , mp[55][55] , f[55 *
阅读全文
摘要:思路 考虑一个点要不要翻,如果它左边的点为 $1$,那么它必须翻 所以我们可以从左往右一列一列地翻 先枚举第 $0$ 列的状态 然后之后的列就确定了 判断一下最后一列是不是 $0$ 就行了 状压快速翻 \(Code\) #include<cstdio> #include<cstring> using
阅读全文
摘要:状压玩疯了 \(Code\) #include<cstdio> #include<iostream> #include<cstring> using namespace std; int f[16][1 << 16] , st[1 << 16] , t[16] , d[16] , up[16]; i
阅读全文
摘要:解析 考场时想多了,其实根本不用分阶段 一维状压 \(DP\) 就行了 可我没想清楚,加了个第几次去稳固一个点的阶段 然后时间就炸了!!! \(Code\) #include<cstdio> #include<cmath> #include<algorithm> using namespace st
阅读全文
摘要:题目大意 维护一个 $01$ 序列最长的连续相邻两个数不同的子序列的长度 解析 很裸的线段树题。。。 要维护的信息很多 区间长度 区间最左端点 区间最右端点 区间最长前缀 区间最长后缀 区间最终的答案 前三个直接从左右儿子获取即可 区间最长前缀先为左儿子的区间最长前缀 如果左儿子的区间最长前缀为左区
阅读全文
摘要:【模板】普通平衡树 平衡树模板 解析 虽然是平衡树模板,然而我要写的是权值线段树... 珍贵的好看的我自己写的标... \(Code\) #include<cstdio> using namespace std; const int N = 1e5 + 5 , Len = 2e7 + 10 , V
阅读全文
摘要:题目 洛谷等许多 \(OJ\) 都有 思路 考试题,今日无意又做了一次 然后发现自己读错题了······ 其实询问时只要 \(k\) 轮排序后的逆序对个数并不需要真的对序列进行更改 很显然 \(k\) 轮操作后每一个位置产生逆序对个数比 \(k\) 小的都没了,比 \(k\) 大的都减了 \(k\)
阅读全文
摘要:题目 求满足 \(i < j < k,a_i < a_j < a_k\) 的三元组的个数 思路 考虑三元组中间的数 那么它对答案的贡献是它前面比他小的数的个数乘上它后面比他大的数的个数 树状数组维护就好了 \(Code\) #include<cstdio> #include<cstring> #in
阅读全文
摘要:题目 自己上网搜 题解 发现每个数开方次数不超过六次 所以我们对于修改可以暴力更改(因为不能打标记) 查询仍然用上某种数据结构 但修改太暴力了 每个数开方到了小于等于 $1$ 时 我们就不需要再更改它了(无意义) 为了高效地修改,我们要用某种方法快速过掉一堆不需要修改的数 没错,并查集!! 它的祖先
阅读全文
摘要:题目 自己找 思路 大致过程见 JZOJ 3232. 【佛山市选2013】排列 而本题改成种类数 那么我们不需要 \(ln\) 这个东东 直接转移 \(f\) 改成种类数 对于可能转移过来的状态,直接加上他们的 \(f\) 值就行了 \(Code\) #include<cstdio> #includ
阅读全文
摘要:题目 解析 很神奇的一道题 显然,对于一种排列,相当于给出了数字 $1..n$ 的对应关系,且不重复不遗漏,刚好把 $1$ 到 \(n\) 又包含了一遍。 对,连边! 每个数向它对应的数连边,这样我们就得到了一幅图,且这幅图很有特点——全是简单环。 因为每个数的对应有且仅有一个,且不重复不遗漏,所以
阅读全文
摘要:[FJOI2016]神秘数 题目 仍然自己上网搜~~~~~~ 思路 不得不说这题很~~~ 规律,永远是宇宙的终极杀器 我们考虑当前的集合可以表示的数的值域为 \([1..Max]\) 这段区间是连续的 为什么我们只考虑从 $1$ 开始连续的区间? 因为这样我们可以知道答案显然为 \(Max + 1\
阅读全文
摘要:最大异或和 可持久化字典树经典题 题目网上自己找 来波模板 \(Code\) #include<cstdio> #include<iostream> using namespace std; const int N = 6e5 + 5; int n , m , a[N] , size , s[N]
阅读全文
摘要:题目 网上自己搜 解析 区间异或很容易想到可持久化字典树 但本题的关键是如何高效率求出以某个数为区间最大值时这个区间的范围 依题我们知道区间最长可到比它第二大的位置(开区间) 所以我们如果能找到每个数比他大的 这个问题就迎刃而解了 我们可以排序后从小到大算答案 用双向链表记录前一个比他大的和后一个比
阅读全文
摘要:#区间第 \(k\) 小 \(Code\) #include<cstdio> #include<algorithm> using namespace std; const int N = 2e5; int n , m , rt[N + 5] , ind[N + 5] , a[N + 5] , len
阅读全文
摘要:题目 思路 不想写了,直接使用 没错,关键就在求第 \(k\) 小的路径 上述提到堆的做法,我们可以用 \(STL\) 的优先队列来实现 只不过常数有点大~~~ \(Code\) #include<cstdio> #include<queue> #include<algorithm> using n
阅读全文
摘要:$\text{HOWARLI}$ $Alpha1022's \texttt{ } Blog$(注:某名为 $lzc$ 的来自未来清华巨佬的博客) $\text{OI-Wiki}$ $leiyuanze's \text{ } Blog$ $csacademy$ $Dch's \text{ } Blog
阅读全文
摘要:题目大意 求逆序对个数小于等于 \(k\) 的排列数 解析 已经做过很多次了,经典得不能再经典的问题 注意本题很卡空间,要用滚动数组 \(Code\) #include<cstdio> using namespace std; typedef long long LL; const int N =
阅读全文
摘要:题目 思路 暴力很好打,我们显然可以先把关于 \(k\) 的式子拆开 先二项式展开,然后把外面的 \(m\) 乘进去,把 \(p\) 的分母 \(m\) 消去 \(K = (\sum_{i=1}^m (x_i - p)^2) \times m = m \times \sum_{i=1}^m x_i^
阅读全文
摘要:题目 思路 倒序 \(DP\) 设 \(f_{i,j}\) 表示 \(A\) 先手,当前 \(A\) 报出的值为 \(i\),\(B\) 报出的值为 \(j\),\(A\) 取诱惑值大于等于 \(i\) 的, \(A\) 能拿到的最大收益 \(g_{i,j}\) 表示 \(B\) 先手,当前 \(B
阅读全文
摘要:题目 思路 其实很好想 设 \(f_i\) 表示 \(i\) 与编号 \(f_i\) 到 \(i-1\) 的人已经相识 \(f_i\) 初值为 \(i\) 那么转移就是 \(f_i = min(f_i,l)\) 其中 \(l \leq i \leq r\) 然后更新后的 \(f_i\) 和以前的 \
阅读全文
摘要:题目 思路 大意是构造一个数组使它做 $01$ 背包能表示出所有给定的数 那就暴力枚举每个位置填什么 直到它能表示出所有给定的数 为了保证时间复杂度 我们考虑一个二进制数 \(s\) 表示能构造出的数 \(s\) 的第 \(i\) 位为一就表示当前枚举出的数组能表示出 \(i\) 这个数 那么假如一
阅读全文
摘要:题目 思路 先求只用王牌电缆的最小生成树 再选一条李牌电缆替换王牌电缆 使答案最小就完了 假如要替换的李牌电缆两端点是 \(u,v\) 那么生成树中 \(u \Longrightarrow lca(u,v)\) 和 \(v \Longrightarrow lca(u,v)\) 这两条链中的权值最大的
阅读全文
摘要:题意 求本质不同的子串个数(包括空串) 思路 序列自动机裸题 直接上代码 \(Code\) #include<cstdio> #include<cstring> using namespace std; typedef long long LL; const int N = 2e5 + 5; con
阅读全文
摘要:总结 又是一日爆炸 \(T1\) 不出所料报 $0$ 了?! 题目 \(T1\) JZOJ 4315. Prime 暴力就好了?! 考场根本没想暴力 赛后发现暴力跑得贼快 只需二分一下组数的上界 然后 \(dfs\) 判断能否能成功分完组 跑时顺便统计答案就行了 \(Code\) #include<
阅读全文
摘要:题目 思路 树的直径很好求,两遍 \(dfs\),记下两个端点 然后很显然所有直径经过的边必然在我们求出的这条直线上 那么我们只要判断一下一条直径上的边是不是答案 假设当前边为 \(i\) 那么把 \(i\) 割去后原树变成了两棵不联通的树 我们只要看这两棵子树分别的直径和不和原树的直径相等 如果至
阅读全文
摘要:题目 现在有一棵n个点的无向树,每个点的编号在1-n之间,求出每个点所在的最长路。 思路 换根 \(dp\),这里只是记下怎么打 \(Code\) #include<cstdio> #include<iostream> using namespace std; const int N = 1e5;
阅读全文
摘要:题目大意 给定一个数列,支持区间加一个数和区间取 \(max\),询问单点询问数值和它被更改的次数 思路 模板的吉司机线段树 维护区间最小值和严格次小值以及最小值的个数 针对询问维护区间和以及区间修改次数 那么我们可以 \(O(n\log^2 n)\) 解决问题 \(Code\) #include<
阅读全文
摘要:题目大意 给定一个数列,支持区间加法,求区间大于等于 \(c\) 的数的个数 思路 分块裸题 散的个体单独加,询问时单独判 对于一整块加则打上标记 要求块中大于等于 \(c\) 的数的个数 我们不妨将块中元素排序,二分求解即可 为了保证时间复杂度 我们在修改的时候排序 因为同时加一个数,相对大小不变
阅读全文