模拟赛总结(二)
2024.8.1
T1 集合(mex.cpp)
枚举每个数,求他是
T2 取模(mod.cpp)
有点套路
定义:
那个下取整可以变为:
那我们就分成两部分求:元素和和减了多少个
在推正式的式子之前,先看一看对于固定的序列,有结论
简单解释:考虑到是不重复的两两求和,那么每个元素都会和其他元素配对
接下来推正式的
- 元素和
考虑一个位置的贡献,当这个位置是
- 减一数量
假设当前有
最后
补上取余即可
T3 魔法(magic.cpp)
暴力给编号连边+
正解:根据第二个传送法,我们可以把颜色相同的放到一起,如果两个编号间能传送,其实就是这两个编号代表的颜色联通了,可以使用类似并查集的方法合并,使用
小优化:假设当前颜色是
bitset: 一种容器
bitset<N> vis[N];
。其中vis[i][j]表示第个bitset的第 位
T4 排位(star.cpp)
贪心最多
正解
2024.8.3
阿巴阿巴阿巴阿巴阿巴...
T1 怎么又是先增后减
对于最小的数字,它肯定去两边,那么交换次数就是左/右边比他大的数的个数,二者取
可以使用树状数组优化
T2 美食节
我们可以采取各种办法发现某些位置答案一样,而且构成连续区间
相关理解:
那么我们每次维护一个答案最优区间,每次和活动区间取交集,如果交集为空,就更新代价和区间
T3 环上合并
先说特殊性质
如果序列单增,则每个数都只需要一次操作,但是首尾不同,需要根据当前
然后我们就关注什么时候一个数需要一次操作,什么时候不止一次
为了方便讨论,我们新建一个数组
其中
此时就要把数组全部染成
那么讨论
-
形如
或者 ,此时每个数只需一次操作 -
形如
或者 ,此时必须额外花费一次
再将第二种情况扩展一下:
T4 送快递
大炮题
定义
以周欣为例
又因为两人是等价的,所以把上面两维交换一下就是青蛙的式子
正解戳this
这里关于绝对值,由于只扫一遍,所以不知道内部大小关系,因此两种情况都要存,故需要两棵树,而且维护的时候要把整个含
https://img2024.cnblogs.com/blog/1129554/202403/1129554-20240319111911135-280028134.png
2024.8.5
T1
最终态就是前面都为
假设值为
同理,
T2 珂学
每次选择的最大值肯定不挨着,那么操作总数就是被选择的数的总和
那么就有四种状态:左/右都/仅一个有(没有)被选择的数,代码中注释使用
合并区间时,如果
为了判断上面的情况,就要记录对应状态下左右端点的数是否被选择(没有就不管,也不更新)
T3 帝国飘摇
贪心,肯定越靠右越好,最劣情况就是第
烦死了都在洛谷上过了怎么gxyz就是不让我过之前就有好几道题都是卡着最后一个点
upd on 2024.8.8 : 开O2可过..........
T4 前往大都会
建最短路图搞大炮+鞋油
2024.8.6
T1 小学奥数题
膜拟了半天出不来,当场似了
T2 BB
定义
那么
解释:赚的钱=从
考虑到自己的点互相支配不影响赚的钱,所以用类似补
算出来每个点的
T3 BC
理解大半,直接上马吧
高消版,也有纯大炮的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair <int,int> pii;
const int N = 1e3 + 5, M = 50 + 5, Mod = 998244353, inv = 205817851;
//first:概率 second:期望
int n, m, W[M<<1]; pii F[N][M], G[N+M][M];
int Pow ( int x, int y ) { int res = 1; for( ; y; y >>= 1, x = 1LL * x * x % Mod ) if( y&1 ) res = 1LL * res * x % Mod; return res; }
int Inv ( int x ) { return Pow( x, Mod - 2 ); }
int Add ( int x, int y ) { return x + y >= Mod ? x + y - Mod : x + y; }
pii Add ( const pii& a, const pii& b ) {return make_pair( Add( a.first, b.first ), Add( a.second, b.second ) ); }
//加法取余,比较正常
pii Mul ( const pii& a, const pii& b ) {return make_pair( 1LL * a.first * b.first % Mod, ( 1LL * a.first * b.second + 1LL * b.first * a.second ) % Mod ); }
//Mul:事件A,B期望的合并,E(A+B) = E(A)P(B) + E(B)P(A)
//这个和概率生成函数的导函数(某种情况下好像就是期望,E(x) = F'(1))以及导数的运算法则有关
//实在不理解可以尝试使用集合描述法理解
//生成函数详情看看这个:https://www.cnblogs.com/gtm1514/p/16653405.html
//F[i][j]:同题解含义
//G[i][j]:最终值为(i,i+j)时的答案
//+m是平移坐标
void Solve ()
{
cin >> n >> m;
for(int i = -m; i <= m; ++i ) cin >> W[i+m], W[i+m] = 1LL * W[i+m] * inv % Mod;
//简化高消预处理F,O(nm^2)
//所谓的几何分布就是:该情况下期望是1/p或者(1-p)/p,p是概率(但是感觉在这里没什么用)
for(int i = 0; i < n; ++i)
{
pii T[M<<1];//高斯消元系数数组简化版,下标含义应当和F的第二维相等
for(int j = -m;j <= m; ++j) T[j + m] = make_pair(0, 0);
for(int j = -m;j <= m; ++j) T[max(-i,j) + m] = Add(T[max(-i,j) + m], make_pair(W[j+m], W[j+m]));
for(int j = -m;j < 0; ++j)
for(int k = 1; k <= m;++k)
T[j + k + m] = Add(T[j + k + m], Mul(T[j+m], F[i+j][k]));
int tmp = Inv((1 - T[0 + m].first + Mod) % Mod);//这个手搓一下朴素高消版本就能知道是啥
for(int j = 1;j <= m;++j) //条件概率
F[i][j].first = 1LL * T[j + m].first * tmp % Mod, F[i][j].second = 1LL * ( T[j + m].second + 1LL * F[i][j].first * T[0 + m].second) % Mod * tmp % Mod;
}
//dp,将<i的答案向>=i转移
G[0][0 + m] = make_pair(1, 0);
for( int i = 0;i < n; ++i)
for(int j = max(-i,-m);j <= 0;++j)//起点
for(int k = 1;k <= m;++k)//向上“走”了多少步
if(k + j <= 0) G[i][k + j + m] = Add(G[i][k+j+m], Mul(G[i][j+m], F[i+j][k]));//此时用i+j的号打
else G[i+k+j][-(k + j) + m] = Add(G[i+k+j][-k-j+m], Mul(G[i][j+m], F[i+j][k]));//此时用i的号打
int res = 0;
//答案的最终值范围是[n,n + m]
for( int i = n; i <= n + m; ++i ) for(int j = max(-i,-m); j <= 0; ++j) res = Add(res,G[i][j+m].second );
cout << res << "\n";
}
int main ()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); Solve(); return 0;
}
T4 BD
2024.8.7
困~~~~~
T2 排排
-
:原本就单增,判一下即可 -
:比较复杂:根据第一个样例可知 的位置可以拿来操作,那么条件就是左边没有右边下标对应的数,可以用 实现 -
: 在中间,此时先操作一次可以把一个排到头头,然后变成 的情况 -
: 在头头,但是反的,手算可知三次
T1 串串
对于一个点
否则看一下新长度到达的点是否可行(倒着扫,因为
T4 桥桥
思路很粗暴但不好想到
对操作分块,
T3 序序
2024.8.8
T1 九次九日九重色
上古套路题
手摸样例配对的
所以可以预处理所有可能的配对
对于
预处理复杂度
T2 天色天歌天籁音
想到莫队做法了,但是没想到好的求个数方法,套了个线段树
然后发现想多了
题目要求区间众数的个数,并不关心是什么数,所以我们可以开一个数组
然后维护即可
T3 春色春恋春熙风
考虑回文成立当且仅当最多一个字母的个数是奇数,可以使用异或表示,每一位表示字母个数的奇偶性
那么
先说暴力:
对每个可能的状态(一共
std:
考虑继承儿子的答案,那么为了省事,继承重儿子答案(因为子树最大,合并少),对于每个轻儿子暴力走一遍算出路径,其他信息都扔掉,数组留着维护重儿子信息
还有一个优化就是桶里直接装最深深度,直接算一下即可
当前树根
click here to see more details
T4 雪色雪花雪余痕
有两种方法:直接维护原序列或者维护差分数组
二者初始都是全为
- 维护原序列
有两种加数方式:在后面一段区间加
前者区间长是根号级别,然后可以使用类似背包的方式转移
注意有一种情况是前面一部分
- 维护差分数组
由于差分数组还原原序列做的是一个形如
2024.8.10
菜
T1 星际旅行
题意等价于:删掉两条走一遍的边后,剩下的是欧拉回路(这样才能都过第二次)
然后就有:两个自环,一个自环+一条边,两条有公共点的边三种,累计即可
注意要先判断图的联通,朴素并查集即可
T2 砍树
题目要求最大的
然后发现二分死了
但是发现
注意,这里枚举的除数不一定是答案,而是当
然后反带回去验证即可
还有一个判断就是除出来的
T3 超级树
超级抽象
定义
很抽象,拿样例来说,
然后考虑把两个
如果两棵树内部路径分别是
然后要讨论根节点的去处
-
啥也不干,
-
自己独立作为一个路径,
-
连到左/右子树内的一条路径上,共
种,又分方向,故有首位之分, -
联通左右树的一条路,此时总数减一,然后乘法原理+方向可得
-
联通一个子树内的两条路,类似的可得
答案
然后讨论循环上界,因为裸的上界是2的幂次
如果目标状态是
T4 成绩单
啊,1.题读错了,暴力写炸了 2. n 最多50 四次方没想区间大炮
2024.8.12
T1 序列
因为
T3 建造游乐园
以为是结论,但是是半结论
我们可以直接求欧拉图数量,然后删(加)一条边即为题目所求,共
考虑容斥
设
对于
然后要减去不联通的
不妨把图划分成两部分,第一部分一定联通,大小为
T2 熟练剖分(tree)
大炮,注释代码里有
T4 由乃的 OJ
病娇一般的题目and时空限制
std:
首先位运算不满足交换律,因此运算有顺序
然后
大致思路就是拆成位,然后为了空间把64个位(64个线段树)压成一个
树剖的时候要两个方向
2024.8.13
T1 那一天我们许下约定
暴力
设
答案就是
后面那个递推可搞
T2 那一天她离我而去
拆掉
然后考虑不把边删掉而是连向虚拟点
由于点编号不同,可用位运算分类
ps1:边的数量最多
ps2:连向
T4 战争调度
暴力枚举叶子
考虑枚举父亲状态然后到叶子时初始化,然后回溯时大炮
设
T3 哪一天她能重回我身边
考虑反面向正面连边,那么合法的情况就是每个点入度不超过
根据抽屉原理,边数
2024.8.14
4道T4,吃满暴力就能上三位数
T1 2-Coloring
上来一道紫
暴力:
思路难泵,戳这里看第一篇,讲的清楚
T2 连通块
暴力:
trick:删边改为加边,就是初始时把标记的未删的边合并,然后离线倒序跑询问,用并查集维护树的直径
答案就是查询点到块内直径其中一端的距离
T3 军队
暴力:
重叠矩形使用扫描线,可以
T4 棋盘
暴力:
奇怪的维护,戳
2024.8.15
T1 Kanon
考的时候想成一堆球打架就不会维护了qwq
每个雪球大小来源都是连续区间,没有交集那么答案就是区间长,有的话要判断交集属于哪个球,然后可以二分找到
球之间的雪最需要判断主权,两端以外没必要(肯定是第一个和最后一个)
T2 Summer Pockets
T3 空之境界
裸区间大炮可以
然后考虑转化:二分枚举答案,做
然后将区间大炮的转移方式小改一下,就有两种情况:
-
更新
,如果 符合并且 也符合条件,我们就能认定 可行 -
用
扩展,这一步有点像枚举断点更新,即如果 符合条件,那么 的状态(就是 以后区间的状态)可以使用 更新
最后检查
T4 穗/P4690 Ynoi2016
剩下
2024.8.17
考场暴力刚好
T1 Set
考场以为子集不连,直接乱搞起步睡到
正解很简单:余数共
T2 Read
那么如果有书的数量
考虑到
T3 题目交流通道
乱搞
然后如果有
考虑
T4 题目难度提升
构造
如果序列中间有数字出现两次以上,就一直让他作中位数,然后一小一大往里加即可
然后考虑一般情况
首先有结论:当前未填数的最小值必须大于等于当前中位数
那么就要看中位数情况,分加之前有奇数个/偶数个数字讨论
如果序列内没重复数字,那就走流程
如果有重复的,分析重复数字的位置,考虑在一定情况下让重复数字成为中位数
附加:消除游戏
不会
2024.8.19
T1 电压
暴力拆边+check有
然后要求删边后是二分图,那么删的边都在奇环上,考虑
T3 奇迹树
一眼树的直径,想从某一端点出发搜完整棵树完成赋值
裸搜,假的,
假了的原因在于不能保证其他点和作为终点的端点关系合法
处理很简单,先把不在直径上的点遍历完再给直径上的点赋值,很容易证明这样最优(考虑回溯,在直径上回溯然后跑到别的点肯定垃圾)
T2 农民
默认
修改后的暴力高达
std:考虑维护每个点能吸收的肥料值的范围,一个节点会把
T4 相逢是问候
2024.8.20
又双困了一上午╯﹏╰....
T1 博弈
先手必胜:至少一个数个数为奇数
奇偶性使用异或表示,但考虑到
T3 大陆
T2 跳跃
考虑到最优肯定是在某些区间里反复横跳,设
那么就是在
为了维护跨区间的跳跃,分别维护从
T4 排列
剩下平衡树,不会
2024.8.21
Fate
看到教堂自动浮现名场面
暴力
大炮,设
记搜转移即可
T2 EVA
睡了
考虑到以鱼的坐标为网的一端一定不劣,所以枚举鱼作为参考系,其他鱼根据相对运动可以算出进入网的时间范围,由于是
T3 嘉然登场
状压
考虑根据
T4 Clannad
爆了
题目要求包含区间内所有关键点的最小联通子树
有结论:
将关键点按
序排序后,边数 ,点数 边数
可结合
依此暴力
然后可以使用回滚莫队(只删不加) + 链表(删除__lg
和交换
2024.8.22
今天题难,才爆出来
对应的讲解戳题可得
或者这个
T1Skip
这个代码用魔法常数可得
T2String
T3Permutation
暴力大炮:
std:
T4小P的生成树
2024.9.8
大数学时代
T1 喜剧的迷人之处在于
首先找出使
后面三道就乱杀人了
T2 镜中的野兽
本质是容斥,但是朴素版本会算死人的,所以开科技(莫反)
T3 我愿相信由你所描述的童话
正反两遍平方级大炮跑最长子序列类似的板子然后没去重死了
重复原因就是统计答案时在枚举坡度转折点
T4 Baby Doll
一眼顶针鉴定为神秘外星禁忌知识根本不可做
2024.9.15
我是盲人
T1 出了个大阴间题(repair
瞎 * 1,看成自由合并,然后被求
部分分(80pts):
定义
考虑到题目说的是排列,而状态只能表示选没选,所以还得另开一个存方案数
std:
可以预处理每个状态下的最大
T3 是我的你不要抢(string)
瞎 * 2,看成
想到自动机的fail可以搞,但是好像要撤销,不会了
后边发现hash+记录答案可过...
至于原理,考虑最多只有
然后
T2最简单辣快来做(satellite
瞎 * 3,没看到
绝对值拆成四个方向的矩形维护
对于每个卫星相对查询点所在的四个矩形哪一个的序列,只有
T4 显然也是我整的
好像是每次找到一些单独成块的点(这里的点可能是单点,也可能是缩完的点)计入答案,然后构造 + 递归搞
具体还是不太清楚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】