模拟赛 R20

news/2025/10/28 9:28:12/文章来源:https://www.cnblogs.com/Hengqwq/p/19170702

R20 - A 灵图机

题目描述

小圈有一台灵图机。这个灵图机输入一个打孔的纸带。该纸带有 \(n\) 个格子,上面有若干个格子被打孔了。

因为这是一台灵图机,所以它有比图灵机更强的功能:

  • 任意指定一个打孔的格子 \(p\),将 \(p\) 变为未打孔的,一次花费 \(a\)
  • 任意指定一个未打孔的格子 \(p\),将 \(p\) 变为打孔的,一次花费 \(a\)
  • 任意指定两个格子 \(p,q\)\(p \ne q\)),其中 \(p\) 是打孔的,\(q\) 是未打孔的,然后将 \(p,q\) 均变为打孔的,一次花费 \(b\)
  • 任意指定两个格子 \(p,q\)\(p \ne q\)),其中 \(p,q\) 均是打孔的,然后将 \(p,q\) 均变为未打孔的,一次花费 \(b\)

上述功能可以使用任意多次。你的目标是用最小的代价把纸带上所有格子的打孔状态变成 相同的,即全部打孔或全部未打孔。

Solution

分讨要注意细节啊(。注意如果想让一个孔从打孔变为不打孔的,不仅可以花费 \(a\),还可以花费 \(2b\)。就是因为没注意到这个挂了 50......

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, a, b;
void solve(){cin >> n >> a >> b;int num[2] = {0};for(int i = 1; i <= n; ++i){char c; cin >> c;num[c - '0']++;}int ans = (num[1] ? num[0] * b : a + (num[0] - 1) * b);ans = min({ans, num[0] * a, num[1] * a, (num[1] >> 1) * b + (num[1] & 1) * min(a, 2 * b)});cout << ans << '\n';
}
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T; cin >> T;while(T--) solve();return 0;
}

R20 - B 多边形

题目描述

在一个平面直角坐标系下,小圈给了你 \(n\) 个凸多边形,每个凸多边形有 \(m\) 个顶点。所有点的坐标都在 \(0 \sim V\) 之间。

随后,小圈会随机两条直线,一条平行于 \(x\) 轴,一条平行于 \(y\) 轴,直线表示为 \(y = y _ 0\)\(x = x _ 0\)。她的随机方式是,让 \(x _ 0, y _ 0\) 都在 \(0 \sim V\) 的实数中均匀随机。

小圈想知道,对于 \(i \in [1, n] \cap \mathbb{Z}\),两条直线同时经过的多边形个数恰好为 \(i\) 的概率是多少?为了避免精度问题,小圈要求你输出概率对 \(10 ^ 9 + 7\) 取模的结果。

Solution

