『模拟赛』多校A层冲刺NOIP2024模拟赛06(更新 T4)

news/2024/10/13 15:00:16
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,要用到笛卡尔树优化,仙姑。

什么笛卡尔树,不用,这里讲解可持久化 trie 树的做法。

思路起源于 Subtask3,即最大值位置已知的情况。此时构建出 01trie,边插边查询即可。因此考虑每一位作为最大值的管辖范围,由于会有重复的数所以要钦定一端开一段闭,单调栈即可线性实现。然后怎么跑?直接枚举一端端点统计另一端容易被卡成 \(\mathcal{O(n)}\) 统计,所以判断一下,每次枚举较短的一边即可。区间统计所以上可持久化 trie。复杂度是 \(\mathcal{O(n\log n\log V)}\) 的。

点击查看代码
#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;
int n;
int a[N], s[N];
int rot[N], L[N], R[N], tot;
stack<int> st;
int t[N << 5][2], sum[N << 5];
ll ans;
namespace Wisadel
{int Wbuild(int las, int s){int rt = ++tot, now = rt;sum[now] = sum[las] + 1;fo(i, 1, 30){int zc = (s >> (30 - i)) & 1;t[now][zc] = ++tot;t[now][!zc] = t[las][!zc];now = t[now][zc];las = t[las][zc];sum[now] = sum[las] + 1;}return rt;}int Wq(int x, int y, int a, int s){int res = 0;fo(i, 1, 30){// 如果 a 在这一位为 1,那么直接加上为 0 时的贡献int zc1 = (a >> (30 - i)) & 1, zc2 = (s >> (30 - i)) & 1;if(zc1) res += sum[t[y][zc2]] - sum[t[x][zc2]];x = t[x][zc1 ^ zc2], y = t[y][zc1 ^ zc2];}res += sum[y] - sum[x];return res;}short main(){freopen("xor.in", "r", stdin) , freopen("xor.out", "w", stdout);// freopen(".err", "w", stderr);n = qr;rot[0] = Wbuild(rot[0], 0);fo(i, 1, n) a[i] = qr, s[i] = s[i - 1] ^ a[i], rot[i] = Wbuild(rot[i - 1], s[i]);fo(i, 1, n){while(st.size() && a[st.top()] <= a[i]) st.pop();L[i] = st.size() ? st.top() : 0;st.push(i);}while(st.size()) st.pop();fu(i, n, 1){while(st.size() && a[st.top()] < a[i]) st.pop();R[i] = st.size() ? st.top() : n + 1;st.push(i);} // 单调栈找以 i 为最大值的管辖范围fo(i, 1, n)if(i - L[i] <= R[i] - i) // 枚举较短的一边fo(j, L[i], i - 1) ans += Wq(rot[i - 1], rot[R[i] - 1], a[i], s[j]);elsefu(j, R[i] - 1, i)if(L[i] == 0) ans += Wq(0, rot[i - 1], a[i], s[j]);else ans += Wq(rot[L[i] - 1], rot[i - 1], a[i], s[j]);printf("%lld\n", ans);return Ratio;}
}
int main(){return Wisadel::main();}

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

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

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

起码在进步,稳住就行。

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


完结撒花~

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

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

相关文章

Grafana学习笔记1

安装 Grafana容器镜像拉取 docker pull grafana/grafana启用Grafana容器 命名为Grafa,再把主机端口3000映射到容器端口3000,把主机上的目录/path/to/your/grafana/data(这个路径自己定义)挂载到容器内的目录/var/lib/grafana,设置管理员密码为admin,使用已经拉取的镜像grafan…

4.漏洞挖掘(长期)

具体漏洞复现,见奇安信攻防社区的帖子。 国庆假期,试挖漏洞算是揭开的漏洞挖掘的面纱。第一个练手的漏洞是敏感信息漏洞。一开始,手工查找,google搜索,后来在chatGPTd 帮助下,学习研究脚本进行扫描。 但现在了,脚本不太好研究下去了,并且没太大兴趣继续,感觉太low了,…

Mysql(1)—简介及Windows环境下载安装

MySQL是一个流行的关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)进行操作。MySQL由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终成为Oracle公司的产品。它是最广泛使用的开源数据库之一,通常用于Web应用程序、数据仓库和企业应用。Mysql(1)—简介及…

linux练习题(二)

习题练习前预备知识(如下图):## linux练习题(二)习题以及参考答案 1、将/etc/passwd 拷贝到/home下并更名为test。cp /etc/passwd /home/test 2、在/tmp下建立test1到test9父子级目录,mkdir -p /tmp/test1/test2/test3/test4/test5/test6/test7/test8/test9 如果说该条命…

JAVA环境配置

JAVA开发环境配置 1.去官网下载JDK 找到对应的电脑版本进行安装,记住安装位置 2.安装完成后进入我的电脑-属性-高级系统设置-环境变量,点击系统变量下的新建,变量名必须为JAVA_HOME,变量值就是你刚刚的安装路径3.接着在系统变量中找到Path双击,新建如下两个,如图所示如果…

关于使用plsql操作oracle的一点小技巧和几个常用的查询语句BU

plsql是什么:就是这个,专门操作oracle的一个工具,好用还免费。 创建一个测试表: create table Student( Id number not null, Name varchar(20), Age number, Grade number, Gender varchar(2) )里面的varchar2()是oracle自己专门的字符类型,用就行了。 光标移到表上,右键…

OpenAI官方开源多智能体框架「Swarm」,并不是我想要的多智能体框架PI

今天早上,OpenAI实施团队的 @shyamal在Github上开源了Swarm这个OpenAI官方的多智能体框架。不得不说,OpenAI官方下场,获得的社区影响就是不一样,在微信群、朋友圈里已经出现大量的解析文章。这个多智能体框架确实已经把多智能体的关键,说的很透彻了,Swarm 里面定义了两个…

【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的证书Hq

问题描述 当根据Cloud Service (Extended Support) 文档更新证书 ( https://docs.azure.cn/zh-cn/cloud-services-extended-support/certificates-and-key-vault )时,如果遇见旧的证书(如中间证书,根证书)信息保存在Key Vault Secret中,而更新的时候,只能从Key Vault证书中…