NOIP 模拟 $19\; \rm w$】的更多相关文章

题解 \(by\;zj\varphi\) 树形 \(dp\) 题目 有一个结论:对于一个图,有多少奇度数的点,处以二就是答案,奇度数指的是和它相连的边中被反转的是奇数 证明很好证 那么设 \(dp_{i,0}\) 表示当没翻转 \(i->fa_i\) 的边时在 \(i\) 的子树中有多少奇度数点, \(dp_{i,1}\) 表示翻转了 那么分情况转移,设 \(w1\) 表示和 \(i\) 相连的且在它子树中的边被翻转奇数条时子树中除去 \(i\) 的答案,此时,若不算和父亲相连的边,这个点就是一…
题解 一道概率与期望的状压题目 这种最优性的题目,我们一般都是倒着转移,因为它的选择是随机的所以我们无法判断从左还是从右更有,所以我们都搜一遍 时间一定会爆,采用记忆化搜索,一种状态的答案一定是固定的,所以可以记忆化 但是空间也会爆,当状态大于 \(2^{25}\) 次方时,我们选择使用一个 \(map\) ,小于时就用一个数组 对于数组,我们先打上标记,然后直接记忆化 注意,总的状态一定要在最高位再高一位设成 \(1\),因为 \(00000\) 和 \(000\) 不是一种状态,但是若不加,…
题解 \(by\;zj\varphi\) 二维差分的题目 维护两个标记,一个向下传,一个向右下传: 对于每次更新,我们可以直接更新 \((r,c)+s,(r+l,c)-s\) ; \((r,c+1)-s,(r+l,c+l+1)+s\),每组的后一个都是为了消除影响 Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i using namespace std; namespace IO{ char buf…
这次考试又一次让mikufun认识到了常数的重要性 T1.那一天我们许下约定 这题一看到D<=1e12,想都没想,矩阵快速幂!然后飞快的码了一个,复杂度n^3logD,让后我观察了一下这个转移矩阵,发现它有一个神奇的性质: 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 这...(显然不是)循环矩阵?于是我就把单次乘法优化成了n^2,复杂度变成了n^2logD,然后测了一下极限数据,单个跑了1.85s…
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   Censoring 记忆的轮廓 雨天的尾巴 总分 1 板B 87 03:20:06 0 03:23:09 100 03:20:42 187 03:23:09 2   100 03:20:20 0 03:20:49 50 03:26:26 150 03:26:26 2   100 03:19:16…
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照下来.他想让这一段中每个人的身高成等比数列,展示出最萌身高差,但他发现这个太难办到了,于是他决定放低要求,让等比数列的每两项之间可以是不连续的(例如 2,4,16--).可他依然找不到满意的,便再次妥协,使这个等比数列可以是乱序的. 现在请在其中你找出最长的符合要求的一段,使得将这一段排序后为某个公…
题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相同的值构成一段连续的区间. 那么就可以在最远的,符合答案的第一个区间二分答案. 具体实现可以用一个链表,每次扫一遍合并,并倒着查合法区间,这样就能做到 \(\rm nlogn\). Code #include<bits/stdc++.h> #define ri register signed #d…
题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久化线段树就行 在这里,只需要儿子继承父亲即可,因为要求一条链. 在搜前趋时,右儿子有就搜右儿子,搜出一个答案后就停止,这样可以做到每次最多搜 \(log\) 个区间,只有一个区间会继续向下搜,所以总的也是 \(log\) 总复杂度 \(\mathcal O\rm (klogn)\) Code #in…
题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) 这个式子可以维护一个下凸包 但是递归弹栈的话会被卡成 \(n^2\),所以我们可以写一个可持久化栈,或者是倍增跳栈 对于一个新加入的节点,我们对比它和不同祖先的斜率,如果有一个祖先 \(fa\),\(\rm slope(x,fa)\le slope(x,fa[fa])\),那么就说明,我们要把 \…
1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选1,n的方案数 观察性质,模拟+元素的过程推知集合中元素是等差数列,且公差=1(mod 2) 故g[n] = n-1的奇约数 f长这样: 1 : 22 : 43 : 74 : 125 : 186 : 267 : 368 : 489 : 6110 : 7711 : 9512 : 11513 : 137…
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 既眼瘸又脑残,NOIP这样后悔去吧! T1 n*m网格,有S种颜色. 按从上到下,从左到右的顺序涂色. 相邻的相同色块可得一份,问最大得分 n,S<=100000,m<=4 只有最多4列 1列:顺着涂 2列:先涂可以涂偶数个 3列:先涂%3=0的,然后一个%3=1和一个%3=2的组合,剩余的顺着涂…
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1,不解释. 对于最大的数据,我们可以用exgcd求出一组特解,之后的通解为x+(b/gcd)*k, y+(a/gcd)*k. 求出正整数解的个数即可. 注意有很多特判,慢慢调试就好(改这题的时间比我改T3的时间都长) #include<bits/stdc++.h> #define m 65535…
今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了,回来接着肝T1,然后就想起之前的一道AC自动机的考试题,正解虽然是AC自动机但是却有人打hash,然后就有人AC了,所以这道题我也鼓起勇气打起来hash,然后,我就开始对拍.重点是我的对拍的暴力程序是从1枚举到n,也是hash,所以高高兴兴的开始对拍,按说这道题我的暴力程序就可以AC(事后证明确实…
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口连一条权为排队时间的边. ××我又审错题了,就只能进出一次=.= 最短路?? 建反图, 然后从终点跑一个 dij 由于点数少,我觉得$N^2$仿佛都能过=.= 起点直接搜,类似$A^*$? 去搜时间允许下的点的$maxsize$ 可以搞个搜索树,这样就可以严格限制为$\Theta(N)$ 于是时间还…
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[尴尬\(.jpg\)] \(T1\)P3322 [SDOI2015]排序 背景 说实话,看见这题正解是dfs的那一刻,我人都傻了[流泪.jpg] 在讲这题的时候赵队@yspm 类比了线段树的思想%%%%%,在食用本篇题解时可以想一下 解题思路 最基本的一个思想:结果与操作的顺序无关,因为在更换的时候…
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Prime() { for(int i=2;i<=M;i++) { if(!b[i]) pri[++tot]=i; for(int j=1;j<=tot&&i*pri[j]<=M;j++) { b[i*pri[j]]=true; if(!(i%pri[j])) break; }…
题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过重心的询问,其他询问不管,具体实现就是点分治的套路,每次搜一棵子树,更新标记. 动归有些小细节,尽量边权化点权,不容易出错,式子直接看官方题解. 复杂度 \(\mathcal O\rm(3^3nlogn+3^4q)\) Code #include<bits/stdc++.h> #define Re…
题解 \(by\;zj\varphi\) 引理 对于一个和为 \(n\) 的数列,不同的数的个数最多为 \(\sqrt n\) 证明: 一个有 \(n\) 个不同的数的数列,和最小就是 \(n\) 的排列时 \(\frac{n(n+1)}{2}\),是 \(\sqrt n\) 级别的. 那么,直接用 \(set\) 维护一下有多少不同的堆数,再记一个桶维护每种数的堆有多少个,询问时直接二分查找即可. 复杂度 \(\mathcal O\rm(q\sqrt nlogn)\) Code #includ…
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x_v=s\). 如果 \(x\) 项系数为 \(0\),那么就只需判断 \(\rm x_u+x_v=s\) 有无解. 若不为 \(0\),那么直接解出 \(x_1\) 并判断是否是小数即可. 修改操作就是对一段区间的值加或减,直接树状数组,复杂度 \(\mathcal O\rm((n+q)logn)…
题解 状压 \(\rm DP\). 从 \(1\) 到 \(n\) 一共只要一条路径,那么就是一条链,只要维护一个点集和当前链的末尾就行. 设 \(\rm dp_{i,j}\) 为 \(i\) 的点集末尾为 \(j\) 的最大权. 转移有两种: 在链的末尾加上一个点. 在链的末尾加上一个点集,这个点集就代表无关的联通块只能和答案链最多连接一个点. Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i n…
题解 \(by\;zj\varphi\) 题意就是维护 \(\rm max\{01mx,01l+01r\}\) 就是最长连续的一段 \(0\),左右 \(0\) 区间的加和. 可以启发式合并,也可以直接线段树合并,复杂度 \(\mathcal O\rm(nlogn)\) Code: #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1…
题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\le 500\) 时,可以选取两组进行高斯消元,解出答案后回带. 但当 \(n\) 极大时,采用随机化的做法,每次随机选取两个,这样每次选取不正确的概率为 \(\frac{3}{4}\),选取 50 次后基本就会出答案了. 记得判断 \(\rm sin\) 的正负 Code #include<bit…
题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但没必要. 将选出的答案只向编号比它大的队列加,因为再小的数在它自己那也能更新,这样即可去重. 别忘了 \(1\) 也算. Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ c…
题解 \(by\;zj\varphi\) 因为对于所有区间,都只有包含和被包含关系,这就是一个树形结构. 设 \(\rm f_{i,j}\) 表示在第 \(\rm i\) 个节点,最多被覆盖 \(\rm j\) 次的答案,方程显然. \[\rm f_{i,j}=\max\{f_{son_i,j-1+a_i}\} \] 可以发现,对于一个 \(f_i\) 它的差分数组是单调不增的. 证明: 对于一个 \(f_i\) 如果 \(f_{i,j}-f_{i,j-1}<f_{i,j+1}-f_{i,j}\…
题解 \(by\;zj\varphi\) 考虑如何才能最优. 每次一定把当前最小值移动到边界上,那么看它向左还是向右移更优. 用树状数组维护一下即可,复杂度 \(\mathcal O\rm (nlogn)\) Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1=buf,*p2=buf; #define gc() p1==p…
题解 很容易求出在没有字典序最大的限制条件下的最多胜利场数. 这样就可以对于每一位放最优的解,怎么做,二分答案. 分两种情况,一种是当前一位是输的,一种是赢的,复杂度 \(\mathcal O(\rm nlog^2n)\) 卡卡常即可. Code #include<bits/stdc++.h> #define ri register signed #define p(i) ++i namespace IO{ char buf[1<<21],*p1=buf,*p2=buf; #def…
题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名为 \(j\)的方案数 方程: \[f_{i,j}=\begin{cases} \sum\limits_{k=j}^{i-1} f_{i-1,k},(p_{i-1}<p_i)\\ \sum\limits_{k=1}^{j-1} f_{i-1,k},(p_{i-1}>p_i)\\ \end{case…
题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \(\rm\;meet\;in\;the\;middle\) 优化,将序列分成两段,枚举第一段的每个数加到哪个集合,用 \(\rm hash\) 表存一下. 在后半部分扫完后,再扫前面的每个集合,得到答案. 复杂度 \(\mathcal O\rm (3^\frac{n}{2}+6^\frac{n}{2…
题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 \(w_fa\) 的贡献. 那么思路很显然,直接暴力向上更新,若更新到一个祖先,它已经被更新过了,那么更新完它之后直接退出就行,因为再向上,一定已经被更新过了. 实现的过程用在 \(\rm dfs\) 序上建线段树即可. 这样,每个点最多被更新一次,在询问时,最多重复更新一个点,所以总复杂度为 \…
题解 \(by\;zj\varphi\) 一道 \(\rm dp\) 题. 现将所有种类从小到大排序,然后判断,若最小的已经大于了 \(\rm l\),那么直接就是一个裸的完全背包,因为选的总数量有限制. 设 \(\rm f_{i,j,k}\) 为选了前 \(\rm i\) 种物品,总数为 \(\rm j\),容量为 \(\rm k\),是否可行,转移很简单. 对于另一种情况,能构造出的最小差距就是 \(v_1\),那么只要记录一下模 \(\rm v_1\) 的值即可. 设 \(\rm f_{i…