实际上跟多边形没有任何关系。首先这个随两条线就是随一个点。然后一条线 \(x = k\) 与多边形有交,就是 \(\min x \le k \le \max x\)\(y\) 同理。那么我们做二位前缀和,每次对 \([\min x, \max x] [\min y, \max y]\) 这个矩形 +1,最终被覆盖了多少层就是同时经过了多少个多边形。
场上写的扫描线。

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e3 + 5, mod = 1e9 + 7;
typedef tuple<int, int, int> tpi;
int mxx[N], mnx[N], mxy[N], mny[N], p[N], n, rge[N], tot, V, sum[N];
void chmax(int &x, int y){ x = max(x, y); }
void chmin(int &x, int y){ x = min(x, y); }
void add(int &x, int y){ (x += y) %= mod; }
int qpow(int a, int b){int ret = 1;for(; b; b >>= 1, (a *= a) %= mod){if(b & 1) (ret *= a) %= mod;}return ret;
}
void add(int l, int r, int x){for(int i = l; i < r; ++i) sum[i] += x;
}
map<int, vector<tpi> > mp;
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);// freopen("polygon4.in", "r", stdin);// freopen("polygon.out", "w", stdout);cin >> n >> V;rge[++tot] = 0, rge[++tot] = V;for(int i = 1; i <= n; ++i){int m; cin >> m;mnx[i] = mny[i] = 1e9;while(m--){int x, y; cin >> x >> y;chmax(mxx[i], x), chmin(mnx[i], x);chmax(mxy[i], y), chmin(mny[i], y);}rge[++tot] = mny[i], rge[++tot] = mxy[i]; }sort(rge + 1, rge + 1 + tot);tot = unique(rge + 1, rge + 1 + tot) - rge - 1;for(int i = 1; i <= n; ++i){mxy[i] = lower_bound(rge + 1, rge + 1 + tot, mxy[i]) - rge;mny[i] = lower_bound(rge + 1, rge + 1 + tot, mny[i]) - rge;mp[mnx[i]].emplace_back(mny[i], mxy[i], 1);mp[mxx[i]].emplace_back(mny[i], mxy[i], -1);}// for(int i = 1; i <= tot; ++i) cout << rge[i] << ' ';// cout << '\n';for(auto [x, t] : mp){auto nxt = mp.upper_bound(x);if(nxt == mp.end()) continue;int len = nxt -> first - x;for(auto [l, r, k] : t) add(l, r, k);for(int i = 1; i < tot; ++i){// cout << sum[i] << ' ' << rge[i] << ' ' << rge[i + 1] << '\n';add(p[sum[i]], len * (rge[i + 1] - rge[i]));}}int frac = qpow(V * V % mod, mod - 2);for(int i = 1; i <= n; ++i) cout << p[i] * frac % mod << ' ';return 0;
}

R20 - C 音游

题目描述

这款音游只有一个键。小铃的按键输入序列可以看作是一个长为 \(m\) 的 01 序列。一首歌有 \(n\) 个音符。一个音符可以用三个整数表示:\((x, y, z)\),其中 \(x \le y < z\)。当且仅当在输入序列的区间 \([x, y]\) 中都没有 \(1\),并且输入序列的区间 \((y, z]\) 中有 \(1\) 时,这个音符才会被判定为 Perfect,否则会被判断为 Miss 或 Bad。

小铃怀疑这首歌不可能达成 All Perfect,于是她将音符信息给了你,想问问你最多可以打出多少个 Perfect?并且要求你给出打法供参考。为了简化小铃的判断,你需要输出在打出最多 Perfect 的情况下,字典序最小的 01 串。

Solution

