[赛记] 多校A层冲刺NOIP2024模拟赛21

news/2024/11/14 12:21:29/文章来源:https://www.cnblogs.com/PeppaEvenPig/p/18542990

送信卒 100pts

直接上小数二分答案,然后check的时候跑dij,就没了;

点击查看代码
#include <iostream>
#include <cstdio>
#include <queue>
#include <iomanip>
using namespace std;
int n, m;
int sx, sy, tx, ty;
int a[505][505];
double s;
int id(int x, int y) {return (x - 1) * m + y;
}
struct sss{int t, ne;double w;
}e[500005];
int h[500005], cnt;
void add(int u, int v, double ww) {e[++cnt].t = v;e[cnt].ne = h[u];h[u] = cnt;e[cnt].w = ww;
}
double dis[500005];
bool vis[500005];
void dij(int x) {for (int i = 1; i <= n * m; i++) {dis[i] = 999999999.999999999;vis[i] = false;}priority_queue<pair<double, int>, vector<pair<double, int> >, greater<pair<double, int> > > q;while(!q.empty()) q.pop();q.push({0.0, x});dis[x] = 0.0;while(!q.empty()) {int t = q.top().second;q.pop();if (vis[t]) continue;vis[t] = true;for (int i = h[t]; i; i = e[i].ne) {int u = e[i].t;if (dis[u] > dis[t] + e[i].w) {dis[u] = dis[t] + e[i].w;q.push({dis[u], u});}}}
}
bool ck(double x) {for (int i = 1; i <= n * m; i++) h[i] = 0;cnt = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (a[i][j] == 1) continue;if (j + 1 <= m && a[i][j + 1] != 1) {add(id(i, j), id(i, j + 1), 1);add(id(i, j + 1), id(i, j), 1);}if (i + 1 <= n && a[i + 1][j] != 1) {add(id(i, j), id(i + 1, j), x);add(id(i + 1, j), id(i, j), x);}}}dij(id(sx, sy));if (dis[id(tx, ty)] < s) return false;else return true;
}
int main() {freopen("msg.in", "r", stdin);freopen("msg.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;cin >> sx >> sy >> tx >> ty;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];}}cin >> s;double l = 0.0;double r = s;double ans = 0.0;while(r - l >= 1e-5) {double mid = (l + r) / 2;if (ck(mid)) {ans = mid;r = mid;} else {l = mid;}}cout << fixed << setprecision(3) << ans;return 0;
}

共轭树图 32pts

赛时不会,所以打了暴力和一个特殊性质32pts;

考虑正解,一般像这种题都是DP;

首先挖掘题目性质,发现选出来的图 $ G $ 中的边在原图中不会出现相交的情况,所以我们可以考虑DP,然后就不会了

上面的是题解做法,但题解写的太CD了看不懂,所以学了学HDK的搜;

我们发现,图 $ G $ 不同可以是当它上面相同的点的深度不同;

所以我们依据这个可以写搜,终止条件是叶子节点的方案数为 $ 1 $,然后每次用乘法原理和加法原理统计一下答案即可;

时间复杂度:$ \Theta(n^3) $,但是发现后面的加法原理可以前缀和优化一下,所以时间复杂度 $ \Theta(n^2) $;

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const long long mod = 998244353;
int n;
vector<int> v[3005];
int x[5005], y[5005];
long long f[3005][3005];
int fa[5005];
long long ans;
void afs(int x, int f) {fa[x] = f;for (int i = 0; i < v[x].size(); i++) {int u = v[x][i];if (u == f) continue;afs(u, x);}
}
long long dfs(int now, int ldep) {if (v[now].size() == 1) {return f[now][ldep] = ldep;}if (f[now][ldep] != -1) return f[now][ldep];long long sum = 0;if (ldep > 1) {sum = (sum + dfs(now, ldep - 1)) % mod;}int ret = 1;for (int i = 0; i < v[now].size(); i++) {int u = v[now][i];if (u == fa[now]) continue;ret = ret * dfs(u, ldep + 1) % mod;}return f[now][ldep] = (ret + sum) % mod;
}
int main() {freopen("reflection.in", "r", stdin);freopen("reflection.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n - 1; i++) {cin >> x[i] >> y[i];v[x[i]].push_back(y[i]);v[y[i]].push_back(x[i]);}afs(n, 0);memset(f, -1, sizeof(f));long long ans = 1;for (int i = 0; i < v[n].size(); i++) {int u = v[n][i];ans = ans * dfs(u, 1) % mod;}cout << ans;return 0;
}

摸鱼军训 20pts

直接询问离线 + 暴力模拟20pts;

考虑正解,我们不难发现,对于一个询问 $ (k, x) $ ,如果一个数 $ x $ 的前面比他大的数大于等于 $ k $ 个,那这个数每次只会向前移动 $ 1 $ 次,所以一共向前移动 $ k $ 次,直接输出答案即可;

考虑前面的数小于 $ k $ 咋做,我们不妨记 $ pre_i $ 表示数值 $ i $ 所对应的位置前面有多少比 $ i $ 大的数,那么对于现在来说所有 $ pre_i < k $ 的数都会往前移,并且这些数所对应的子序列形成了一个有序排列

那么我们不妨记一个数为 $ 1 $ 表示这个数的 $ pre \geq k $ ,$ 0 $ 表示 $ pre < k $,所以我们只需找出这个数后面的第它的排名个 $ 0 $,然后减去 $ k $ 即可;

具体实现上,我们将询问离线,因为我们要用 $ pre < k $ 的数,所以将询问按 $ k $ 升序排序,然后动态插入 $ pre < k $ 的数,这个可以将原数列按 $ pre $ 升序排序后单指针维护;

还要支持查询一个数在现在出现过的数中的排名,这个可以用树状数组维护;

还要支持查询一个数列中第 $ k $ 个 $ 0 $ 的位置,这个可以用线段树维护;

注意线段树可以开两倍空间,$ [1, n] $ 初始全部为 $ 1 $ ,$ [n + 1, 2n] $ 初始全部为 $ 0 $,然后动态插入 $ 0 $ 即可,这样便利了后面的查询;

时间复杂度:$ \Theta(n \log n) $;

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int a[500005];
struct sss{int k, x, id;
}d[500005];
int ans[500005], pre[500005], pos[500005];
bool cmpk(sss x, sss y) {return x.k < y.k;
}
int b[500005];
bool cmp(int x, int y) {return pre[x] < pre[y];
}
namespace BIT{inline int lowbit(int x) {return x & (-x);}int tr[500005];void add(int pos, int d) {for (int i = pos; i <= n; i += lowbit(i)) tr[i] += d;}int ask(int pos) {int ans = 0;for (int i = pos; i; i -= lowbit(i)) ans += tr[i];return ans;}
}
namespace SEG{inline int ls(int x) {return x << 1;}inline int rs(int x) {return x << 1 | 1;}struct sss{int l, r, sum;}tr[5000005];inline void push_up(int id) {tr[id].sum = tr[ls(id)].sum + tr[rs(id)].sum;}void bt(int id, int l, int r) {tr[id].l = l;tr[id].r = r;if (l == r) return;int mid = (l + r) >> 1;bt(ls(id), l, mid);bt(rs(id), mid + 1, r);}void add(int id, int pos, int d) {if (tr[id].l == tr[id].r) {tr[id].sum = d;return;}int mid = (tr[id].l + tr[id].r) >> 1;if (pos <= mid) add(ls(id), pos, d);else add(rs(id), pos, d);push_up(id);}int ask(int id, int l, int r) {if (l > r) return 0;if (tr[id].l >= l && tr[id].r <= r) {return tr[id].sum;}int mid = (tr[id].l + tr[id].r) >> 1;if (r <= mid) return ask(ls(id), l, r);else if (l > mid) return ask(rs(id), l, r);else return ask(ls(id), l, mid) + ask(rs(id), mid + 1, r);}int ask_po(int id, int sum) {if (tr[id].l == tr[id].r) return tr[id].l;if (sum <= tr[ls(id)].sum) return ask_po(ls(id), sum);else return ask_po(rs(id), sum - tr[ls(id)].sum);}
}
int main() {freopen("bubble.in", "r", stdin);freopen("bubble.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];pre[a[i]] = BIT::ask(n) - BIT::ask(a[i]);pos[a[i]] = i;BIT::add(a[i], 1);}SEG::bt(1, 1, 2 * n);for (int i = 1; i <= n; i++) {SEG::add(1, i + n, 1);}for (int i = 1; i <= n; i++) b[i] = i;sort(b + 1, b + 1 + n, cmp);for (int i = 1; i <= n; i++) BIT::tr[i] = 0;cin >> m;for (int i = 1; i <= m; i++) {cin >> d[i].k >> d[i].x;d[i].id = i;}sort(d + 1, d + 1 + m, cmpk);int now = 1;for (int i = 1; i <= m; i++) {while(now <= n && pre[b[now]] < d[i].k) {SEG::add(1, pos[b[now]], 1);BIT::add(b[now], 1);now++;}if (pre[d[i].x] >= d[i].k) {ans[d[i].id] = pos[d[i].x] - d[i].k;continue;}int sum = SEG::ask(1, 1, d[i].k);int po = SEG::ask_po(1, BIT::ask(d[i].x - 1) + 1 + sum);ans[d[i].id] = po - d[i].k;}for (int i = 1; i <= m; i++) cout << ans[i] << '\n';return 0;
}

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

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

相关文章

NOIP2024 前集训:多校A层冲刺NOIP2024模拟赛20

前言rk 历程:\(11\to 9\to 8\to 7\),原因是部分人的 T1 假做法被卡(感觉目前这些不二分也不 DP(特指 Hangry 这样的 \(O(n^4)\) DP)都能卡)。 T2 建图建错了(没判谁是父亲也没建双向边)暴力死了,挂了 \(24\)。 我是唯一一个打了 T3 启发正解部分分但没有写出正解的人……

本人联系方式

点击直达 :https://t.me/ios888企鹅号码:616804217微信添加:616804217

ServiceMesh 4:实现流量染色和分级发布

★ ServiceMesh系列 1 什么是流量染色 在复杂的生产场景中,经常会有同一个服务中,存在多个版本长期共存的需求。为了让不同的用户在不一样的版本中使用,就需要对用户的请求进行采样和染色,打上不同的标识。 这样的目的有几个:支撑分级发布,避免全量发布时可能遇到的大规模…

SonicWall NSv 系列虚拟防火墙 SonicOSX 7.0 下载

SonicWall NSv 系列虚拟防火墙 SonicOSX 7.0 下载SonicWall NSv 系列虚拟防火墙 SonicOSX 7.0 SonicWall NSv SonicOSX 7.0 for ESXi 请访问原文链接:https://sysin.cn/blog/sonicwall-nsv/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org在获得物理防火墙所有安…

读数据质量管理:数据可靠性与数据质量问题解决之道02数据湖仓

数据湖仓1. 组装 1.1. 对于任何数据从业者来说,解决生产过程中的数据质量问题都是一项关键技能,但只要有适当的系统和流程,就基本可以防止数据宕机 1.2. 数据在管道的任何阶段都可能会受到操作数量、编程甚至数据相关性的影响,也许只需一次模式更改或代码推送,就会让下游报…

.NET 9正式发布,亮点是.NET Aspire和AI

Microsoft 今天正式发布了 .NET 9,这是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。这是来自世界各地的数千名开发人员又一年努力的结果。此新版本包括数千项性能、安全性和功能改进。您将发现整个 .NET 堆栈中从编程语言、开发人员工具和工作负载的全面增…

多校 A 层冲刺 NOIP2024 模拟赛 21

难度 ★★★☆☆多校A层冲刺NOIP2024模拟赛21 T1 送信卒 签到题 答案显然具有单调性,考虑二分答案,然后使用跑 dj check。 时间复杂度 \(O(nm\log (nm)\log (V))\) T2 共轭树图 特殊性质,树形 DP 考虑链怎么做,注意到一个性质,一条链上产生在 \(G\),将 \(G\) 中的边放到原…

APISR:受动漫制作启发的现实世界动漫超分辨率

APISR:受动漫制作启发的现实世界动漫超分辨率虽然现实世界的动漫超分辨率(SR)在SR社区越来越受到关注,但现有的方法仍然采用真实感领域的技术。分析了动漫制作工作,并重新思考了如何为了现实世界的动漫SR而使用它的特点。首先,由于手绘框架的重复使用,视频网络和数据集对…

2024.11.12 2024 CCPC女生专场

2024 CCPC女生专场 Solved:10/13 Penalty:1299 Rank:6今年题有这么简单吗?还是队伍变强了? 我做起来感觉比去年和前年都难。。感觉前两年至少都有 7~8 道签到,今年从 4~5 题就需要思考了。C. CCPC 题意:重排字符串使得形如 CCPC 的子串最多。 CCPCCP...CCPC #include<…

2024.11.12 CCPC2024女生专场

CCPC2024女生专场 Solved:10/13 Penalty:1299 Rank:6今年题有这么简单吗?还是队伍变强了? 我做起来感觉比去年和前年都难。。感觉前两年至少都有 7~8 道签到,今年从 4~5 题就需要思考了。C. CCPC 题意:重排字符串使得形如 CCPC 的子串最多。 CCPCCP...CCPC #include<…

串行总线的学习

一、USB概念 Universal Serial Bus,简称 USB。中文翻译称为通用串行总线,是一种串口总线的标准,也是一种输入输出接口的技术规范 二、USB接口外形分辨主要类型:Type-A,Type-B,Type-C,Micro,Mini下面以USB2.0协议展示不同类型接口的形状 Type-AType-B 通常在打印机设备使用,…

一文搞懂 ARM 64 系列: PACISB

一文搞懂 ARM 64 系列: PACISB1 PAC AMR64提供了PAC(Pointer Authentication Code)机制。 所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算,得出一个「签名」,将这个「签名」写入指针的高bit上。计算出来的「签名」之所以…