拼潦 发表于 2025-8-13 09:16:58

2025.8.13校队题单分享+总结

那个随笔写不下了,先暂时放这
T1
由于电信技术的发展,人人都可以通过手机互相联系。
有一位电信大佬最近想生产一大批手机,然而从生产线上一台一台地生产实在太慢了,于是他想出了一个办法 —— 让手机自我复制。
于是他给手机加上了一个内置的函数 fork()。手机的程序如果调用这个函数,那么手机会生产出一台完全一模一样的手机(包括程序运行状态),并且自己这台的函数返回值为 \(1\) ,新手机的函数返回值为 \(0\) ,然后两台手机都继续执行程序。(请注意黑体字内容)
初始时,只有一台手机。接着,大佬让手机计算形如这样的表达式:
fork() <op> fork() <op> ... <op> fork()其中是二元运算符,为 && 或者 || 中的一种。例如:
fork() && fork() || fork() && fork() && fork() || fork()两个运算都是左结合的,且 && 的优先级比 || 高,所以上面的那个表达式相当于:
((fork() && fork()) || ((fork() && fork()) && fork())) || fork()对于表达式 \(a\) && \(b\),手机会先计算 a 的值,如果为 \(0\) 那么不计算 \(b\) 的值(因为很重要所以说两遍,请注意这里不计算 \(b\) 的值),该表达式值为 \(0\);否则计算 \(b\) 的值并将其值作为该表达式的值。
对于表达式 \(a\) || \(b\),手机会先计算 \(a\) 的值,如果为 \(1\) 那么不计算 \(b\) 的值(因为很重要所以说两遍,请注意这里不计算 \(b\) 的值),该表达式值为 \(1\);否则计算 \(b\) 的值并将其值作为该表达式的值。
表达式计算完成后,大佬制造出了数量惊人的手机,人类终于叩开了指数级工业制造的大门。
一万万年后,一位考古学家调查了此次事件。他得到了大佬让手机计算的表达式。他想知道大佬当年究竟制造出了多少台手机。(包括初始的那台手机)
你可以参照样例解释来更好地理解题意。
输入格式
第一行一个正整数 \(n\),表示表达式中的 \(fork()\) 的数量。
接下来一行 \(n−1\) 个用空格隔开的字符串,每个字符串为 "&&” 或者 “||”,依次表示表达式中对应位置的运算符。
输出格式
一行,一个整数表示制造出的手机的数量,你只用输出答案对 \(998244353\) 取模后的结果。
样例一
input
2
&&output
3explanation
共生产 \(3\) 台手机,过程如下:
第 \(1\) 台手机开始计算 \(fork()\) && \(fork()\)。
第 \(1\) 台手机开始计算 \(fork()\),产生了第 \(2\) 台手机。
第 \(1\) 台和第 \(2\) 台的 \(fork()\) 计算完成,第 \(1\) 台返回 \(1\),第 \(2\) 台返回 \(0\) 。
第 \(1\) 台手机由于 \(fork()\) 返回值为 \(1\),开始计算 \(fork()\) && \(fork()\) 右边的 \(fork()\),产生了第 \(3\) 台手机。
第 \(2\) 台手机由于 \(fork()\) 返回值为 \(0\) ,于是 \(fork()\) && \(fork()\) 值为 \(0\)(跳过右边的 \(fork\) 的计算),程序结束。
第 \(1\) 台和第 \(3\) 台的 \(fork()\) 计算完成,第 \(1\) 台返回 \(1\),第 \(3\) 台返回 \(0\)。
第 \(1\) 台手机由于 \(fork()\) 返回值为 \(1\),于是 \(fork()\) && \(fork()\) 值为 \(1\),程序结束。
第 \(3\) 台手机由于 \(fork()\) 返回值为 \(0\),于是 \(fork()\) && \(fork()\) 值为 \(0\),程序结束。
样例二
input
6
&& || && && ||output
15限制与约定: \(n \le 10^5\)
题解
因为 && 的优先级高于 || 就将 || 作为分割线,每一块 && 依次处理。
观察题目,如果是 && 那么前面是 \(0\) 就停止,如果是 || 那么前面是 1 就停止
只有当手机返回值为1时才能造出手机。而且在当前这块中复制出的手机,在下一块中才能造出其他的手机。
所以就引导出了答案等于块长的前缀乘加在一起。
接下来就是最简单的实现了:
#include #define int long longusing namespace std;const int N = 1e5 + 10;const int mod = 998244353;int n;string str;int cont, cnt = 0, idx = 0;signed main(){    cin >> n;    cnt = 1;    for(int i = 1 ; i < n ; i ++ )    {      cin >> str;      if(str == '|') cont[ ++ idx] = cnt, cnt = 1;      else cnt ++ ;    }    cont[ ++ idx] = cnt;    int now = 1, ans = 1;    for(int i = 1 ; i > T;    while(T -- )    {      int a, b, c, d;      cin >> a >> b >> c >> d;      if(a == c || b == d) cout

卜笑 发表于 2025-10-14 12:11:37

yyds。多谢分享

崆蛾寺 发表于 2025-11-2 04:14:33

感谢发布原创作品,程序园因你更精彩

跑两獗 发表于 2025-11-5 12:48:43

分享、互助 让互联网精神温暖你我

左丘雅秀 发表于 2025-11-19 05:23:27

谢谢分享,辛苦了

饨篦 发表于 2025-12-20 02:14:14

不错,里面软件多更新就更好了

懵径 发表于 2025-12-25 12:40:03

感谢分享

眺愤 发表于 2026-1-2 17:33:10

喜欢鼓捣这些软件,现在用得少,谢谢分享!

瞪皱炕 发表于 2026-1-8 06:03:01

喜欢鼓捣这些软件,现在用得少,谢谢分享!

碛物 发表于 2026-1-15 17:21:37

收藏一下   不知道什么时候能用到

拍棹 发表于 2026-1-17 10:51:03

感谢分享,下载保存了,貌似很强大

频鹏凶 发表于 2026-1-19 03:04:45

热心回复!

昝梓菱 发表于 2026-1-20 14:44:24

谢谢分享,辛苦了

葛雅隽 发表于 2026-1-20 23:02:01

分享、互助 让互联网精神温暖你我

嫁吱裨 发表于 2026-1-21 02:46:40

过来提前占个楼

兜蛇 发表于 2026-1-22 23:01:03

热心回复!

富账慕 发表于 2026-1-23 05:17:57

收藏一下   不知道什么时候能用到

背竽 发表于 2026-1-24 06:42:42

懂技术并乐意极积无私分享的人越来越少。珍惜

祖娅曦 发表于 2026-1-26 12:03:24

收藏一下   不知道什么时候能用到

氛疵 发表于 2026-2-4 04:07:49

yyds。多谢分享
页: [1] 2
查看完整版本: 2025.8.13校队题单分享+总结