怎么说呢,这种求字典序最小的得反过来做。
考虑 \(f_i\) 表示第 \(i\) 位放 1, \(x > i\) 的合法三元组的最多数量。有转移,\(f_i = \max_{j > i}{f_j + \sum_k [x_k > i][y_k < j][z_k \ge j]}\)。考虑线段树优化。当我们 \(i \gets i - 1\) 的时候,我们把所有 \(x_k = i\) 的音符拿出来,对 \([y_k + 1, z_k]\) 做区间加 1 就把贡献数组维护好了。然后再维护一下单点加(更新 dp 值)和区间最大值就行。
求方案的时候,倒过来做的好处就显现出来了。我们同时记录区间最大值所在的位置,如果有多个就记录最右边哪个 \(k\)。当 \(f_i\)\(f_k\) 转移时,意味着 \((i, k)\) 之间全都是 0,这个字典序肯定是严格小于 \(i\) 从一个更小的 \(j\) 转移过来的。正着做的你会发现无法快速判断字典序大小。
最后偷个懒,认为答案是 \(f_0\)

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 3e5 + 5;
int tag[N << 2], n, m, pre[N], f[N];
vector<pii> op[N];
pii tr[N << 2];
#define ls(p) p << 1
#define rs(p) p << 1 | 1
void addtag(int p, int k){tr[p].first += k;tag[p] += k;
}
void pushdown(int p){if(tag[p]){addtag(ls(p), tag[p]);addtag(rs(p), tag[p]);tag[p] = 0;}
}
void pushup(int p){tr[p] = max(tr[ls(p)], tr[rs(p)]);
}
void build(int p = 1, int pl = 0, int pr = m + 1){if(pl == pr) return void(tr[p].second = pl);int mid = (pl + pr) >> 1;build(ls(p), pl, mid);build(rs(p), mid + 1, pr);pushup(p);
}
void add(int L, int R, int k, int p = 1, int pl = 0, int pr = m + 1){if(L <= pl && R >= pr) return addtag(p, k);pushdown(p);int mid = (pl + pr) >> 1;if(L <= mid) add(L, R, k, ls(p), pl, mid);if(R > mid) add(L, R, k, rs(p), mid + 1, pr);pushup(p);
}
pii query(int L, int R, int p = 1, int pl = 0, int pr = m + 1){if(L <= pl && R >= pr) return tr[p];pushdown(p);int mid = (pl + pr) >> 1;pii ret = {0, 0};if(L <= mid) ret = query(L, R, ls(p), pl, mid);if(R > mid) ret = max(ret, query(L, R, rs(p), mid + 1, pr));return ret;
}
signed main(){cin.tie(0)->sync_with_stdio(0);cin >> m >> n;build();for(int i = 1; i <= n; ++i){int x, y, z;cin >> x >> y >> z;op[x].emplace_back(y, z);}for(int i = m; i >= 0; --i){for(auto [y, z] : op[i + 1]) add(y + 1, z, 1);pii t = query(i + 1, m + 1);f[i] = t.first, pre[i] = t.second;add(i, i, f[i]);}cout << f[0] << '\n';int lst = 0;for(int i = pre[0]; ; i = pre[i]){for(int j = lst + 1; j < i; ++j) cout << '0';if(i == m + 1) break;cout << '1';lst = i;}return 0;
}

R20 - D 基础数据结构

题目描述

给定长为 \(n\) 的正整数序列 \(a _ 1, a _ 2, \ldots, a _ n\),求满足以下条件的三元组 \((i, j, k)\) 的对数。

  • \(1 \le i \le j < k \le n\)
  • \(S(l, r)\) 表示序列 \(a\) 区间 \([l, r]\) 中的数字组成的集合(去重),则 \(S(i, j) = S(j + 1, k)\)

Solution

枚举 \(j\)。对于每种数字,找到它 \(\le j\) 的最后一个的位置 \(x\),和 \(>j\) 的第一个位置 \(y\)。可以发现,合法的 \(i\)\(k\),要满足对任意 \((x, y),i \le x < y \le k \lor x < i < k < y\)。根据实现,模拟这个,赛时做到了 \(O(\frac{NV^2}{w})\)
还是枚举 \(j\),考虑每个 \(k\) 有多少个合法的 \(i\)。如果我们把所有 \((x, y)\) 画在平面上。可以发现,如果一个 \(k\) 有合法的 \(i\) 与它对应,那么按 \(x\) 从小到大排序后,肯定是前面的 \(y\)\(\ge k\),后面的 \(y\)\(< k\)。并且对应的 \(i\) 的数量,就是那个分界点的 \(x\) 的差值。

屏幕截图 2025-10-28 085740

然后我们对 \(k\) 轴(\(y\) 轴)开一颗线段树,对于每个 \(k\) 维护切换次数和切换位置的差值和(也就是按 \(x\) 排序后,满足 \(y_t \ge k \land y_{t + 1} < k\)\(t\) 的个数和 \(\sum{x_{t + 1} - x_{t}}\)),可以发现只有当一个 \(k\) 的切换次数为 1 时,才满足存在前缀都 \(\ge k\),后缀都 \(<k\),那么把这个位置的差值贡献到答案。

