Noip模拟6 2021.6.10】的更多相关文章

已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就不难了,使用倍增,$bz[x][i]$表示节点$x$的第$2^i$级复活点位置 然后询问的话分别找到$s->lca$和$t->lca$的复活次数,是$2^i$ 然后判断一下$lca$两端最后的一对复活点间的距离是否大于$k$,是的话再加一次复活 1 #include<bits/stdc++.…
考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. T1 玩游戏 好多大神在考场上使用乱搞做法$A$掉了这道题,但是我只水了$20$就跑去刚$T2$了 但是大神们的做法会被其他的恶心数据卡掉,样例是随的所以飞快.. 正解是比较$diao$的双指针.记录五个变量: $sum,sum1,sum2,max1,max2$分别表示$l-r$的和,$k-l$的…
T1 辣鸡 首先吐嘈一下,这题的测试点就离谱,不说了,附上我65分代码: 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 inline int read(){ 5 int x=0,f=1; char ch=getchar(); 6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } 7 while(ch>='0'&…
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列,里面的最大值高度是$j$, 并且后面还至少存在高度为$j$的土块,在前$i$列挖平了$p$个土块,积水的体积是奇数或者偶数的方案数 采用刷表更新$dp$值的方法,更新$f[i][j][k][u]$的所有可能到达的状态 可能有人问数组怎么开,因为$k \leq 26$所以最大值的哪一维只记录前$k+1…
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 然后维护一个冰茶姬,处理出$le,dw$数组就可以单调队列优化$dp$了 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define in…
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则先手必输 那么这道题给出了取石子上限,那么每堆石子$\mod x+1$然后异或就可以知道谁必胜了 然后这道题就转化为如何求$\sum \limits_{i=1}^{n}\oplus a_i \mod(x+1)$. 分段考虑每一段$[k(x+1),(k+1)(x+1)]$,然后预处理一个$f$数组 $…
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read(){ 4 int x=0,f=1;char ch=getchar(); 5 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 6 while(ch&…
以后估计都是用\(markdown\)来写了,可能风格会有变化 T1 宝藏 这两天老是会的题打不对,还是要细心... 考场上打的是维护\(set\)的做法,但是是最后才想出来的,没有维护对于是没有交.. 然后觉得细节太多于是下午来的就去打了比较好搞得权值线段树 基本思想就是用一个指针\(pos\)指向当前需要更新的答案(\(pos\times 2+1\)是题目输入的选择的数的个数,这样解释应该就好懂了) 那么考虑先将所有宝藏按照价值从小到大排序,发现从最后开始向前扫每一个宝藏,他可以更新的\(p…
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,q1,vis[5000001],fa[5000001],a,b,X,Y,tmp,ans; 4 struct SNOW{int to,next;}e[5000001];int head[50…
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气(也就是很菜,变成了自己瞧不起的人...) 思路很假,但他很真(雾)... 暴力枚举矩形,暴力删除这个矩形,暴力的找下一个矩形.....然后六十??? 唯一提高正确性的地方就在枚举矩形时一个点正序,另一个倒序.... 1 #include<cstdio> 2 #include<bitset&…
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<iostream> 5 #include<algorithm> 6 #define int long long 7 using namespace std; 8 namespace AE86{ 9 #define fuck cout<<…
这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数据无法精心构造,根本卡不掉,除非测评姬像老奶奶(详情见这一篇) 考场经过 造个大的数据试试跑几秒........ woc,2.7秒,不行,还是得卡常....... (30min later.....) 终于1.4秒了,就这样吧,拿个60分走人.....不对,这题时限4秒........ 然后就比较自…
T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移左移要加$1ll$ 思路的话我的做法比较麻烦,就是开一个指针$pos$每次跳到下一个数是$0$的$1$的下一个(也就是指向那个$0$) 然后判断左边界或上从$pos$那一位开始后面都是$1$的那个数,如果不超过右边界,就给左边界或上那个数 最后再和右边界或便可得到答案,复杂度没分析,$log$级别的…
T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集合大小 $2$的这么多次方显然是在枚举子集 那么改变一下枚举顺序,问题答案可以理解为: 几个不同的质数连乘组成的数在$n$的范围内有多少倍数 考虑枚举这个乘积,可以得到式子 $ans=\sum\limits_{k=1}^{n} \mu ^2(k) \left \lfloor \frac{n}{k}…
T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样例还是大样例我都少考虑了一个问题,就是元素可能相等 所以估分$100$实际只有$68$,以后造样例的时候还是要根据题目搞一些极端的数据出来 先说暴力吧,考虑到$a_i$的值域是拿来吓唬人的,因为$mex$不可能超过$2e5$ 所以大于边界的值直接跳过不考虑,这个条件比较关键 那么我们使用经典指针 $…
老妈送来了防寒补给就很棒,再也不用晚上盖两层毛巾被了,再也不用担心晚上自动把毛巾被$split$了 还有一些好吃的耶叶 T1 小L的疑惑 考场上疑惑的切掉了 直接把$a$排序然后处理前缀和的过程中判断和下一个的数的差就行 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 namespace AE86{ 5 inline int read(){ 6 int x=0,f=1;char ch=getc…
T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按照转移之后的集合内的最大值与当前集合的最大值的关系分情况转移,(这里的最大值不是$A$的最大值,是原数的最大值) 所以预处理一个集合内最大值的数组,转移可以达到$O(2^n n)$ 1 #include<bits/stdc++.h> 2 #define int long long 3 using…
T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 namespace AE86{ 5 #define out(x) cout<<#x<<":"<<x<<endl 6 #define fuck cout<<&qu…
T1 玩水 成功在考试的时候注释掉正解,换成了暴力,只因为不敢保证正解思路的正确 脑子瓦特了,不知道把暴力打成函数拼在一起,不知道当时咋想的.... 就是你找有没有一个点上面和左面的字符一样, 如果这两个点有相邻关系或者包含关系就有解(包含关系是说一个点在另一个点的右下,不在同一行一列) 1 #include<bits/stdc++.h> 2 #define int long long 3 typedef unsigned long long ULL; 4 using namespace st…
还是困,不过已经可以用脑子思考问题了 T1 数据恢复 没啥明确的算法,可以说是贪心? 考虑部分分, 链的直接扫, 对于菊花的发现只要根节点在第一个,剩下的点位置不重要 那么按照$a/b$排序,扫一遍就行. 这启发我们正解如何考虑祖先和儿子的关系 我们设$v=\frac{a}{b}$,那么还是贪心的选择$v$最小的最优 考虑父子关系 如果当前最优的点的父亲被选,那么直接选他更优 如果当前最优的点的父亲没选,那么选上他的父亲再选他更优 这样就可以使用并查集维护,每次找到$v$最小的点后把他和他父亲合…
T1 接力比赛 思路就是直接做背包$dp$,然后看看容量相同的相加的最大值. 考虑如何在$dp$过程中进行优化 注意到转移方程的第二维枚举容量没有必要从容量总和开始枚举 那么我们便转移边统计前缀和,从前缀和到当前容量做转移就行 复杂度$???$,可以过 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 namespace AE86{ 5 inline int read(){ 6 int x=0,…
T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判断 如果在统计时使用差分的思想,可以复杂度降到$O(n)$,也可以用$set$多一个$log$都能过 1 #include<bits/stdc++.h> 2 using namespace std; 3 namespace AE86{ 4 inline int read(){ 5 int x=0,…
T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万不能在一道题上花费太多时间 正解是一个关系的判断 每一条边选还是不选都会跟另一条边产生连锁关系,那么给他们编上号建边,用并查集判断环就行 然后每个环上选择$n$个不相邻的点,总共$2^{环数}$种方案 1 #include<bits/stdc++.h> 2 #define ll long long…
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部的点和下部的点个数尽量相等 这一部分直接使用动态开点线段树维护即可, 具体实现是每个点左右两边分别维护一棵树,开始的时候吧所有点都放在右边树上 然后扫每一个点作为最高柱子的情况,同事把右树上的点移动到左树上 1 #include<bits/stdc++.h> 2 #define LL long l…
T1 异或 比较稳的切掉 观察数据范围,无法线性筛啥的,根号复杂度也会死,于是只能考虑$log$级 然后打表 发现当$n$为$2^i$时的答案是一个可递归数列: $1,3,7,15,31,63,127...$ 这样的话直接把$n$进行二进制拆分,然后累加$2^i$的答案就可以出来最终答案 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 namespace AE86{ 5 inline int…
T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有贡献,还是可以按照原来的相同的颜色搞, 于是无论是$dfs$也好,$dp$也罢,都不用考虑新产生区间的后效性问题 那么我们设$dp_i$表示处理到第$i$个宝石,然后判断一下他的前面有无与他同色的宝石 转移维护前缀和即可. 1 #include<bits/stdc++.h>//分治+dp? 2 #…
T1 reverse 又一道板子打假的挂分题,直接挂到倒二.. 考场上思路神奇,居然想到用$bfs$建边然后跑最短路, 其实当时也想到了直接$bfs$,但是不知道为啥觉得$dij$屌就没直接打$bfs$... 最可怕的是$dji$没打对,以后可能要早操背板子了... 然后其实这题能卡过,因为$k$都特别小. 1 #include<bits/stdc++.h> 2 using namespace std; 3 namespace AE86{ 4 inline int read(){ 5 int…
T1 interval 亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了. 先预处理出以a[i]为最大值的最大左右区间.然后再将a[i]取%!!!是的,要不然会影响单调栈的使用... 注意一下,这个题的前缀和与a[i]数组都要取%优化,类似<入阵曲>. 可以知道,一个合法的区间应满足. 然后就是昨天T3的类似启发式优化,找到距离较小的区间. 然后枚举那个区间里的每一个位置,都可以算出一个数(以下拿枚举左区间举例): 等价右面的柿子就是我们枚举要求的.我们相当于求出一个sum…
T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 namespace AE86{ 5 inline int read(){ 6 int x=0,f=1;char ch=getchar(); 7 while(ch<'0'||ch>'9'){if(ch=='-…
第一次在学校过中秋节,给家里人视频电话,感觉快回家了很开心, 然后还吃了汉堡喝饮料非常爽,颓废了一会儿还换了新机房,$Linux2.0$非常dei,少爷机也非常快, 发现好像测评机又成了老爷机,这就是信息领域的更新速度吗?? T1 Lesson5! 咕咕咕 T2 贝尔数 原先见过这种东西,但是这道题确实用不上... 考虑利用题目里面给的公式来做 1.$Bell_{n+1}=\sum_{k=0}^{n}C_{n}^{k}*Bell_{k}$ 2.$Bell_{n+p}\equiv Bell_{n+…