[考试记录] 2024.9.22 csp-s模拟赛31

news/2024/9/22 21:23:55/文章来源:https://www.cnblogs.com/xiaolemc/p/18425888

T1 自然数

手玩数据可以知道,对于 \(012、01、0\) 这样的每次删去后面数的序列的 \(\text{mex}\) 值是单调不降的。并且每次删去前面一个数 \(val\) 的时候,产生影响的区间只是那些只有一个 \(val\) 的序列,影响是如果该区间的 \(\text{mex}>val\) 那么就把它设置为 \(val\)

so,先 \(\mathcal{O}(n)\) 维护出原始序列每次删后面的一个数的 mex,作为线段树 \(n\) 个节点的值。再预处理出每个 \(val\) 再序列中的位置 \(pos1,pos2,\dots\),那么修改的区间就是 \(pos1\sim pos2-1\) 和 序列里第一个 \(\text{mex} >= val\) 的位置取交集。

需要维护区间最大值,区间和,区间修改。

#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 2e5 + 5;
int n, a[N], b[N], pos[N], mx, bas[N], ans, s, cnt[N];
stack<int> P[N];
namespace ST{#define ls (id << 1)#define rs (id << 1 | 1)struct node{ int l, r, sum, mx, tag; }t[N<<2];inline void pushup(int id){t[id].mx = max(t[ls].mx, t[rs].mx);t[id].sum  = t[ls].sum + t[rs].sum;}inline void addtag(int id, int val){t[id].sum = val * (t[id].r - t[id].l + 1);t[id].mx = t[id].tag = val;}inline void pushdown(int id){if(t[id].tag != -1) addtag(ls, t[id].tag), addtag(rs, t[id].tag);t[id].tag = -1;}inline void build(int id, int l, int r){t[id].l = l, t[id].r = r, t[id].tag = -1;if(l == r) return (void)(t[id].mx = t[id].sum = bas[l]);int mid = (l + r) >> 1;build(ls, l, mid), build(rs, mid+1, r);pushup(id);}inline void modify(int id, int l, int r, int val){if(l > r) return;if(l <= t[id].l && t[id].r <= r) return addtag(id, val);pushdown(id); int mid = (t[id].l + t[id].r) >> 1;if(l <= mid) modify(ls, l, r, val);if(r >  mid) modify(rs, l, r, val);pushup(id);}inline int find(int id, int val){if(t[id].l == t[id].r) return t[id].l;pushdown(id);if(t[ls].mx >= val) return find(ls, val);else return find(rs, val); }
}
signed main(){freopen("mex.in", "r", stdin), freopen("mex.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n; for(int i=1; i<=n; ++i) cin>>a[i], b[i] = a[i];sort(b+1, b+1+n);int len = unique(b+1, b+1+n) - b - 1;for(int i=0; i<=len; ++i) if(b[i+1] != i){bas[n] = i; break;}for(int i=1; i<=n; ++i) P[i].push(n+1);for(int i=n; i>=1; --i){pos[i] = lower_bound(b+1, b+1+len, a[i]) - b;++cnt[pos[i]]; P[pos[i]].push(i);}for(int j=n-1; j>=1; --j){bas[j] = bas[j+1]; --cnt[pos[j+1]];if(b[pos[j+1]] < bas[j] && !cnt[pos[j+1]]) bas[j] = b[pos[j+1]];}ST::build(1, 1, n+1); ans += ST::t[1].sum;for(int i=1; i<=n; ++i){ST::modify(1, i, i, 0);int l = ST::find(1, a[i]), r = P[pos[i]].top();P[pos[i]].pop(); int r2 = P[pos[i]].top() - 1;ST::modify(1, max({l, r, i}), r2, a[i]);ans += ST::t[1].sum;} return cout<<ans, 0;
}

T2 钱仓

每 mol 钱只能运一次,可以知道是贪心了。由题目可知,在这个环里一定存在某一个断点,使得这个断点之前的钱运不到断点处。也就是从断点之后开始枚举转移可以铺满所有位置,这个断点不唯一,找到一个即可。考虑每个点的钱往哪里运,肯定是往距离自己最小的地方(包括自己)运。那就把每个点加到队列里去,先进队列的先运出去即可。复杂度 \(\mathcal{O}(n)\)

#include<bits/stdc++.h>
using namespace std;
constexpr int B = 1 << 23;
char buf[B], *p1 = buf, *p2 = buf, obuf[B], *O = obuf;
#define gt() (p1==p2 && (p2=(p1=buf) + fread(buf, 1, B, stdin), p1==p2) ? EOF : *p1++)
template <typename T> inline void rd(T &x){x = 0; int f = 0; char ch = gt();for(; !isdigit(ch); ch = gt()) f ^= ch == '-';for(; isdigit(ch); ch = gt()) x = (x<<1) + (x<<3) + (ch^48);x = f ? -x : x;
}
#define pt(ch) (O-obuf==B && (fwrite(obuf, 1, B, stdout), O=obuf), *O++ = (ch))
template <typename T> inline void wt(T x){if(x < 0) pt('-'), x = -x;if(x >= 10) wt(x / 10); pt(x % 10 ^ 48);
}
#define fw fwrite(obuf, 1, O - obuf, stdout)
#define int long long
constexpr int N = 2e5 + 5;
int n, c[N], sum, bg, pos = 1, mx, ans;
queue<int> q;
signed main(){freopen("barn.in", "r", stdin), freopen("barn.out", "w", stdout);rd(n); for(int i=1; i<=n; ++i) rd(c[i]), c[i+n] = c[i];for(int i=1; i<=n; ++i){sum += c[i] - 1;if(sum < mx) mx = sum, bg = i+1;}for(int i=bg; i<=bg+n-1; ++i){while(c[i]--) q.push(i);int top = q.front(); q.pop();ans += (i - top) * (i - top);} return cout<<ans, 0;
}

T3 游戏

solution 1

对于 \(n = 1\)

\[ans = \cfrac{q}{1-(1-p)(1-q)} \]

100 pts

\(A_{n}\) 表示 Alice 先手取胜的概率, \(B_n\) 表示 Alice 后手取胜的概率。

  • 对于 \(A_{n-1}\le B_{n-1}\) 的情况,显然两人都取正面最优,所以有:

    \[\left\{\begin{matrix} A_n=pB_{n-1}+(1-p)B_n \\ B_n=qA_{n-1}+(1-q)A_n \end{matrix}\right. \]

    化简得:

    \[\left\{\begin{matrix} A_n=\cfrac{q(1-p)A_{n-1}+pB_{n-1}}{p+q-pq} \\ B_n=\cfrac{qA_{n-1}+p(1-q)B_{n-1}}{p+q-pq} \end{matrix}\right. \]

    可以得到转矩阵:

    \[P = \begin{bmatrix}\cfrac{q(1-p)}{p+q-pq} & \cfrac{q}{p+q-pq}\\\cfrac{p}{p+q-pq} & \cfrac{p(1-q)}{p+q-pq} \end{bmatrix} \]

    \(A_n - B_n\) 得:

    \[\cfrac{pq(B_{n-1}-A_{n-1})}{p+q-pq} \ge0 \]

    所以这种情况下他俩的大小关系会交换。

  • 对于 \(A_{n-1}\ge B_{n-1}\) 的情况:

    \[\left\{\begin{matrix} A=(1-p)B_{n-1}+pB_n \\ B=(1-q)A_{n-1}+qA_n \end{matrix}\right. \]

    化简得:

    \[\left\{\begin{matrix} A_n=\cfrac{p(1-q)A_{n-1}+(1-p)B_{n-1}}{1-pq} \\ B_n=\cfrac{(1-q)A_{n-1}+q(1-p)B_{n-1}}{1-pq} \end{matrix}\right. \]

    可以得到转移矩阵:

    \[Q = \begin{bmatrix}\cfrac{p(1-q)}{1-pq} & \cfrac{1-q}{1-pq}\\ \cfrac{1-p}{1-pq} & \cfrac{q(1-p)}{1-pq} \end{bmatrix} \]

    \(A_n - B_n\) 得:

    \[\cfrac{(1-p)(1-q)(B_{n-1}-A_{n-1})}{1-pq} \le 0 \]

    所以这种情况下两者关系也会互换。

所以每进行一次递推,大小关系会互换。具体地,当前递推奇数次的时候,最后一次为情况1, 反之为情况2。根据矩阵乘法的结合律,使用矩阵快速幂即可,复杂度 \(\mathcal{O}(8t\log n)\)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
constexpr int M = 1e9 + 7, Inv = 571428574;
struct Mate{ int m[2][2]; }P, Q, bas;
Mate operator * (const Mate &a, const Mate &b){Mate c;	memset(c.m, 0, sizeof(c.m));for(int i=0; i<2; ++i) for(int j=0; j<2; ++j) for(int k=0; k<2; ++k)c.m[i][j] = ((ll)a.m[i][k] * b.m[k][j] % M + c.m[i][j]) % M;return c;
}
Mate qpow(Mate a, int k){Mate ans = a; --k;while(k){if(k & 1) ans = ans * a;a = a * a; k >>= 1;} return ans;
}
int qpow(int a, int k){int ans = 1;while(k){if(k & 1) ans = (ll)ans * a % M;a = (ll)a * a % M; k >>= 1;} return ans;
}
int t, n, p, q;
int main(){freopen("game.in", "r", stdin), freopen("game.out", "w", stdout);ios::sync_with_stdio(0), cout.tie(0), cout.tie(0);cin>>t; while(t--){cin>>n>>p>>q;p = (ll)p * Inv % M, q = (ll)q * Inv % M;int fp = ((1 - p) % M + M) % M, fq = ((1 - q) % M + M) % M;int inv = (((ll)p + (ll)q - (ll)p * q % M) % M + M) % M;int finv = ((1ll - (ll)p * q % M) % M + M) % M;inv = qpow(inv, M - 2); finv = qpow(finv, M - 2);P.m[0][0] = (ll)q * fp % M * inv % M; P.m[0][1] = (ll)q * inv % M;P.m[1][0] = (ll)p * inv % M; P.m[1][1] = (ll)p * fq % M * inv % M;Q.m[0][0] = (ll)p * fq % M * finv % M; Q.m[0][1] = (ll)fq * finv % M;Q.m[1][0] = (ll)fp * finv % M; Q.m[1][1] = (ll)q * fp % M * finv % M;bas.m[0][0] = 0, bas.m[0][1] = 1; if(n>>1) bas = bas * qpow(P*Q, n>>1);if(n & 1) bas = bas * P;cout<<bas.m[0][0]<<'\n';} return 0;
}

T4 暴雨

改不出来了~ 咕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/801710.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2376.统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 示例 1: 输入:n = 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。 示例 2: 输入:n = …

数业智能心大陆:职场倦怠的新解法

什么是职业倦怠? 在职场中,职业倦怠的表现形式丰富多样。从数业智能心大陆 AI 心理咨询平台的数据来看,职业倦怠呈现出多种状态。教师可能对教学不再满怀热情,精心备课也成为过去式;情绪上容易烦躁、易怒,在工作压力之下,常常因为一些小事就被激怒。比如在项目团队中,成…

2024“华为杯”数模研赛E数据提取代码

2024年数学建模研究生赛E题从视频中提取数据的代码。主要包括三个部分:车流量计算、各车道车流量计算和平均速度计算。主要讲述了代码的使用方法,包括需要修改的参数和文件路径,以及一些特殊情况的处理方法。同时还提供了参数估计和绘图的相关代码,以及如何根据不同视频视角…

用Eide下配合Cubemx配置stm32环境

PS:本篇为个人学习的记录,一是方便回忆,二是相同时方便给像我一样的小白一点建议。本文默认已安装好STM32Cubemx和VSCode,以及VsCode下的Eide Cubemx部分选择好需要使用的对应单片机创建工程。在Project Manager选项下 选择Toolchain/IDE下的makefile方式来创建工程。什么是…

USB2.0设备的休眠挂起及远程唤醒

USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类:连接状态(Attached):设备连…

CSP-S 2024 提高组初赛解析(更新至单项选择)

单项选择 1在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令? A pwd B cd C ls D echopwd : print working directory cd : 跳转到指定目录 ls : 列出当前目录的所有子文件和子文件夹 echo : 输出指定内容 2假设一个长度为n的整数数组中每个元索值互不相同…

[CVPR2024]DeiT-LT Distillation Strikes Back for Vision Transformer Training on Long-Tailed Datasets

在长尾数据集上,本文引入强增强(文中也称为OOD)实现对DeiT的知识蒸馏的改进,实现尾部类分类性能的提升。 动机ViT相较于CNN缺少归纳偏置,如局部性(一个像素与周围的区域关系更紧密)、平移不变性(图像的主体在图像的任意位置都应该一样重要)。因此需要大型数据集进行预…

MobaXterm24.2 分析

MobaXterm 目录MobaXterm0、启动窗口 TForm11、TForm1_FormCreatedecrypt_9FDA481)xxBase64Decode_9FD80C2)DecryptBytes_9FD9DC2、许可结构1) Type2) version_info_3A83) user_limit4) Version5) unuse6)NoGames7)NoPlugins解析函数parse_9FEB5Cothersub_A03F80TFormAbout…

ABC372 F 题解

ABC372 F 题解F - Teleporting Takahashi 2 先把问题转化一下:把环断开成链,复制 \((K + 1)\) 层,每走一步就相当于前进一层:可以想到一个简单的 dp:设 \(f(i, j)\) 表示走到第 \(i\) 层第 \(j\) 个位置的方案数。初始化:\(f(0, 1) = 1\),其它均为 \(0\),表示 Takahash…

【做题笔记】收集邮票 做题笔记

水。P4550 收集邮票展开目录 目录P4550 收集邮票ReadingStep 1Step 2Code彩蛋Reading \(k\ge 1\) 时,可以通过支付 \(k\) 元钱获得一张 \(n\) 种邮票中的某种邮票。这 \(n\) 种邮票等概率出现,求买到全部 \(n\) 种邮票的花费期望。 Step 1 \(k\) 次 \(k\) 元太难搞了,干脆直…

单机版 ClickHouse 部署和 SpringBoot 程序访问

ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 OLAP 为联机分析处理,专注于统计查询;OLTP 为联机事务处理,专注于增删改。 ClickHouse 的优势在于单表…