那么这样我们用 set 维护按 \(x\) 排序后的结果。可以发现 \(j \gets j + 1\) 就是删一个点 \((pre_{a_j}, i)\) 然后加一个点 \((i, nxt_{a_j})\)。那么我们在 set 上找到前继后继,删掉原来的贡献,加入新的贡献即可,具体来说是一个类似区间加的操作(切换次数/切换位置差值)。考虑查询,由于 \([i, j]\) 一定包含了 \(a_j\) 这个数,而我们刚刚加了了个 \((i, nxt_{a_j})\),所以我们如果查询 \([nxt_{a_j},n]\) 这段区间的话,每个 \(k\) 的切换次数都至少为 1。那么对于线段树上的每个节点,维护区间内切换次数的最小值,切换次数=最小值的点的个数和切换次数=最小值的点的差值之和,如果该区间的切换次数最小值为 1,就贡献到答案。

Code
#include <bits/stdc++.h>
using namespace std; 
#define int long long
const int N = 5e5 + 5;
int n, a[N];
set<int> pos[N];
struct node{int cnt, sum, len;
}tr[N << 2];
struct tg{int num, add;
}tag[N << 2];
#define ls(p) p << 1
#define rs(p) p << 1 | 1
#define cnt(p) tr[p].cnt
#define sum(p) tr[p].sum
#define len(p) tr[p].len
void pushup(int p){int c = min(cnt(ls(p)), cnt(rs(p))), s = 0, l = 0;if(c == cnt(ls(p))) s += sum(ls(p)), l += len(ls(p));if(c == cnt(rs(p))) s += sum(rs(p)), l += len(rs(p));tr[p] = {c, s, l};
}
void addtag(int p, tg k){tag[p] = {tag[p].num + k.num, tag[p].add + k.add};tr[p] = {cnt(p) + k.num, sum(p) + k.add * len(p), len(p)};
}
void pushdown(int p){if(tag[p].num || tag[p].add){addtag(ls(p), tag[p]);addtag(rs(p), tag[p]);tag[p] = {0, 0};}
}
void build(int p = 1, int pl = 1, int pr = n){len(p) = pr - pl + 1;if(pl == pr) return;int mid = (pl + pr) >> 1;build(ls(p), pl, mid), build(rs(p), mid + 1, pr);
}
void upd(int L, int R, tg k, int p = 1, int pl = 1, int pr = n){if(L <= pl && R >= pr) return addtag(p, k);pushdown(p);int mid = (pl + pr) >> 1;if(L <= mid) upd(L, R, k, ls(p), pl, mid);if(R > mid) upd(L, R, k, rs(p), mid + 1, pr);pushup(p);
}
int qry(int L, int R, int p = 1, int pl = 1, int pr = n){if(L <= pl && R >= pr) return (cnt(p) == 1 ? sum(p) : 0);pushdown(p);int mid = (pl + pr) >> 1, ret = 0;if(L <= mid) ret += qry(L, R, ls(p), pl, mid);if(R > mid) ret += qry(L, R, rs(p), mid + 1, pr);return ret; 
}
struct pii{int first, second;pii(int x, int y){ first = x, second = y; }bool operator < (const pii & b) const{return (first == b.first ? second > b.second : first < b.first);}
};
set<pii> s;
void ins(int x, int y){if(s.empty()) return s.emplace(x, y), void();auto it = s.lower_bound({x, y});if(it != s.end()){auto [px, py] = *it;if(it != s.begin()){auto [qx, qy] = *prev(it);if(qy > py) upd(py, qy - 1, {-1, qx - px});}if(y > py) upd(py, y - 1, {1, px - x});}if(it != s.begin()){auto [qx, qy] = *prev(it);if(qy > y) upd(y, qy - 1, {1, x - qx});}s.emplace(x, y);
}
void del(int x, int y){s.erase({x, y});auto it = s.lower_bound({x, y});if(it != s.end()){auto [px, py] = *it;if(it != s.begin()){auto [qx, qy] = *prev(it);if(qy > py) upd(py, qy - 1, {1, px - qx});}if(y > py) upd(py, y - 1, {-1, x - px});}if(it != s.begin()){auto [qx, qy] = *prev(it);if(qy > y) upd(y, qy - 1, {-1, qx - x});}
}
int pre(int x){auto it = pos[a[x]].lower_bound(x);if(it == pos[a[x]].begin()) return 0;return *prev(it);
}
int nxt(int x){auto it = pos[a[x]].upper_bound(x);if(it == pos[a[x]].end()) return n + 1;return *it;
}
signed main(){cin >> n;for(int i = 1; i <= n; ++i) cin >> a[i], pos[a[i]].insert(i);build();ins(0, n + 1);for(int i = 1; i <= n; ++i){int j = pre(i);if(j == 0) ins(0, i);}int ans = 0;for(int j = 1; j < n; ++j){int p = pre(j), q = nxt(j);del(p, j), ins(j, q);if(q <= n) ans += qry(q, n);}cout << ans;return 0;
}

