摘要: 题面 "题目传送门" 解法 显然答案不超过2 直接暴力枚举第一格到底是否有雷即可,后面的状态自然就可以确定了 时间复杂度:$O(n)$ 代码 cpp include define N 10010 using namespace std; template void read(node &x) { x 阅读全文
posted @ 2018-08-14 23:23 谜のNOIP 阅读(126) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 暴力显然是把每一行的情况枚举后得到的 但是对于$100×100$显然是不可取的 我们可以发现,每一行每一列最多只会有$2$个炮 那么我们可以设$f_{i,j,k}$表示第$i$行时$j$列放1个,$k$列放2个的方案数 分类讨论一下即可 我使用记忆化搜索,感觉比较直观 时 阅读全文
posted @ 2018-08-14 23:23 谜のNOIP 阅读(121) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 假设现在有一个和$S$,那么$1 S$中所有数都可以被表示 不断将$S$加上没有被加过且小于$S$的数 最坏情况为斐波那契数列的时候,但不超过$log\sum a_i$ 用主席树查询即可 时间复杂度:$O(q\ log\ n\ log\sum a_i)$ 代码 cpp i 阅读全文
posted @ 2018-08-14 23:22 谜のNOIP 阅读(126) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 ~~可以考虑一种毒瘤方法:二分答案+树剖+BIT套线段树~~ 时间复杂度:$O(q\ log^4\ n)$ 这个写起来麻烦,而且非常丑陋 发现每一次修改只会对子树中的所有点产生影响,而子树的dfs序是连续的 所以考虑单点修改,区间询问,发现可以使用BIT 询问时记录一下所 阅读全文
posted @ 2018-08-14 23:22 谜のNOIP 阅读(89) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 本题解法十分精妙 构造矩阵,保证每一行是一个公比为3的数列,每一列是一个公比为2的数列 发现这个矩阵最多不超过17行11列 那么我们可以枚举不是2和3公倍数的数放在$(1,1)$的位置,然后构造出该矩阵 设$f_{i,j}$表示第$i$行选取方案为$j$的方案数 转移一下 阅读全文
posted @ 2018-08-14 23:22 谜のNOIP 阅读(135) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 $ans$ = 所有的收益 $i$属于$S$割的(雇佣$i$的代价) 不能同时雇佣$i,j$的带价($i$属于$S$割,$j$属于T割) 不雇佣$i$所造成的带价也就是$i$所有的贡献($i$属于$T$割) 那么建图也就出来了:$S\rightarrow i$连$a_i$ 阅读全文
posted @ 2018-08-14 23:21 谜のNOIP 阅读(85) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 和bzoj 2561类似 问题转化为,每一次可以使某一条边的权值+1,问最少多少次以后这条边一定在最小生成树上 最小割即可 代码 cpp include define N 1010 using namespace std; template void read(node 阅读全文
posted @ 2018-08-14 23:20 谜のNOIP 阅读(107) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 应该是比较显然的最小割了吧 问题可以转化为,只使用边权$ define N 20010 using namespace std; template void read(node &x) { x = 0; int f = 1; char c = getchar(); whi 阅读全文
posted @ 2018-08-14 23:20 谜のNOIP 阅读(66) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 记$nxt_i$为$a_i$下一次出现的位置 把所有询问按左端点排序 处理完所有以$i$开始的询问后,我们把$nxt_i$的影响删除,把$nxt_{nxt_i}$加上 这样就能保证计算入答案的必然是这个区间里第二次出现的 树状数组维护即可 时间复杂度:$O(q\ log\ 阅读全文
posted @ 2018-08-14 23:20 谜のNOIP 阅读(119) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 并查集的方法感觉十分精妙,见 "dalao题解" 树剖+线段树也比较简单吧 维护区间的答案,合并的时候根据深度判断大小 时间复杂度:$O(q\ log^2\ n)$ 代码 cpp include define N 100010 using namespace std; t 阅读全文
posted @ 2018-08-14 23:19 谜のNOIP 阅读(181) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然,本题可以说是变形LIS 设$f_i$为以第$i$个位置结尾的最长不下降子序列长度 那么,$f_i=max(f_j+1)\ \ (a_j≤l_i,r_j≤a_i)$ 对于后面的限制条件,显然就是一个二维偏序问题,直接CDQ分治或树套树 然而不知为什么树套树RE了…… 阅读全文
posted @ 2018-08-14 23:18 谜のNOIP 阅读(114) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 考虑当所有数都没有限制的时候,答案为$\sum\prod_{i=1}^na_i$ 考虑将式子拆开并且运用乘法分配律,答案显然为$(\frac{n(n+1)}{2})^m$ 有限制类似 注意去重 代码 cpp include define Mod 1000000007 de 阅读全文
posted @ 2018-08-14 23:16 谜のNOIP 阅读(103) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 因为是$1 n$一个一个插入,所以每一次插入的时候只会对当前节点的答案产生影响,对于之前已经在序列中的不会有影响 所以只要动态维护这一个序列,并且维护子树中dp值的最大值 splay!!!! 时间复杂度:$O(n\ log\ n)$ 代码 cpp include defi 阅读全文
posted @ 2018-08-14 23:16 谜のNOIP 阅读(214) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以说是莫队裸题了吧 莫队算法的本质是,将所有询问的区间按照一定顺序排序,然后不断通过已知区间更新后面的区间 假设现在已经做到区间$[l_1,r_1]$,下一个区间是$[l_2,r_2]$ 那么就暴力将区间从$[l_1,r_1]$扩展至$[l_2,r_2]$,并在扩展的时 阅读全文
posted @ 2018-08-14 23:15 谜のNOIP 阅读(119) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 异或满足前缀相减性,记$s_i$为$a_1\ xor\ a_2…xor\ a_i$ 然后就可以直接莫队求解了 注意在移动左端点时统计答案应该为$l 1$,而不是$l$ 时间复杂度:$O(n\sqrt q)$ 代码 cpp include define int long l 阅读全文
posted @ 2018-08-14 23:14 谜のNOIP 阅读(100) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 同小Z的袜子 代码 cpp include define int long long define N 50010 using namespace std; template void read(node &x) { x = 0; int f = 1; char c = 阅读全文
posted @ 2018-08-14 23:14 谜のNOIP 阅读(79) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以直接将所有1全部放置在主对角线上,这样并不会影响答案 然后就是一个比较简单的错位排列了 需要高精度 代码 cpp include using namespace std; template void read(node &x) { x = 0; int f = 1; 阅读全文
posted @ 2018-08-14 23:13 谜のNOIP 阅读(130) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 题如其名…… 不妨将多项式的$x^i$变成$10^i$,然后就是一个比较简单的FFT了 md读进来的是一个字符串,并且要倒序 最后注意进位问题 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 1 void read(node &x 阅读全文
posted @ 2018-08-14 22:29 谜のNOIP 阅读(129) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 如果没有换根,就是树剖+线段树的板子题 如果有换根,看当前的根是否为$x$的后代,如果不是,那么$x$的子树不会受到任何影响,如果是,那么直接删除对应区间然后求最小值即可 时间复杂度:$O(q\ log^2\ n)$ 代码 cpp include define N 100 阅读全文
posted @ 2018-08-14 22:28 谜のNOIP 阅读(119) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以发现,题目可以转化成求若干个形如$\sum_{i=1}^ni^k$的东西 这个东西可以拉格朗日插值 大概讲一下拉格朗日插值是个什么东西: 显然,$\sum_{i=1}^ni^k$可以用一个$k+1$次多项式表示出来 那么,将$x_i=1,2,…k+1$代入,求得$y_ 阅读全文
posted @ 2018-08-14 22:27 谜のNOIP 阅读(113) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 设$f_{i,j}$表示序列中已经有$1 i$,逆序对总数为$j$的方案数 考虑如何转移到$f_{i,j}$ 即将$i$插入到$1$至$i 1$的序列中,产生的影响范围为$0$到$i 1$ 从而可以得到转移方程:$f_{i,j}=\sum_{k=j i+1}^if_{i 阅读全文
posted @ 2018-08-14 22:27 谜のNOIP 阅读(88) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 第一问超简单 ~~第二问看题解吧~~ "%%%%%" 如果不是随机的这可能会T 其实感觉第二问挺玄学的 代码 cpp include define int long long define N 50010 using namespace std; template voi 阅读全文
posted @ 2018-08-14 22:26 谜のNOIP 阅读(150) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 有向图Matrix Tree定理的裸题吧…… 若$(i,j)$有边,那么$a_{i,j}= 1$,$a_{i,i}=d_i$,$d_i$为点$i$的出度 因为以1为根,所以只要求出$2 n$的行列式即可 md高斯消元写错一个东西照样90……数据是真的弱 时间复杂度:$O( 阅读全文
posted @ 2018-08-14 22:26 谜のNOIP 阅读(110) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 先看一看部分分 1 6 直接用dijkstra求最短路,然后判断一下即可 时间复杂度:$O((n+m)\ log\ n)$ 期望得分:$30$ 7 11 倍增求出路径上的最小值,然后比较一下即可 时间复杂度:$O(q\ log\ n)$ 期望得分:$30+25=55$ 1 阅读全文
posted @ 2018-08-14 22:25 谜のNOIP 阅读(166) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 用可持久化线段树维护每一个点的父亲,不能路径压缩 直接暴力一步一步跳即可 注意要启发式合并 时间复杂度:$O(q\ log^2\ n)$ 代码 cpp include define PI pair define mp make_pair define N 200010 u 阅读全文
posted @ 2018-08-14 22:25 谜のNOIP 阅读(167) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 后缀数组模板题吧…… 将字符串两倍,然后求一遍sa数组即可 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 200010 using namespace std; char st[N]; int len; struct Suffi 阅读全文
posted @ 2018-08-14 22:24 谜のNOIP 阅读(79) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 建出kruskal重构树,然后变成求子树第$k$大问题 直接主席树即可 时间复杂度:$O(q\ log\ n)$ 代码 cpp include define N 200010 using namespace std; template void read(node &x) 阅读全文
posted @ 2018-08-14 22:24 谜のNOIP 阅读(91) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 枚举最后的二进制位,假设是第$k$位 问题就转化成有多少段和二进制意义下第$k$位是1 不妨转化成前缀和 变成有多少对$i,j(i j)$,使得$s_i s_j$的第$k$位是1 我们可以枚举$k$,假设$s_i$的第$k$位是1 如果$s_i s_j$的第$k$位是1, 阅读全文
posted @ 2018-08-14 22:24 谜のNOIP 阅读(125) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 比较套路的一道题吧 先求出height数组,二分答案$mid$ 将后缀分成若干组,每一组满足height≥mid 若某一组的后缀个数≥k,那么答案可行 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 1000010 using n 阅读全文
posted @ 2018-08-14 22:23 谜のNOIP 阅读(134) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 用后缀数组求出height数组,然后暴力即可 时间复杂度:$O(n^2)$ 代码 cpp include define N 3010 using namespace std; template void read(node &x) { x = 0; int f = 1; 阅读全文
posted @ 2018-08-14 22:22 谜のNOIP 阅读(111) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 每一次选的时候比较左端点为起点的后缀与右端点为起点的原串倒序的后缀哪一个字典序小,小的那个相应地移一下即可 感觉这比较绕啊,举个例子解释一下 假设当前的串为$AABCAA$,$l=1,r=6$ 那么只要比较$AABCAA$和$AACBAA$哪一个字典序小,发现是$AABC 阅读全文
posted @ 2018-08-14 22:22 谜のNOIP 阅读(122) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 不妨把每一个国家看成一组询问 那么,对于每一组询问显然满足单调性,可以二分答案 但是如果一个一个二分就比较慢,所以需要引入整体二分这个东西 整体二分就是二分当前答案,将可行的放在左边,不可行的放在右边,然后分别递归处理 本题用树状数组处理区间加减即可 时间复杂度:$O(q 阅读全文
posted @ 2018-08-14 22:21 谜のNOIP 阅读(102) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然,我们只要求出两两后缀的lcp的和即可 两个后缀的lcp长度为这两个后缀的rnk区间height的最小值 那么可以发现,对于$height_i$,我们可以求出以它为最小值的区间个数,然后乘起来即可 求区间可以使用单调栈解决 时间复杂度:$O(n\ log\ n)$ 代 阅读全文
posted @ 2018-08-14 22:21 谜のNOIP 阅读(169) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 比较裸的矩阵乘法 对于爆炸,我们可以将所有点全部连向0,但是0没有出边 对于在某一个城市停留,直接连一个自环即可 时间复杂度:$O(n^3)$ 代码 cpp include define Mod 2017 using namespace std; template voi 阅读全文
posted @ 2018-08-14 22:20 谜のNOIP 阅读(198) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 发现可持久化数据结构并不能维护这个东西 所以考虑整体二分 在求的时候把$[1,mid]$的所有数的位置+1,然后比较整个矩阵内比$mid$大的数是否比$k$大 时间复杂度:$O((n^2+q)\ log^2\ n)$ 代码 cpp include define M 600 阅读全文
posted @ 2018-08-14 22:20 谜のNOIP 阅读(107) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 题目就是一个二维偏序问题 将某一个询问转化成二维前缀和的形式即可 还是用常数比较小的cdq分治吧,空间小,比较容易实现 坐标需要离散化 时间复杂度:$O(n+m)\ log^2\ n$ 代码 cpp include define N 2500010 using names 阅读全文
posted @ 2018-08-14 22:19 谜のNOIP 阅读(284) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 每一次询问有已知点中与询问点曼哈顿距离最小是多少 把绝对值拆开来分别维护一下 ~~我写的比较丑,写了4个cdq,然后光荣T飞……~~ 好像这道题k dtree比cdq要优一点吧 cdq复杂度:$O((n+m)\ log^2 n)$ 代码 cpp include defin 阅读全文
posted @ 2018-08-14 22:18 谜のNOIP 阅读(142) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 同 "bzoj2716" ~~自己cdq写的还是丑啊,别人A掉了我T飞了~~ 代码 cpp include define inf 1 void chkmax(node &x, node y) {x = max(x, y);} template void chkmin(no 阅读全文
posted @ 2018-08-14 22:17 谜のNOIP 阅读(236) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以离线,那么就是非常简单的cdq分治了 只要把询问拆成4个,然后就变成了一个三维偏序问题 时间复杂度:$O(q\ log^2\ n)$ 代码 cpp include define int long long define N 1000010 using namespac 阅读全文
posted @ 2018-08-14 22:16 谜のNOIP 阅读(115) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 动态点分治模板题 什么是动态点分治呢??? 静态的点分治就是不断地找到当前树的重心,然后分成若干个子树继续递归下去 但是如果有修改似乎静态的就不好处理了 我们现在引入一个叫点分树的东西 说白了,就是每一次静态点分治的时候这一次的重心和上一次的连边,这样形成了一棵树 再说清 阅读全文
posted @ 2018-08-14 22:15 谜のNOIP 阅读(228) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 正解是LCT,当然分块也可以做 先简单讲一下分块的做法吧: 分成$\sqrt n$个块,每一个元素维护最近的到达不是自己这一块的位置和步数 预处理直接倒着做即可 时间复杂度:$O(m\sqrt n)$ 当然,LCT的解法比较优,但是代码较长 显然,每一次跳相当于一条边 可 阅读全文
posted @ 2018-08-14 22:14 谜のNOIP 阅读(112) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 LCT模板题 有些博客讲得挺好的,转一下 "博客" 这个挺详细的 时间复杂度:$O(m\ log\ n)$,~~尽管常数巨大~~ 代码 cpp include define N 20010 using namespace std; template void chkmax 阅读全文
posted @ 2018-08-14 22:14 谜のNOIP 阅读(114) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 挺妙的一道题 显然不能每一次都多重背包,效率太低 发现物品种类只有4种,可以干点什么 设$f_i$表示所有物品都无限取的时候的方案数 这个可以通过无限背包处理出来 对于每一次询问,答案即为得到面值S的超过限制的方案数 – 第1种硬币超过限制的方案数 – 第2种硬币超过限制 阅读全文
posted @ 2018-08-14 22:13 谜のNOIP 阅读(109) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 维护双关键字好像不太可做吧 所以我们先按照$a$从小到大排序,然后逐一检查$b$ 如果构成环,那么把环上最大的$b$删掉 只要出现1和$n$连通的时候就更新答案 时间复杂度:$O((n+m)\ log\ n)$ 代码 cpp include define N 150010 阅读全文
posted @ 2018-08-14 22:13 谜のNOIP 阅读(146) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 离线询问,然后莫队 建2棵权值树状数组,一棵为区间有多少个数,另一棵为区间有多少个不同的数 在扩展区间的时候用树状数组修改即可 代码 cpp include define N 3000010 using namespace std; template void chkma 阅读全文
posted @ 2018-08-14 22:12 谜のNOIP 阅读(137) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 树套树比较苟,考虑整体二分 因为要求第K大,那么我们在二分的时候把$v$大于$mid$的放在右边并修改 修改直接用线段树区间加区间求和即可 时间复杂度:$O(m\ log^2\ n)$ 代码 cpp include define int long long define 阅读全文
posted @ 2018-08-14 22:11 谜のNOIP 阅读(127) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 决策单调性比较经典的题吧 题目就是要对于每一个$i$求$f_i=max(a_j a_i+\sqrt{|i j|}))$ 可以发现,$\sqrt n$的增长速度比较慢,所以满足决策单调性 决策单调性是指,如果决策$j$对于$i$已经不是最优的了,那么在后面也一定不是最优的 阅读全文
posted @ 2018-08-14 22:10 谜のNOIP 阅读(118) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 LCT模板题 代码 cpp include define N 300010 using namespace std; template void chkmax(node &x, node y) {x = max(x, y);} template void chkmin(n 阅读全文
posted @ 2018-08-14 22:10 谜のNOIP 阅读(77) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 树形dp表示感觉太烦,不太会写 考虑贪心 显然每一次应该选深度最大且没有被覆盖的点,然后找到它的爷爷,然后暴力更新 当然,距离大一点贪心也是正确的 时间复杂度:$O(n)$ 代码 cpp include define N 100010 using namespace st 阅读全文
posted @ 2018-08-14 22:10 谜のNOIP 阅读(110) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以得到一个显然的dp方程 $$f_i=min(f_j+(s_i s_j+i j 1 L)^p)$ 不妨把后面的东西看成$w(j,i)$ 所以就变成$f_i=min(f_j+w(j,i))$ 可以发现,这个式子满足四边形不等式 1D1D的四边形不等式可以直接通过决策单调性 阅读全文
posted @ 2018-08-14 22:09 谜のNOIP 阅读(118) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 感觉解法还是挺妙的 将每一个工人都拆成$n$个点,总共$n×m$个点 然后第$i$个工人的第$j$个点表示某辆车是在倒数第$j$个开始修的 然后就转化成修车的时间对总时间的贡献 连接$s$和$n$辆车,容量为1,费用为0, 连接$t$和最后的$n×m$个点,容量为1,费用 阅读全文
posted @ 2018-08-14 22:08 谜のNOIP 阅读(130) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 将最大流转化成最小割,然后跑最短路即可 具体如何见图可以参考下图 尽量用dijkstra 代码 cpp include define PI pair define mp make_pair define N 1010 using namespace std; templa 阅读全文
posted @ 2018-08-14 22:07 谜のNOIP 阅读(155) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然的二分图最大匹配 但是,如果连接$nm$条边的话肯定会出事 考虑如何减少边的数量 将每一个数分解质因数,将所有出现过的质因数放在中间一排 对于每一个$a_i$和$b_i$,和中间一排能整除自己的质因数连边 这样就可以把边数降低到$O(n)$级别 然后dinic即可 代 阅读全文
posted @ 2018-08-14 22:06 谜のNOIP 阅读(146) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 环形均分纸牌 和 "这道题" 是一模一样的 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define int long long define N 1000010 using namespace std; template void chkma 阅读全文
posted @ 2018-08-14 22:06 谜のNOIP 阅读(102) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 记$mn_i$表示路径长度为$i$最少经过多少条边 然后进行点分治 假设当前的根为$x$,那么先把$x$的子树一个一个访问,访问完一棵子树后更新答案 递归到下面的子树时把影响撤销 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define inf 阅读全文
posted @ 2018-08-14 22:05 谜のNOIP 阅读(107) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 这道题建图还是挺妙妙的 显然答案满足单调性,直接二分答案,假设当前答案为$mid$ 考虑将每一个人拆成2个点,一个表示喜欢,另一个表示不喜欢 将$s$连向男生喜欢,容量为$mid$,男生喜欢连向男生不喜欢,容量为$k$ 女生类似 然后对于男生$i$和女生$j$,如果不互相 阅读全文
posted @ 2018-08-14 22:04 谜のNOIP 阅读(124) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 感觉这道题解法妙妙的 考虑这样一个贪心,记一个三元组$(x,l,r)$表示当前和弦的左端点为$x$,右端点在区间$[l,r]$ 那么这个三元组对应的和弦最大值为$max(s_l,…s_r) s_{x 1}$,其中,$s_i$表示前缀和 考虑将这些三元组扔进一个大根堆里,按 阅读全文
posted @ 2018-08-14 21:15 谜のNOIP 阅读(104) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 给个链接,贪心和树形dp讲得挺到位的 "题解" 反正我觉得贪心比较好写,也挺好理解的 时间复杂度:$O(Tn)$ 代码 cpp include define N 10010 using namespace std; template void chkmax(node &x 阅读全文
posted @ 2018-08-14 19:42 谜のNOIP 阅读(218) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然,这个游戏可以拆成多个游戏的和 那么,我们就可以使用SG定理 定义$SG(x,y)$表示同一组石子中分别有$x$个石子和$y$个石子的$SG$值 发现$x,y≤10^9$,然后打表找规律 可以发现,若$x,y$都为奇数,那么$SG(x,y)=0$ 否则,$SG(x,y 阅读全文
posted @ 2018-08-14 19:04 谜のNOIP 阅读(159) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 直接求三角形个数似乎并不好求 那么我们不妨考虑补集转化,即$ans={nm\choose3}$ 三点共线的个数 三点共线分别为在行上,在列上,以及斜着的 斜着的只要枚举斜率是什么,然后就很好求了 代码 cpp include define int long long us 阅读全文
posted @ 2018-08-14 19:03 谜のNOIP 阅读(172) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 把$S$集看作和羊连接,$T$看作和狼连接 然后就转化成了基本的最小割模型了 对于0的处理,可以把它放在羊和狼两排点的中间,由$S\rightarrow$羊$\rightarrow0\rightarrow$狼$\rightarrow T$ 然后跑dinic即可 代码 cp 阅读全文
posted @ 2018-08-14 19:03 谜のNOIP 阅读(120) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 ~~MLE了23333~~ ~~为什么空间不给256MB,这样我就能开几个5000 5000的数组了~~ 考虑一种树形dp的方法吧 $f_{i,j}$表示从点$i$向下走$j$步并选出两个不在$i$同一个子树的方案数,$g_{i,j}$表示从$i$出发在$i$子树外走$j 阅读全文
posted @ 2018-08-14 19:02 谜のNOIP 阅读(115) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 挺恶心的题 考虑动态点分治,先建出点分树 然后每一个点开两个堆,分别为$a,b$ $a_i$表示点分树上$i$子树中所有节点在原树上和点分树中$i$父亲的距离,$b_i$表示点分树中$i$所有儿子的堆顶 再开一个堆$ans$,存每一个$b_i$最大和次大值的和 在修改的时 阅读全文
posted @ 2018-08-14 19:02 谜のNOIP 阅读(119) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 考虑容斥原理 显然,我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有$x$个物品,$n$个人,可以有人没有被分到,那么分给这$n$个人的方案数为$n+x 1\choose n 1$ 然后就是分别计算一下就可以了 时间复杂度:$O(nm)$ 代码 cp 阅读全文
posted @ 2018-08-14 19:00 谜のNOIP 阅读(103) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然可以二分答案 计算的时候用容斥原理即可 用莫比乌斯函数实现这个过程即可 代码 cpp include define LL long long define N 1000010 using namespace std; int f[N], p[N], mu[N]; vo 阅读全文
posted @ 2018-08-14 19:00 谜のNOIP 阅读(111) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然可以构建一个二分图模型 但是要求出字典序最小的解,那么网络流就无能为力了 考虑用匈牙利算法来跑 匈牙利算法就是用大的来代替小的,那我们把连接的点从小到大排序,然后从左边大的开始跑就可以了 代码 cpp include define N 10010 using name 阅读全文
posted @ 2018-08-14 18:59 谜のNOIP 阅读(111) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然这是一个二分图 若二分图求完最大匹配之后不存在非匹配点,那么一定不存在必胜策略 因为我们求完最大匹配之后,一定不存在增广路,只存在交错路,对方从匹配点出发,最后一定可以找到一条匹配边作为结束,所以先手必胜 那么,从一个非匹配点出发,一定是一个后手必胜的策略,但是非匹配 阅读全文
posted @ 2018-08-14 18:58 谜のNOIP 阅读(120) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 不妨把问题转化成空格的移动,将一开始空格的位置变成黑色 那么,真实颜色和后来染的颜色不同的就一定不会经过 然后就变成了一个二分图博弈问题了 考虑一下什么时候先手必胜: 就是起点一定在二分图的最大匹配上的时候 否则后手必胜 先手走错的情况满足在他走之前先手必胜,走之后先手还 阅读全文
posted @ 2018-08-14 18:58 谜のNOIP 阅读(127) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然,我们可以列出答案的式子: $$\sum_{i=1}^n(a_i+c b_i)^2$$ 然后将式子拆开,可得 $$=\sum_{i=1}^n(a_i^2+b_i^2)+nc^2+2c\sum_{i=1}^n(a_i b_i) 2\sum_{i=1}^na_ib_i$$ 阅读全文
posted @ 2018-08-14 18:57 谜のNOIP 阅读(69) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 挺妙的一道题,思路比较精妙 带通配符之后好像字符串算法就不太好匹配了啊 设通配符的值为0,那么这两个字符相同当且仅当有一个是通配符或者就是相同的 设$dis(A,B)=\sum_{i=0}^{n 1}(A_i B_i)^2A_iB_i$ 其中,若$A_i=?$,那么$A_ 阅读全文
posted @ 2018-08-14 18:56 谜のNOIP 阅读(108) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 $$f_x=\sum \frac{f_y+w(x,y)}{out_x}$ 因为是一个DAG,直接记忆化即可 时间复杂度:$O(n+m)$ 代码 cpp include define N 100010 using namespace std; template void c 阅读全文
posted @ 2018-08-14 18:55 谜のNOIP 阅读(81) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 学习了怎么用高斯消元解一个异或方程组 其实和普通的高斯消元是一样的 在多少个方程后就确定答案可以直接边做边取max即可 用bitset优化异或 时间复杂度:$O(\frac{nm^2}{w})$ 代码 cpp include using namespace std; te 阅读全文
posted @ 2018-08-14 18:54 谜のNOIP 阅读(113) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 题解里都是高斯消元然后dfs,蒟蒻表示不会 直接分两半dfs即可 时间复杂度:$O(2^{\frac{n}{2}})$ 代码 cpp include define LL long long define N 110 using namespace std; templat 阅读全文
posted @ 2018-08-14 18:54 谜のNOIP 阅读(160) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 矩阵乘法sb题 注意整数乘法要使用龟速乘,否则会爆long long 代码 cpp include define int long long using namespace std; struct Matrix { int a[4][4]; void Clear() {m 阅读全文
posted @ 2018-08-14 18:53 谜のNOIP 阅读(139) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然可以一位一位确定答案 假设在第$i$时已经比原数小了,那么答案就可以加上$\frac{(n i)!}{s_0!s_1!…s_9!}$ 但是因为$n≤50$,所以可能会爆long long,需要高精度 然而我就十分sb地写了高精度…… 其实并不需要用高精度啊 可以先确定 阅读全文
posted @ 2018-08-14 18:52 谜のNOIP 阅读(121) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 直接区间dp即可 时间复杂度:$O(16n^3)$ 代码 cpp include define N 210 using namespace std; struct Node { int x, y; } a[5][N]; int s[5], p[5][5][5]; bool 阅读全文
posted @ 2018-08-14 18:52 谜のNOIP 阅读(152) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以发现,每一次只要考虑后缀的一部分即可 设$f_{i,j,x,y}$表示前$i$个人中$j$个是男生,后缀中男生数 女生数最大为$x$,女生 男生最大为$y$的方案数 建议从前推后 时间复杂度:$O(nmk^2)$ 代码 cpp include define Mod 1 阅读全文
posted @ 2018-08-14 18:52 谜のNOIP 阅读(92) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 既然有异或,那么我们把每一位单独考虑一下 先枚举是二进制的第几位,然后设$f_i$表示点$i$这一位为1的概率是多少 显然,可以列出一个方程 注意,自环的出度不能被计算2遍 高斯消元解这个方程即可 最后答案为$\sum2^i×f_{1,i}$ 时间复杂度:$O(30n^3 阅读全文
posted @ 2018-08-14 18:51 谜のNOIP 阅读(142) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 先把边转化成区间 其实我们只要计算$\sum_{i=l}^{r 1}\sum_{j=i+1}^{r}sum(i,j)$ 把式子拆开,可以得到$(l+r)\sum w_i i (l+1)(r 1)\sum w_i \sum w_i i^2$ 用线段树分别维护这三个值即可 时 阅读全文
posted @ 2018-08-14 18:50 谜のNOIP 阅读(169) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 设$f_i$表示经过点$i$的期望次数 然后就可以通过边的关系搞出一个方程组,高斯消元一下 对于求一条边$(x,y)$的概率,即为$\frac{f_x}{out_x}+\frac{f_y}{out_y}$ 然后按照概率大小排序,小的用尽量大的编号 时间复杂度:$O(n^3 阅读全文
posted @ 2018-08-14 18:49 谜のNOIP 阅读(110) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 第一问就是线性基的裸题 第二问也很类似,从低位向高位枚举,如果线性基上这一位有数,那么直接异或后返回 时间复杂度:$O(n\ log\ a_i)$ 代码 cpp include define int long long using namespace std; templ 阅读全文
posted @ 2018-08-14 18:49 谜のNOIP 阅读(145) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 设$(x,y)$表示第一个人在$x$房间,第二个人在$y$房间,然后列一个方程组即可 直接用高斯消元解一下就行了 时间复杂度:$O(n^6)$ 代码 cpp include define double long double define eps 1e 9 define 阅读全文
posted @ 2018-08-14 18:48 谜のNOIP 阅读(125) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 设$f_{i,j}$表示总共$i$个人,第$j$个人最终获胜的概率 枚举当前选择的是哪一张卡,那么就知道下一轮被淘汰的是谁了,假设是$x$ 显然,下一轮的庄家就是$x$的下一个人 如果$x=j$,那么可以不用管这种情况 如果$x j$,那么$j$在下一轮的编号为$i x+ 阅读全文
posted @ 2018-08-14 18:48 谜のNOIP 阅读(119) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 求无向图生成树个数,可以直接通过Matrix Tree定理求 但是$n≤100$,精度肯定爆了 所以先打个表找个规律: $1,5,16,45,121,320,841…$ 可以发现,奇数项感觉都是完全平方数,偶数项和完全平方数似乎也有点关系 ~~仔细研究表,~~发现$F_i 阅读全文
posted @ 2018-08-14 18:47 谜のNOIP 阅读(191) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 如果没有不能经过上一次经过的边这个限制,显然就是矩阵乘法的裸题 那么我们考虑转化一下,把边当成点 将一条无向边拆成2条有向边,然后连边,设邻接矩阵为$A$ 将$A$变成$A^{T 1}$,然后枚举起点的出边,终点的入边即可 时间复杂度:$O(m^3\ log\ T)$ 代 阅读全文
posted @ 2018-08-14 18:46 谜のNOIP 阅读(101) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 考虑补集转化,我们只要求正确的最大个数即可 显然,一些明显就是错误的东西可以直接排除 对于$(x,y)$相同的位置一定相等 那么我们就可以把$(x,y)$相等的并在一类 然后考虑一下$(x,y)$怎么转化,显然就是那一个数在整个数列中排名对应的区间,为$[x+1,n y] 阅读全文
posted @ 2018-08-14 18:46 谜のNOIP 阅读(116) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 可以发现,最后每一个位置的值就是经过多次操作后的最大值 那么我们不妨把每一次操作看成两个事件,一个是在$l$位置加入一个数,一个是在$r$这个位置删除一个数 将这些事件按照时间排序,然后扫一遍即可 只要处理和上一次中间间隔的最大值,用堆来实现 时间复杂度:$O(n\ lo 阅读全文
posted @ 2018-08-14 18:45 谜のNOIP 阅读(186) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 第一问直接二分答案,第二问简单dp 注意空间问题,要用滚动数组 时间复杂度:$O(nm)$ 代码 cpp include define Mod 10007 define N 100010 using namespace std; template void chkmax( 阅读全文
posted @ 2018-08-14 18:28 谜のNOIP 阅读(151) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 直接做似乎不太好做 考虑倒着做,将边反向,然后求出字典序最大的拓扑序,最后将这个拓扑序翻转即为答案 为什么这个是正确的?? ~~感觉理性分析一下就可以了吧~~ 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 100010 usin 阅读全文
posted @ 2018-08-14 18:27 谜のNOIP 阅读(101) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然可以用meet in the middle解决 时间复杂度:$O(3^\frac{m}{2}×n)$(map自带巨大常数) ~~bzoj上竟然9916ms苟过去了~~ 当然还有更好的算法,剪枝力度也比较强,这里就不再赘述了 代码 cpp include define 阅读全文
posted @ 2018-08-14 18:26 谜のNOIP 阅读(143) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然可以二分答案 问题就转化为如何检查答案的合法性 考虑这样一个贪心 显然,可以用一个矩形将剩下所有点覆盖,考虑将前两个正方形放在这个矩形的哪四个角,枚举一下 最后看剩下的点能否用一个正方形覆盖就可以了 贪心的复杂度是$O(n)$的,因为每一个点最多只会被覆盖一次 时间复 阅读全文
posted @ 2018-08-14 18:26 谜のNOIP 阅读(102) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 ~~和今天训练的T3简直一样~~ 建出$0$到$a_1 1$这$a_1$个点,$dis_i$表示$a_1x_1+…a_nx_n$在$x_i$均为非负数的情况下对$a_1$取模为$i$的数最小是多少 那么,对于每一个$a_i$,我们可以连接$j\rightarrow (j+ 阅读全文
posted @ 2018-08-14 18:25 谜のNOIP 阅读(122) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 先不妨枚举最后在第$x$天成绩全部出来 那么,可以计算出有至少需要$s_1$次减少老师,$s_2$次增加老师 如果$A B$,那么显然每一次都做$B$这个操作,否则先尽量用$A$,然后如果还有剩余那么用$B$ 把每一个$x$对应出来计算的值定义为$f(x)$ 可以发现,$ 阅读全文
posted @ 2018-08-14 18:25 谜のNOIP 阅读(154) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 假设选择的两个点为$x,y$ 那么,一定存在一条边,使得这条边将这棵树分成离$x$最近的和离$y$最近的 那么我们枚举这条边,然后在分成的两棵树中找带权重心 假设当前某一棵树的最优解为$x'$,考虑它的儿子$y'$ 如果$y'$的权值小于$x'$的权值,那么挑最小的一个儿 阅读全文
posted @ 2018-08-14 18:24 谜のNOIP 阅读(237) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 不妨将环变成链 那么就变成选出若干段区间,使得它们中间没有空隙且长度≥len 将所有区间按照右端点排序 那么,对于每一个区间,我们都可以找到右端点最大的且能和该区间连接的区间 然后发现这些关系形成了一棵树 那么,现在我们枚举最左边的区间,倍增找到最近的且能完全覆盖这个环的 阅读全文
posted @ 2018-08-14 18:24 谜のNOIP 阅读(236) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 将$x$与它所有能到达的点$y$连边,然后这依然是一个DAG 然后就变成一条边不能选取两端的问题了 直接用n 二分图最大匹配即可 代码 cpp include define N 110 using namespace std; template void chkmax(n 阅读全文
posted @ 2018-08-14 18:23 谜のNOIP 阅读(127) 评论(0) 推荐(0)
摘要: 题面 "题目传送门" 解法 显然,可以回到初始状态就意味着一定由若干个环组成 假设环的长度为$l_i$ 那么,我们可以得到$\sum l_i=n$ 不考虑自环的情况,那么$\sum l_i≤n$ 将$n$以内的质因数全部筛出,强制每一次只取某一个质数的次幂,那么就可以解决重复计数的问题 时间复杂度: 阅读全文
posted @ 2018-08-14 08:13 谜のNOIP 阅读(82) 评论(0) 推荐(0)