『模拟赛』多校A层冲刺NOIP2024模拟赛06

news/2024/10/13 10:47:02
Rank

比较还行

image

image

A. 小 Z 的手套(gloves)

签。

最大值最小,一眼二分答案。双指针 check 一下就完了,复杂度 \(\mathcal{O(n\log n)}\)

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch = getchar();lx x = 0 , f = 1;for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 1e5 + 5;
const int mod = 10007;
int n, m;
int a[N], b[N];
namespace Wisadel
{bool Wck(int x){int j = 1;fo(i, 1, n){while(j <= m && abs(a[i] - b[j]) > x) j++;if(j > m) return 0;j++;}return 1;}short main(){freopen("gloves.in", "r", stdin) , freopen("gloves.out", "w", stdout);// freopen(".err", "w", stderr);n = qr, m = qr;fo(i, 1, n) a[i] = qr; sort(a + 1, a + 1 + n);fo(i, 1, m) b[i] = qr; sort(b + 1, b + 1 + m);if(n > m){fo(i, 1, n) swap(a[i], b[i]);swap(n, m);}int l = 0, r = 1e9;while(l < r){int mid = (l + r) >> 1;if(Wck(mid)) r = mid;else l = mid + 1;}printf("%d\n", r);return Ratio;}
}
int main(){return Wisadel::main();}

B. 小 Z 的字符串(string)

分讨 dp。

赛时考虑了很久贪心做法,一直没有简单易行的方案,于是想了 dp,但没思路,于是交了假做法 50pts。

正解考虑设 \(f_{i,j,k,0/1/2}\) 表示目前 \(i\) 个 0,\(j\) 个 1,\(k\) 个 2,第 \(i+j+k\) 位为 0/1/2 的方案数。首先特判出不合法的情况,然后直接 dp 就完了,转移限制条件即为当前位与上一位不同,为方便统计坐标差,最后 \(\min\left(f_{num_0,num_1,num_2,0/1/2}\right)\) 除以 2 就是最终答案。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch = getchar();lx x = 0 , f = 1;for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 5e4 + 5;
const int mod = 10007;
int n;
int num[3], q[3][405], f[205][205][205][3];
string s;
namespace Wisadel
{short main(){freopen("string.in", "r", stdin) , freopen("string.out", "w", stdout);// freopen(".err", "w", stderr);cin >> s;n = s.size(); s = " " + s;fo(i, 1, n)if(s[i] == '0') num[0]++, q[0][num[0]] = i;else if(s[i] == '1') num[1]++, q[1][num[1]] = i;else num[2]++, q[2][num[2]] = i;int zc = (n + 1) / 2;if(num[0] > zc || num[1] > zc || num[2] > zc){puts("-1"); return Ratio;}memset(f, 0x3f, sizeof f);f[0][0][0][0] = f[0][0][0][1] = f[0][0][0][2] = 0;fo(i, 0, num[0]) fo(j, 0, num[1]) fo(k, 0, num[2]){int zc = i + j + k;if(i) f[i][j][k][0] = min(f[i - 1][j][k][1], f[i - 1][j][k][2]) + abs(zc - q[0][i]);if(j) f[i][j][k][1] = min(f[i][j - 1][k][0], f[i][j - 1][k][2]) + abs(zc - q[1][j]);if(k) f[i][j][k][2] = min(f[i][j][k - 1][0], f[i][j][k - 1][1]) + abs(zc - q[2][k]); }int ans = 1e9;fo(i, 0, 2) ans = min(ans, f[num[0]][num[1]][num[2]][i]);ans /= 2;printf("%d\n", ans);return Ratio;}
}
int main(){return Wisadel::main();}

C. 一个真实的故事(truth)

我赛时 A 线段树啦! 被 hack 了,悲(

看到修改查询首先考虑线段树。赛时思路被 T2 略微干扰了下于是考虑记 \(nxt_{i,j}\)\(i\) 位置下一个 \(j\) 种类的坐标,答案为 \(\min\left(\max_{i\in\left[1,n\right]\left(nxt_{i,j}\right)}\right)\),线段树统计答案是 \(\mathcal{O(1)}\) 的,但是修改操作很困难,主要是无法实现动态处理 \(nxt\) 数组,赛时尝试自我 hack 但是失败了,最慢跑了 0.5s。

考虑正解是如何优化的,改为记每个区间所有种类最靠左和最靠右的位置,pushup 时答案只会从 \(ans_{ls}\)\(ans_{rs}\) 和左区间靠右、右区间靠左的所有种类合并出的答案。合并时取出上述至多 \(2\times k\) 个位置,然后双指针找出最小答案即可,合并其它信息比较简单。然后就做完了,\(\mathcal{O(\log n)}\) 修改 \(\mathcal{O(1)}\) 查询,带一个 \(k\) 的常数。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch = getchar();lx x = 0 , f = 1;for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 5e4 + 5;
const int mod = 10007;
int n, k, m;
int a[N];
int las[N << 2], Lt[N << 2][31], Rt[N << 2][31], cnt[31], ans[N << 2];
namespace Wisadel
{#define ls (rt << 1)#define rs (rt << 1 | 1)#define mid ((l + r) >> 1)void Wpushup(int rt){int res = 1e9, ok = 0; memset(cnt, 0, sizeof cnt);pii zc[2 * k + 1]; int zcz = 0;fo(i, 1, k) if(Rt[ls][i]) zc[++zcz] = {Rt[ls][i], i};fo(i, 1, k) if(Lt[rs][i]) zc[++zcz] = {Lt[rs][i], i};sort(zc + 1, zc + zcz + 1, [](pii &x, pii &y){return x.fi < y.fi;});int j = 1;fo(i, 1, zcz){if(j < i) j = i;while(j <= zcz && ok < k){if(!cnt[zc[j].se]) ok++;++cnt[zc[j].se]; ++j;}if(ok == k) res = min(res, zc[j - 1].fi - zc[i].fi + 1);cnt[zc[i].se]--;if(!cnt[zc[i].se]) ok--;}if(res != 1e9) ans[rt] = res;if(ans[ls]) ans[rt] = min(ans[rt], ans[ls]);if(ans[rs]) ans[rt] = min(ans[rt], ans[rs]);fo(i, 1, k){if(Lt[ls][i]) Lt[rt][i] = Lt[ls][i];else Lt[rt][i] = Lt[rs][i];if(Rt[rs][i]) Rt[rt][i] = Rt[rs][i];else Rt[rt][i] = Rt[ls][i];}}void Wbuild(int rt, int l, int r){ans[rt] = 1e9;if(l == r){Lt[rt][a[l]] = Rt[rt][a[l]] = l;las[rt] = a[l];return ;}Wbuild(ls, l, mid), Wbuild(rs, mid + 1, r);Wpushup(rt);}void Wupd(int rt, int l, int r, int x, int v){ans[rt] = 1e9;if(l == r){Lt[rt][las[rt]] = Rt[rt][las[rt]] = 0;Lt[rt][v] = Rt[rt][v] = x;las[rt] = v;return ;}if(x <= mid) Wupd(ls, l, mid, x, v);else Wupd(rs, mid + 1, r, x, v);Wpushup(rt);}short main(){freopen("truth.in", "r", stdin) , freopen("truth.out", "w", stdout);// freopen(".err", "w", stderr);n = qr, k = qr, m = qr;fo(i, 1, n) a[i] = qr;Wbuild(1, 1, n);fo(i, 1, m){int op = qr, x, y;if(op == 1) x = qr, y = qr, Wupd(1, 1, n, x, y);else printf("%d\n", ans[1] == 1e9 ? -1 : ans[1]);}return Ratio;}
}
int main(){return Wisadel::main();}

D. 异或区间(xor)

trie 树和静态 RMQ,要用到笛卡尔树优化,仙姑。

由于一些原因导致现在才发。

打的还行,可能是前一天的动员产生了一点作用。

总是场切不了 T2 有点恼,总是 T3 打假做法有点恼,总是不会 T4 很多暴力有点恼。

起码在进步,稳住就行。

你说得对但我去的时候是 5 车厢,有一块的吗。


完结撒花~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

超级干货!Air780E的串口通信分享

​猛然发现,Air780E的串口通信还没分享,难怪已经有小伙伴提出了要求! 那我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧! 一、硬件准备 ​780E开发板一套,包括天线、USB数据线。USB转TTL工具或线(例如ch340、ft232)PC电脑,串口调试工具(例如…

Air201资产定位模组LuatOS:录音播放录音功能的操作方法

​一直有小伙伴们问,迷你小巧的合宙Air201虽然有很多优点,超低功耗、精准定位,那么它是否支持录音、播放录音功能?那必须能!高集成化设计的Air201自带了ES8311音频解码芯片(Audio Codec)及MIC麦克,可支持本地的录音功能;使用配套喇叭即可将录音保存的数据进行播放,操…

手搓党分享:用Air700E开发板+毫米波雷达,搓一个睡眠监测仪!

​只能说,看到这个大佬分享的睡眠监测仪,手上的手环瞬间不香了。。。 用Air700E开发板+毫米波雷达,手搓一个开箱即用的睡眠监测仪,不花冤枉钱!一、项目原理及硬件制作毫米波是指频率范围从30-300GHz的电磁波,它的波长很短,雷达发射的毫米波会随人体反射回来,同时人体微…

记录工作开发日常遇到的问题点-css字体

data.forEach((item, index) => { style +=@font-face {font-family: FileType${index};src: url(${item.FileUrl}) format(truetype);} ht +=` });$(head).append($(<style>).text(style));//插入到head后面$(#fontFamilyContent).html(ht)$(…

手撸二叉树——二叉查找树

二叉树是数据结构中非常重要的一种数据结构,它是树的一种。二叉树是数据结构中非常重要的一种数据结构,它是树的一种,但是每个节点的子节点不能多余两个,可以是0,1,2个子节点,0个子节点代表没有子节点。常见的二叉树结构如下图所示:每个节点的子节点不多于2个,其中3,…

煤矿皮带运输智能监控系统

煤矿皮带运输智能监控系统基于视频AI图像识别算法,煤矿皮带运输智能监控系统通过实时监测皮带运输过程中的各种异常情况,如跑偏、撕裂、堆料异常等,实现对运输过程的智能监控。煤矿皮带运输智能监控系统一旦检测到异常情况,立即发出告警并采取相应的措施,以保障运输安全。…

2024-2025-1《计算机基础与程序设计》第3周学习总结20241428张雄一

学期(如2024-2025-1) 学号(如:20241300) 《计算机基础与程序设计》第X周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(https://www.cnblogs.com/rocedu/p/9577842.html#WE…

パナソニックグループ プログラミングコンテスト2024(ABC 375)

形象理解这一场的 CA.Seats \(\text{diff }20\)对给定序列 \(S\) 找出 \(i\) 的个数,使得 \(S_{i}=0,S_{i+1}=1,S_{i+2}=0\)#define int long long string x;signed main(){int n;cin>>n;cin>>x;int ans=0;for(int i=0;i<=(int)x.length()-3;++i){if(x[i]==# an…