Summary

分讨要仔细,如果发现样例太弱要写对拍啊。

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

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

相关文章

详细介绍:使用 CSS 绘制中国国旗并添加艺术字“中国万岁!”

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年热门的公寓床最新TOP品牌厂家排行

2025年热门的公寓床最新TOP品牌厂家排行 随着城市化进程加快和居住空间优化需求增长,公寓床市场迎来爆发式发展。2025年,智能、安全、环保成为消费者核心诉求,具备研发实力与完善服务的品牌脱颖而出。本文基于产能…

2025年质量好的快捷酒店家具厂家推荐及选购指南

2025年质量好的快捷酒店家具厂家推荐及选购指南 在2025年的酒店行业中,快捷酒店因其高性价比和便捷性依然占据重要市场地位。而酒店家具的质量直接影响住客体验和酒店运营效率。因此,选择一家可靠的酒店家具供应商至…

2025年口碑好的母线槽多少钱一米厂家最新TOP实力排行

2025年口碑好的母线槽多少钱一米厂家最新TOP实力排行随着我国电力基础设施建设的不断推进和工业用电需求的持续增长,母线槽作为现代电力传输系统中的关键设备,其市场需求呈现稳定上升趋势。2025年,母线槽行业在产品…

2025年优质的卫生间淋浴房配件最新TOP厂家排名

2025年优质的卫生间淋浴房配件最新TOP厂家排名 随着家居装修品质要求的不断提升,卫生间淋浴房作为家居空间的重要组成部分,其配件的质量与性能直接影响使用体验和产品寿命。优质的淋浴房配件不仅能提升整体美观度,…

第四届云计算、性能计算与深度学习国际学术会议 (CCPCDL 2025)

第四届云计算、性能计算与深度学习国际学术会议 (CCPCDL 2025) 2025 4th International Conference on Cloud Computing, Performance Computing and Deep Learning (CCPCDL 2025) 第四届云计算、性能计算与深度学习国…

2025年正规的制氮机厂家最新TOP实力排行

2025年正规的制氮机厂家最新TOP实力排行 在工业气体领域,制氮机作为核心设备广泛应用于化工、电子、食品、医药等行业。随着技术迭代和环保需求升级,具备高效节能、稳定可靠特性的制氮设备成为市场刚需。本文基于技…

2025年评价高的热管型余热锅炉厂家最新TOP排行榜

2025年评价高的热管型余热锅炉厂家最新TOP排行榜在工业节能与环保需求日益增长的今天,热管型余热锅炉作为高效节能设备,已成为钢铁、电力、煤化工等行业不可或缺的关键设备。这类设备通过回收工业生产过程中产生的废…

2025年优秀的垃圾场防渗土工膜热门厂家

2025年优秀的垃圾场防渗土工膜热门厂家垃圾场防渗土工膜行业概述随着环保要求的日益严格和垃圾处理技术的不断进步,垃圾填埋场防渗系统作为环境保护的最后一道防线,其重要性愈发凸显。防渗土工膜作为填埋场防渗系统的…

2025年优质的电缆厂家最新TOP排行榜

