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

news/2024/10/21 21:30:32
Rank

原来不止我一个人在赤石

Upd:T2 数据多次更改,Rank 变化 4→2→4

image

A. 岛屿

唐氏题。

赛时找规律+分讨+递推出了正解,时间不够没测直接交了,然后 long double 用了 %lf 直接寄掉。赛时思路很复杂啊,讨论了一大堆,发现其实合并起来就是题解的做法(?)。

初始图中一共分为两种,同色相连和异色相连。考虑五种情况得出递推式:红同接蓝同,\(f_{i,j}=f_{i-1,j+1}\);红同/蓝同 接异,\(f_{i,j}=f_{i,j-1}\);异接异,首尾接,\(f_{i,j}=f_{i,j-1}+1\);接不同的异,\(f_{i,j}=f_{i,j-1}\)。根据数量得出概率,最后发现同色和异色的贡献互不干扰,可以分别求,然后 \(\mathcal{O(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()
{lx x = 0, f = 1; char ch = getchar();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 fi first
#define se second
#define pii pair<int, int>
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
#define qr qr()
const int Ratio = 0;
const int N = 2e5 + 5;
int n, x, y;
namespace Wisadel
{short main(){freopen("island.in", "r", stdin) , freopen("island.out", "w", stdout);x = qr, y = qr;n = 2 * x + y;long double ans = 0;fo(i, 1, x) ans += (long double)1.0 / (i * 2 - 1);fo(i, 1, y) ans += (long double)1.0 / (i + x * 2);printf("%.10Lf\n", ans);return Ratio;}
}
int main(){return Wisadel::main();}

B. 最短路

最签的了。最短路树,没看出来,打了个不知道什么做法,不怕重边,不知道怕什么,分数 80 → 88 → 76pts。

这么一想好像就是最短路树板子,题目还贴心地给了保证最短路唯一。那么考虑求一个点删去最后一条边后的最短路,应该从该点的子树内找到一点与子树外的一点,此时最短路为 \(dis_u+dis_v+w_{u,v}-dis_x\),那么我们只需要找到所有的边 \(u,v\) 并按 \(dis_u+dis_v+w_{u,v}\) 升序排序即可。

对有没有重边比较有争议。如果有只需要在找边时判一下就行了,没啥太要注意的,复杂度大概是 \(\mathcal{O(n\log n+m\log m)}\) 的。

点击查看代码
#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()
{lx x = 0, f = 1; char ch = getchar();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 pii pair<int, int>
#define fi first
#define se second
#define qr qr()
const int Ratio = 0;
const int N = 2e5 + 5;
int n, m, tot;
int hh[N], to[N << 1], ne[N << 1], cnt;
int fx[N], dep[N], fa[N];
ll dis[N], ans[N], w[N << 1];
bool yz[N], vis[N << 1];
struct rmm
{int u; ll w;bool operator < (const rmm &A) const{return A.w < w;}
};
struct edge{int u, v; ll val;} e[N];
namespace Wisadel
{int Wfind(int x){if(x == fx[x]) return x;return fx[x] = Wfind(fx[x]);}void Wadd(int u, int v, int val){to[++cnt] = v;w[cnt] = val;ne[cnt] = hh[u];hh[u] = cnt;}void Wdij(int x){priority_queue<rmm> q;memset(dis, 0x3f, sizeof dis);dis[x] = 0;q.push({x, dis[x]});while(q.size()){int u = q.top().u; q.pop();if(yz[u]) continue;yz[u] = 1;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i];if(dis[v] > dis[u] + w[i]){vis[i] = vis[i ^ 1] = 1;fa[v] = u, dep[v] = dep[u] + 1;dis[v] = dis[u] + w[i];q.push({v, dis[v]});}}}}short main(){freopen("path.in", "r", stdin) , freopen("path.out", "w", stdout);n = qr, m = qr;cnt = -1;memset(hh, -1, sizeof hh);fo(i, 1, m){int a = qr, b = qr, c = qr;Wadd(a, b, c), Wadd(b, a, c);}Wdij(1);fo(u, 1, n){fx[u] = u, ans[u] = 1e18;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i]; ll val = w[i];if((!vis[i] || (fa[u] != v && fa[v] != u)) && u < v)e[++tot] = {u, v, val};}}sort(e + 1, e + 1 + tot, [](edge &A, edge &B){return dis[A.u] + dis[A.v] + A.val < dis[B.u] + dis[B.v] + B.val;});fo(i, 1, tot){int u = e[i].u, v = e[i].v;ll zc = dis[u] + dis[v] + e[i].val;int _ = Wfind(u), __ = Wfind(v);while(_ != __){if(dep[_] < dep[__]) swap(_, __);ans[_] = zc - dis[_];fx[_] = fa[_];_ = Wfind(_);}}fo(i, 2, n) printf("%lld\n", ans[i] == 1e18 ? -1 : ans[i]);return Ratio;}
}
int main(){return Wisadel::main();}

C. 列表

byd 为什么不让我们听多校讨论?

考虑对于原长度为 \(m=2\times n +1\) 的序列中每一个元素可能加入集合 \(S\) 的时间。简单手模就能发现,每个点从第 \(|x-(n+1)|\) 轮开始到最后 \(n+1\) 轮都可以加入,实质上是一个后缀。这道题每个右端点对应的左端点显然是单调的,我们双指针枚举连续值域端点,问题就转化为了判断这些点能否全部加入集合内,结合上面的后缀思路,也就转化为了一个匹配问题,线段树维护 hall 定理即可。

大致做法是,在后缀域上建线段树,维护每个区间当前长度和区间内点的个数,合法当且仅当区间的长度减去子集后缀点数大于 0。

复杂度 \(\mathcal{O(n\log n)}\)。记得线段树范围是 \(\left[1,n+1\right]\)

点击查看代码
#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()
{lx x = 0, f = 1; char ch = getchar();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 pii pair<int, int>
#define fi first
#define se second
#define qr qr()
const int Ratio = 0;
const int N = 4e5 + 5;
int n, m, ans = 1;
int a[N], p[N];
int las[N << 2], use[N << 2];
namespace Wisadel
{#define ls (rt << 1)#define rs (rt << 1 | 1)#define mid ((l + r) >> 1)void Wpushup(int rt){use[rt] = use[ls] + use[rs];las[rt] = min(las[ls], las[rs] - use[ls]);}void Wbuild(int rt, int l, int r){if(l == r){las[rt] = l;return ;}Wbuild(ls, l, mid), Wbuild(rs, mid + 1, r);Wpushup(rt);}void Wupd(int rt, int l, int r, int x, int k){if(l == r){las[rt] -= k, use[rt] += k;return ;}if(x <= mid) Wupd(ls, l, mid, x, k);else Wupd(rs, mid + 1, r, x, k);Wpushup(rt);}short main(){freopen("list.in", "r", stdin) , freopen("list.out", "w", stdout);n = qr;m = 2 * n + 1;fo(i, 1, m) a[i] = qr, p[a[i]] = min(i, m - i + 1);Wbuild(1, 1, n + 1);int l = 1;fo(r, 1, m){Wupd(1, 1, n + 1, p[r], 1);while(las[1] < 0) Wupd(1, 1, n + 1, p[l++], -1);ans = max(ans, r - l + 1);}printf("%d\n", ans);return Ratio;}
}
int main(){return Wisadel::main();}

D. 种植

难难题。

送了 45pts。十分爆搜,复杂度 \(\mathcal{O(2^n\times n^2)}\);35pts 性质,比较一眼,必须斜着摆满才合法。

正解咕咕先。

赤石局,赤爽乐。

开局 T1 不会,T2 不确定,T3 不会,T4 有点会但不会实现,然后几乎都在坐牢。

下午在赤 T3,唐氏消费股不给放多校讨论导致一直没往 hall 定理上想(虽然我刚知道

还有两场就要 CSP 了,加油!


完结撒花~

银狼助你一切问题迎刃而解。

image

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

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

相关文章

单射,满射和双射区分

单射: 定义:函数F称为一对一的,当且仅当对于F定义域中的所有x和y,f(x)=f(y)蕴含着x=y。一对一函数也称单射函数或入射函数1.x一定都要连接,不连接则不是函数 2.y只能有一个连接,可以为空但是不能有多个 错误情况:满射 定义:给定函数F:x→y,当且仅当对∀y∈Y,都有x∈X…

20240917【省选】模拟

难说 T1 暴力可以写dp 只要你学过线性基那么你就会想怎么用线性基做,显然是要套点数据结构维护的。你要知道两个线性基可以在 \(O(\log^2 n)\) 的时间内合并,得到的线性基是原来两个的交。可以用线段树维护,复杂度 \(O((n+q)\log n\log^2 a)\),难说能不能过。 没有修改,所…

高级语言程序设计课程第四次个人作业

班级:https://edu.cnblogs.com/campus/fzu/2024C 作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13293 学号:102400118 姓名:林嘉祚 6.16.16.16.56.16.76.16.86.16.96.16.106.16.126.16.136.16.156.16.166.16.187.12.17.12.27.12.47.12.57.12.67.12.77.12.87.12.97…

2024Ciscn总决赛Web Writeup

前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require(express); const ejs=require(ejs) const session = require(express-session); const bodyParse = require(body-parser); const multer =…

C# 新建的类库无法添加 System.Drawing 引用问题

C#类库添加System.Drawing引用时,选择程序集 -> 框架 -> 再搜索对应的库,添加引用就可以了。不要在COM中搜索。

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告 1.实验内容 1.1 本周学习内容 1.1.1 后门介绍后门概念:不经过正常认证流程而访问系统的通道 后门类型:编译器、操作系统、应用程序中的后门,潜伏于OS或伪装成APP的后门程序1.1.2 后门案例编译器后门:Xcode 操作…

tms fnc ui

tms fnc uitms fnc ui 这组界面控件,支持DELPHI的VCL和FMX,还支持FPC的LCL。 1)TTMSFNCNavigationPanel2)TTMSFNCTileList3)本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18490245

第6课 测试用例设计

1.黑盒测试方法2.白盒测试方法术语一: • 动态测试(dynamic testing):通过运行软件的组 件或 系统来测试软件 • 静态测试(static testing):对组件的规格说明书 进行 评审,对静态代码进行走查 • 正式评审(formal review):对评审过程及需求文 档的 一种特定评审 • …