模拟赛总结(四)(终章?)
2024.10.30
T1 追逐游戏 (chase)
被自己的分讨绕死了,以后要学会简化
T2 统计
T3 软件工程
选前
把这个贪心改成大炮就是整洁的一部分
定义
这个只适用于存在不交的线段,此时把它们扔到一个集合里都没贡献
那么剩余情况就要对当前线段分是否独占一个集合来转移了
其中
T4 命运的X
2024.10.31
T1 四舍五入
就是求
枚举模数,贡献就是
T2 填算符
T3 道路修建
ps:说的是云淡风轻,机房各大神犇都表示细节过多还很麻烦,后来讲题的人也吐槽了...
T4 逆序图
定义
我们先考虑一个事情:有多少排列的图是联通的(后面要用)
定义
处理出
求
对于
然后就是题解的结论:排列图的联通快是若干个不相交的区间
那么考虑能否容斥出每个区间的权值和
同样使用求
就是减去两边区间各自的贡献
定义答案为
2024.11.1
注:可以通过比赛主页得到题面
T1 网格
爆搜+特性应有
T2 矩形
注:
块长越小,码越快
T3 集合
这是真不会
T4 倒水
2024.11.2
暴力:
T1 Median
有点锑。。。
T2 Game
T3 Park
T4 路径
2024.11.4
~~ f**k the int128 ~~
T1 赌神
T2 幸运数字
不开int128爆掉50,嗯嗯嗯嗯啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
T3 建筑师
把
把能看见的建筑和被他挡住的看做一组,共
然后再给一边选出需要的楼,那么答案即:
T4 大写锁定
2024.11.5
T1 选彩笔(rgb
以为rgb各一个指针扫过去,没搞出来死了
T2 兵蚁排序(sort)
看到区间排序以为数据结构...
T3 人口局 DBA(dba)
想到数位
T4 银行的源起(banking)
只会
2024.11.6
T1 新的阶乘
自信满满以为可切,结果
小改成埃筛形式就过了...
T2 博弈树
想到直径了,但还是猜错性质qwq
T3 划分
暴力倒是到手了...就是有点少...
注1: 二分哈希指的是在比对可能的
注2: 前缀
注3: 自然溢出不能使用,只能用取模
注4: corner case特判,不然有两个点过不去
T4 灯笼
或者去看谷子题解
2024.11.7
数据有点水啊。。。
T1 图书管理
然鹅用指针维护也能过,不过听说已经被卡掉了
T2 两棵树
T3 函数(fun)
30pts(实测
std:
求解
否则每次取
求解
T4 编辑
30pts
枚举
100pts
枚举每个后缀,
考虑如何转移,先考虑做完第
每次要算的两个后缀的前缀下标不会差超过
记录每个后缀中
注1:枚举的
注2:LCP指最长公共前缀
2024.11.10
T1
tj提到了
一个数只可能和前面的最大值或者后面的最小值连边,这两个可以预处理。然后用若干个最大值将数列分成若干块,每次跳最大值,对块内元素使用上述方式连边即可。注意还要保证连通性,所以每走完一个块就要让当前块内最大和上一个块内最小值连边(倒序扫)
T2
可以不用离线,直接线段树对
-
1.为了实现tj中要求
相等的数全部相等,维护的 使用或合并,这样如果两边的值不同就会使得 个数变化,只需要在枚举个数时再次检查 的 个数是否和枚举的个数相同即可 -
2.注意到
,所以可能出现两个党派计算值均为 的情况,然而或党初始值也是 ,所以还要维护两个布尔变量表示两个党派是否放了人, 时也要求布尔为1 -
3.考虑
相同的数如何分配,没有就不分了直接比对,有一个就看给哪边,有一种成立即可。否则两边都要至少分一个
T3
先将表达式建成树:所有叶子是变量,其他节点为运算符,运算顺序为从下往上,方式为非叶子节点的值
至于如何建:维护一个
设
设
T4
其中“类似快速幂”指的是:
2024.11.11
T1 王国边缘
以为是上次的旅行者,直接打了个ksm,然后跑大样例有点慢才意识到复杂度不对... 经验主义害人不浅
改成倍增就好了,
T2 买东西题
贪半天出不来,似了
考虑一个物品怎么买下:
-
折扣价,贡献
-
用优惠券,贡献
-
“抢”之前某物品的券,贡献
(学名反悔贪心)
相当于每用一张券,都生成了一张
那么让优先队列在维护当前能用的券的同时多维护一个
T3 IMAWANOKIWA
太有品,标题也很应景(写作日语译为“弥留之际”...)
-
:褒叟 -
序列中没有
,此时怎么弄结果都一样,直接每次从 开始搞 -
判断答案:
:贪心从头开始改,如果值变了就撤销,否则继续操作。有结论是每次操作位置不超过 ,所以是平方级别的
综合上述有
if(no0)
{
minn = s[1] - '0';
hsh = 0;
for(int i = 2;i <= n;i++)
{
minn = __builtin_popcount(minn + (s[i] - '0'));
hsh = hsh * P + 1;
}
cout << minn << " " << hsh << endl;
continue;
}
if(n <= 3000)
{
int res = getans(s,1,n);
int L = 1;
while(L < n)
{
for(int i = L,num = 1;i <= n;i++,num++)
{
cout << "i: " << i << endl;
// cout << 114 << endl;
char s1 = s[i],s2 = s[i + 1];
int p1 = s[i] - '0',p2 = s[i + 1] - '0';
p1 = __builtin_popcount(p1 + p2);
s[i + 1] = p1 + '0';
for(int j = i;j > L;j--) swap(s[j],s[j - 1]);
if(getans(s,L + 1,n) == res)
{
// cout << 114514 << endl;
hsh = hsh * P + num;
L++;
break;
}
else
{
for(int j = L;j < i;j++) swap(s[j],s[j + 1]);
s[i + 1] = s2;
}
// cout << "L: " << L << endl;
}
}
cout << res << " " << hsh << endl;
continue;
}
int fi = getans(s,1,n);
cout << fi << " " << 114514 << endl;
std:
分析判断答案中的三种情况发现全是
考虑维护
2024.11.12
T1 送信卒
想了一下发现是因为取最小的话会使得
T2 共轭树图
暴力的
T3 摸鱼军训
记
有一个神秘的结论:对于
南泵。看大佬主食
T4 神奇园艺师
其中注意到的内容是某某卷积,但抛开那个从组合意义上理解也不难(就是分成独立两部分分别去选,组合+乘法)
代码。。。来不及谢了
2024.11.13
T1 花鳥風月
每个格子变糟只会影响其前驱非法格和后缀非法格形成的区间,用
T2 九莲宝灯
容易想到 = 我想不到
接上图,那么题目所求即为:
然后先预处理出每个子树内各集合点的个数,再
T3 石上三年
这题部分分中
点击查看代码
``` if(k == 1) { if(sx == ex && sx == ob[1].x) { if(min(sy,ey) > ob[1].y || max(sy,ey) < ob[1].y) printf("%d\n",abs(sy - ey)); else { if(n == 1) printf("-1\n"); else printf("%d\n",abs(sy - ey) + 2); } continue; } if(sy == ey && sy == ob[1].y) { if(min(sx,ex) > ob[1].x || max(sx,ex) < ob[1].x) printf("%d\n",abs(sx - ex)); else { if(m == 1) printf("-1\n"); else printf("%d\n",abs(sx - ex) + 2); } continue; } printf("%d\n",abs(sx - ex) + abs(sy - ey)); continue; } ```正解怎么说呢:如果起终点形成的矩形里没障碍就是曼哈顿距离(这个显然),否则存在一条最短路 贴着障碍走(。。。)
所以预处理障碍四周最多
Tips1: 防止
Tips2: 防止
T4 東北新幹線
。。。
60的大炮
dp[0][0] = 0;
for(int i = 1;i < M;i++) dp[0][i] = inf;
while(n--)
{
scanf("%s",s + 1);
if(s[1] == 'A')
{
int a,b;
scanf("%d%d",&a,&b);
cnt++;
for(int i = 0;i < M;i++) dp[cnt][i] = min(dp[cnt - 1][i] + b,dp[cnt - 1][i ^ a]);
printf("%d\n",dp[cnt][0]);
}
else
{
cnt--;
printf("%d\n",dp[cnt][0]);
}
}
2024.11.14
菜死了
T1 邻间的骰子之舞
然后少写个+1硬控俩小时。。。
T2 星海浮沉录
维护方式和昨天T1类似,找前驱后继,删掉原来的加上新的
T4 第八交响曲
是个叫双调排序的东西,能在
它有两种实现方式,其中一种方向性较强,不适用于这题的一刀切,所以给出另一种方式的实现图解以及代码(代码函数名与图中的颜色对应)
更多也可以看这篇
T3 勾指起誓
2024.11.16
原题不会,贪心报废,似了
题面从比赛获得
T1 字符串构造机
10.3考试
T2 忍者小队
666开贵了
T3 狗卡
贪爆了。。。
T4 怪盗德基
臭搜索
2024.11.17
中午不睡,下午崩溃
题面由比赛获得
T1 暴力操作(opt)
除了二分答案其他都想到了。。。
check的话就是算出最小的除数,然后预处理一个后缀
然后会出几个“读取到1,应为0”,说明削成0的代价还有更低的,所以码子里后缀处理到了
T2 异或连通(xor)
忘了加
勾十题解
首先线段树分治是一种在一些边只在满足一定条件时存在的情况下离线维护图连通性的算法,在时间轴上建立线段树,然后把每条边插入存在区间在线段树上的节点,然后查询时使用并查集搞连通,回溯时撤销。
然后这道题时间轴就是询问(实际上是对
具体的,检查
T3 诡异键盘
T4 民主投票
首先一个点最多可得票数是子树
具体的,二分最大值,设
设最终得到的值为
如果
2024.11.18
T1 草莓
简单的贪心,把
T2 三色
还得吸个臭氧。。。
T3 博弈
至于这个结论,手完几种情况可以发现当差的最低位1是偶数位时不是先手拿下最优情况,就是后手把数列变成三个不同的数使得先手赢,可以参考下面两个例子(第一列
然后祭出字典树,不同的是从低位往高位建树,这样
为什么卡常cnm
T4 后缀数组
不会平衡树。。。
2024.11.19
T1忘了建树,剩的说实话都不是很会
2024.11.21
T1 图
死都想不到
就是钦定
T2 序列
不应该往增量去想的。。。
考虑合并
最后从大到小排个序挨个去就行了。。。
注:可能有一些劣的操作,所以加入一些
T4 字符串
考虑什么时候多加一个
至于维护,使用线段树。考虑到边界点对只有
同时要注意不能越界
modify(max(l - 1,1),r - 1,1,n - 1,1,0,c);
modify(l,min(r,n - 1),1,n - 1,1,c,0);
T3 树
什么时候轮流移动 = 走一步了?
看到题后怎么想都是先手一把拉到叶子直接宣告对手的死亡,后手别玩了直接重开吧
结果阳历告诉我1,2,一连先手就输了?神tm为啥?连12先手不高兴了?还是先手大发慈悲打算给后手一点机会?@#¥%@#¥%@#?
然后难受半天跳了
事后得知输出所有情况有90
md整的我跟个sjbrz一样
2024.11.22
T1 镜的绮想
STL还是一如既往的辣鸡
既然不能用stl,就要把负数转成正的(
T2 万物有灵
想的差不多了,就差加个分桃和等比数列求和了。。。
手玩发现从最后一行选,隔一行选一行就行,然后有周期性,但是
- 类比快速幂法
点击查看代码
ll cal(ll base,ll ci)
{
ll res = 1;
ll tot = 1,ba = base;
ll num = 0;
while(ci)
{
if(ci & 1)
{
res = (res + base * qp(ba,num) % mod) % mod;
num += tot;
}
base = base * (1 + qp(ba,tot)) % mod;
tot *= 2;
ci >>= 1;
}
return res;
}
- 递归法
注意这个东西计算的是 (由图可知),是没有 的
ll cal(ll base,ll ci)
{
if(!ci) return 1;
if(ci == 1) return base;
ll res = 0;
if(ci & 1) res = (qp(base,ci) + (1 + qp(base,ci / 2)) % mod * cal(base,ci / 2) % mod) % mod;
else res = (1 + qp(base,ci / 2)) % mod * cal(base,ci / 2) % mod;
return res;
}
T3 白石溪
大炮怎么还挂了两个点
假设全是蓝色,现在要往里放红的,那么每个红石头的贡献
然后发现减去的只与个数有关,所以枚举个数,按
T4 上山岗
先说部分分:
首先算出最多能登几座山,然后对于每座山,在剩下的人中二分答案,注意字典序最大时当前山可能登不上去,所以要分成
然后发现这匹配模式有点像田忌赛马(?),所以先将能力值排序,从小到大枚举每一个登山队员找到最靠右的合法匹配位置,这样构造下来字典序是较小的,并且匹配数是最多的。
然后考虑在保证匹配数最多的情况下移动。贪心地,按能力值从大到小枚举队员。如果该队员当前有匹配的位置,那么找到最左端的未匹配的位置来置换,这样的位置是确定下来的;如果没有匹配的位置,那就随便找到一个最靠左没有被确定的位置,如果这个位置被其他人匹配过了,那就强制把那个人拆下来,把现在这个人换上去。因为比他小的人都有匹配,那这个人一定也有匹配。由于从大到小确定位置构造,这样的字典序一定最大。
2024.11.23
每次在MX上考试都感觉脑子灌了shit
T1 排序
字典树,然后不会了
事后发现没必要,直接扫一遍看有哪些数位要放
T2 交换
置换和倍增都写成型了,周期除成
剩的有点不太会呀。。。
2024.11.25
以为是四道T4,但事后发现并没有想象的那么难,以后还是不要预设难度了,就题论题
T1
错误认为是大炮,结果是个贪。。。
化简:
T2
先求
注意如果
T3
有一点要注意的是原始的差分数组下标从
T4
核心意思就是我们可以证明序列
然而我是大常熟选手。。。
2024.11.26
是落谷比赛
T1 打印
用线段树维护每个打印机的等待时间,每次有新文件时先减掉与上一个文件的时差,然后二分找合适的就行
T2 飞船
以为是实数二分答案,没救了
定义
其他类似
由于开的浮点,内存比较卡,可以滚动优化,不过此时就要边大炮边计算,否则答案就滚掉了。具体就是在计算
有一个细节是每个油只能加一次,所以倒序枚举
T3 简单的字符串问题2
这里求
意思就是每个
考虑如何修改,下面是个例子(设首项为
原数列(其二阶差分中从第三项开始都是 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
操作后 | 0 | 1 | 2 | 3 + |
7 | 8 | 9 | |||
一阶差分 |
0 | 1 | 1 | 1 | 1 | |||||
二阶差分 |
0 | 1 | 0 | 0 |
会发现修改了四个值,即
类比使用即可
70ptscode(由于数据范围不同,数组要换,所以马较长,其实核心看一个
T4 咕咕咕
2024.11.27
T1 排水系统
按题模拟即可,要注意的是结果约分以及以int128格式输出
T2 三元组
以为是数论,然而不是。。。
对于一个
T3 微信步数
最近的紫色都太有实力了
首先进行一个转化:我们让
下称走一个
先考虑一个维度
一轮过后,剩下的点会是连续的一段区间,设长度为
设一轮中走到第
设第一轮总偏移量为
第一维:步数,第二维:维度
for(int i = 1;i <= n;i++)
for(int j = 1;j <= k;j++)
{
r[i][j] = max(0,r[i][j] + bu[j] - r[n][j]);
l[i][j] = min(0,l[i][j] + bu[j] - l[n][j]);
}
那么每一步新废弃的点就是
暴力枚举轮数的复杂度是玄学的,考虑有无规律
此时手玩会有下面的结论:第
例子:
图示为执行左下角指令一轮后的形式,可以发现第一轮中左右各损失一个点,然后可以发现从第二轮开始剩下的点只可能在走完第三步后从左边被废弃,即除了第一轮,剩下的废弃模式就是一样的
每一维度都一样,开始求答案
设当前完整走了
那么走到第
本来是枚举
接下来计算系数,可以使用大炮
定义当前处理了连乘中的
点击查看代码
for(int j = 1;j <= k;j++)
{
int x = val1[j] - (r[i][j] - l[i][j]);
// cout << "x: " << x << endl;
if(x <= 0) goto nxt;//一个维度爆炸了直接停
if(val2[j] > 0) t = min(t,x / val2[j]);
for(int p = 0;p <= k;p++)
{
xi[j][p] = xi[j - 1][p] * x % mod;
if(p > 0) xi[j][p] = (xi[j][p] + xi[j - 1][p - 1] * (-val2[j]) % mod) % mod;
}
}
那么
T4移球游戏
超超超超吊的大构造
这边建议直接去看题解,太屌了
2024.11.28 NOIP终结篇
标题党,为了观感不放题目名了
T1
手玩发现每次的贡献都是两两相乘的结果,那就算出贡献,再乘以方案数即可。而方案数也不难,就是
T2
策略死了
可行的一种策略有点像赛道修建,每次先把儿子匹配,有剩的就往上配,只不过这里的树是搜索树,不能走返祖边
T3
发现答案等于
注意只有当序列长大于
T4
下称两点间距离为每一维度上距离的最大值,
二分,然后发现形式同
具体的,首先每个点对的
但是上面的方法是
发现所有
sort还用了神秘小科技,表示所有点按当前维度排序
for(int i = 1;i <= k;i++)
{
sort(a + 1,a + 2 * n + 1,[&](node p,node q) {return p.x[i] < q.x[i];});
int pre = ++all;
int l = 1,r = 1;
while(r <= 2 * n)
{
while(a[r].x[i] - a[l].x[i] > lim)
{
all++; add(all,pre);
pre = all; add(pre,inv(a[l].id));
l++;
}
if(l != 1) add(a[r].id,pre);
r++;
}
int suf = ++ all;
l = r = 2 * n;
while(l >= 1)
{
while(a[r].x[i] - a[l].x[i] > lim)
{
all++; add(all,suf);
suf = all; add(suf,inv(a[r].id));
r--;
}
if(r != 2 * n) add(a[l].id,suf);
l--;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】