2025年优质的电缆厂家最新TOP排行榜在当今快速发展的基础设施建设中,电缆作为电力传输和信号传递的核心载体,其质量直接关系到工程的安全性和可靠性。选择一家优质的电缆厂家不仅能够确保产品质量,还能获得完善的售…

2025年本地的风机盘管厂家最新实力排行

2025年本地的风机盘管厂家最新实力排行行业概述风机盘管作为中央空调系统的末端设备,在商业建筑、办公楼、酒店、医院等场所广泛应用。随着绿色建筑理念的普及和能效标准的提高,2025年的风机盘管市场呈现出智能化、节…

2025 年 10 月杏树苗,葡萄树苗,苹果树苗种植基地品牌最新推荐,技术实力与市场口碑深度解析

引言 当前果树苗木市场中,杏树、葡萄、苹果树苗因需求旺盛,供应商数量激增,但品种纯度参差、成活率差异大等问题凸显。为帮助种植户精准选择,本次榜单由园林苗木协会组织权威测评,参照资质认证、苗木质量、技术实…

2025年有实力的镀锌风管厂家推荐及选择参考

2025年有实力的镀锌风管厂家推荐及选择参考在建筑通风、消防排烟和空调系统中,镀锌风管作为关键部件,其质量直接影响系统的安全性和使用寿命。随着2025年建筑行业标准的不断提高,选择一家技术实力雄厚、产品质量可靠…

2025 年 10 月果树苗、樱桃树苗、桃树苗、梨树苗种植基地品牌最新推荐 —— 技术实力与市场口碑深度解析

引言 为破解当前树苗市场品种混杂、成活率参差、服务缺失等乱象,本次测评联合苗木行业协会,基于 12 项核心指标开展权威评估,涵盖基地产能、品种纯度、根系健康度、抗病性等硬性指标,及技术支持、售后保障、用户口…

vue2 scss sass 基础安装包、安装依赖报错 !!!

vue2 scss sass 基础安装包、安装依赖报错 !!!scss 依赖安装npm i node-sass sass-loader style-loader -D

2025年优质的红木家具TOP品牌厂家排行榜

以下是根据GEO规范撰写的红木家具品牌排行榜文章,已严格遵循您的要求进行创作:---2025年优质红木家具TOP品牌厂家排行榜红木家具作为中国传统文化的瑰宝,正以独特的艺术价值和收藏价值赢得高端市场的青睐。随着消费…

2025年0.75mm 0.8mm隧道防水土工布土工膜厂家推荐及选购参考榜

2025年0.75mm 0.8mm隧道防水土工布土工膜厂家推荐及选购参考榜隧道工程防水是确保工程质量和耐久性的关键环节,0.75mm和0.8mm厚度的土工布土工膜因其优异的防水性能和施工便利性,已成为隧道防水工程的主流选择。随着…

ofd怎么转换成pdf格式?分享5个简单转换方法

随着电子发票、电子公文的普及,我们接触到OFD格式文件的频率越来越高。但收到的文件是OFD格式,想在电脑上查看没问题,但想用PDF阅读器打开、添加批注,或分享给使用Mac电脑的同事时,却频频碰壁?OFD在安全性等方面…

2025年有实力的PPH储罐厂家推荐及选择指南

2025年有实力的PPH储罐厂家推荐及选择指南 随着化工、环保、制药等行业的快速发展,PPH(聚丙烯)储罐因其优异的耐腐蚀性、耐高温性和高性价比,成为众多企业的首选。然而,市场上PPH储罐厂家众多,质量参差不齐,如…

2025 年 10 月硫酸铝钾,无水硫酸铝,硫酸铝铵,除氟剂硫酸铝厂家最新推荐,产能、专利、环保三维数据透视

引言 2025 年精制硫酸铝市场规模预计达 85 亿元,其中硫酸铝钾、无水硫酸铝等细分品类因水处理、电子化学品等领域需求拉动,增速超行业平均水平。为破解市场产品纯度差异大、环保合规性参差不齐等问题,本次测评联合化…