正睿 25 年联赛联合训练 Day 12

正睿 25 年联赛联合训练 Day 12

得分

T1 T2 T3 总分 排名
\(100\) \(100\) \(20\) \(220\) \(2/17\)

题解

T1 LIS

神秘找规律。写一个爆搜,发现最优方案就是在每一个 \(b_i\) 前依次放 \(m\sim b_i+1\),这样一定是最长的。判断一下 \(n\) 和序列的最长长度的关系然后输出方案即可。

#include <bits/stdc++.h>
#define int long longusing namespace std;const int Maxn = 3e5 + 5;
const int Inf = 2e9;int n, m, k, b[Maxn];
int sum = 0;
int a[Maxn];signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m >> k;for(int i = 1; i <= k; i++) cin >> b[i], sum += b[i];if(k * m - sum + k < n) cout << "No\n";else {cout << "Yes\n";int tot = 0, cnt = 0, lst = n - k;for(int i = 1; i <= k; i++) {cnt = m;while(lst > 0 && cnt > b[i]) {a[++tot] = cnt; cnt--; lst--;}a[++tot] = b[i];}for(int i = 1; i <= n; i++) {cout << a[i] << " ";}}return 0;
}

T2 图论

这个题标算被 \(O(n^4),O(n^3\log n)\) 踩爆了……

我们先考虑一个贪心做法,我们每次取出度数和最大的边,将其加入边集并更新 \(K\) 的最大值;然后将与这两个点相连的边的度数更新。显然上述过程可以用堆维护,复杂度是 \(O(n^3\log n)\) 的。

实际上我们有一个简单的优化,可以用桶排的思想,维护 \(2n\) 个队列,每次从最大的的队列里取出边然后更新下面的队列,这样做就可以做到 \(O(n^3)\) 了。但是实际运行效率较低。

代码没有写正解。

#include <bits/stdc++.h>using namespace std;const int Maxn = 2e5 + 5;
const int Inf = 2e9;int n, m;
int mat[505][505], dg[Maxn];
int res[505][505], deg[Maxn];queue <int> q;
int vis[Maxn];
int bfs(int k) {for(int i = 1; i <= n; i++) {vis[i] = 1, q.push(i), deg[i] = dg[i];for(int j = 1; j <= n; j++) res[i][j] = mat[i][j];}int sum = m;vector <int> son;while(!q.empty()) {int x = q.front(); q.pop();vis[x] = 0;son.clear();for(int i = 1; i <= n; i++) {if(res[i][x] || i == x) continue;son.push_back(i);}sort(son.begin(), son.end(), [](const int &x, const int &y){return deg[x] > deg[y];});for(auto i : son) {if(deg[x] + deg[i] < k) break;deg[x]++, deg[i]++, res[x][i] = res[i][x] = 1;sum++;if(!vis[i]) q.push(i);}}if(sum != n * (n - 1) / 2) return 0;return 1;
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1; i <= m; i++) {int u, v; cin >> u >> v;mat[u][v] = mat[v][u] = 1;dg[u]++, dg[v]++;}int l = 0, r = 2 * n - 2, res = 0;while(l <= r) {int mid = (l + r) >> 1;if(bfs(mid)) res = mid, l = mid + 1;else r = mid - 1;}cout << res << '\n';return 0;
}

T3 防御

先考虑只有一个防御装置怎么办。我们可以求出每个点看不到的点的个数。定义一个点关于一条线段在 \(x\) 轴上的投影为,连接点和线段的两个端点,其与 \(x\) 轴两交点的线段。那么如果上面的点不能被下面的点看到,则下面的点的投影一定完全包含在上面的点的投影中。

这个已经可以直接用二维偏序做了,不过实际上还有更简单的方法。不难发现一个性质:对于所有在上面的点的投影,它们的 \(l,r\) 都是递增排序的。所以我们可以直接二分求出答案。复杂度 \(O(q\log n)\)

考虑有多个防御装置怎么办,考虑利用容斥的思路,用被一个挡住的减去被两个挡住的,再加上被三个挡住的……可以暴力枚举子集,然后用上面相同的办法去做;这个时候的投影就是若干个投影的交集。这样做的复杂度就是 \(O(2^m q(m+\log n))\) 的。

#include <bits/stdc++.h>using namespace std;typedef long double db;
const int Maxn = 2e5 + 5;
const db Inf = 1e18;int n, m, q;struct Point {int x, y;
}tar[Maxn], atk[Maxn];struct Line {int l, r, y;
}dfs[Maxn];int ans[Maxn];db calc(db x1, db y1, db x2, db y2) {if(x1 == x2) return x1;else return x1 - y1 * (x2 - x1) / (y2 - y1);
}db l[Maxn], r[Maxn];
int tot;void work(int S, int zf) {tot = 0;for(int i = 1; i <= n; i++) {db pl = -Inf, pr = Inf;for(int j = 1; j <= m; j++) {if((S >> (j - 1)) & 1) {if(dfs[j].y >= tar[i].y) {pl = Inf, pr = -Inf; break;}pl = max(pl, calc(tar[i].x, tar[i].y, dfs[j].l, dfs[j].y));pr = min(pr, calc(tar[i].x, tar[i].y, dfs[j].r, dfs[j].y));}}if(pl <= pr) {tot++; l[tot] = pl, r[tot] = pr; }}sort(l + 1, l + tot + 1); sort(r + 1, r + tot + 1);for(int i = 1; i <= q; i++) {db pl = -Inf, pr = Inf;for(int j = 1; j <= m; j++) {if((S >> (j - 1)) & 1) {pl = max(pl, calc(atk[i].x, atk[i].y, dfs[j].l, dfs[j].y));pr = min(pr, calc(atk[i].x, atk[i].y, dfs[j].r, dfs[j].y));}}if(pl <= pr) {int nl = lower_bound(r + 1, r + tot + 1, pr) - r;int nr = upper_bound(l + 1, l + tot + 1, pl) - l - 1;ans[i] += zf * max(nr - nl + 1, 0);}}
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m >> q;for(int i = 1; i <= n; i++) cin >> tar[i].x >> tar[i].y;for(int i = 1; i <= m; i++) cin >> dfs[i].l >> dfs[i].r >> dfs[i].y;for(int i = 1; i <= q; i++) cin >> atk[i].x >> atk[i].y;for(int i = 1; i < (1 << m); i++) {if(__builtin_popcount(i) & 1) work(i, 1);else work(i, -1);}for(int i = 1; i <= q; i++) {cout << n - ans[i] << '\n';}return 0;
}

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

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

相关文章

git 已知问题 命令行调用 git 时可能存在环境变量投毒问题

本文记录一个我在 git 钩子唤起一个 C# dotnet 的进程,在此进程里面使用 Process.Start 执行 git 命令的时候,被 git 钩子环境变量投毒的问题核心代码非常简单,我只是使用 git add 命令而已var sourceFolder = @"C:\lindexi\Work\Source\";var processStartInfo =…

eSIM神器之ESTK记录

本文内容一部分引用“ 灯塔旅人”公众号文章内容。 先说原理: 原理 ⚡️普通手机:营业厅将信息写入实体SIM中,然后插入手机,实现相关功能; ⚡️eSIM手机:内置了eSIM芯片,可以直接扫码写入运营商提供的eSIM并支持切换; ⚡️ESTK:形象地比喻为将eSIM手机中eSIM芯片取出,…

Google TPU第六代TPUv6

简单谈谈Google TPUv6 根据Google TPU第六代的数据做了一些性能数据的对比,需要注意的是TPUv6当前应该是一个用于训推一体的单Die的版本,用于训练的V6p双Die版本应该会后期再发布. 需要注意的是在国内外都开始卷大模型推理价格的时候, TPU这样的东西对于提高ROI非常有帮助。快…

NPU 是什么芯片?AI芯片都有哪些?(下)

8. HPU(Holographic Processing Unit) 全息处理器。微软HoloLens是世界上首台独立的全息计算机设备,能够提供高清晰度的全息影像,其秘密在于HoloLens搭载的Holographic Processing Unit(全息处理单元,简称HPU),这是一款定制芯片,可以处理和交互不同传感器及Intel Atom…

NPU 是什么芯片?AI芯片都有哪些?(上)

NPU 是什么芯片?AI芯片都有哪些? NPU就是CPU功能细化的产物,就像当年只有CPU一样,发现处理一些简单的重复的任务,特别像游戏这种大量作图时只能用软件算法,效率及其低下,所以发展处的加速卡,发展成为GPU,现在处理一些ai学习算法时都是用GPU软件模拟,效率低下,功耗大…

Nginx 配置与实战

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发…

《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》 4本书推荐

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

乐心手环6S拆解

PART1:背景使用了1年多的乐心手环电量终于扛不住了,于是便拆开看看里面使用的方案还有堆叠设计PART2:拆解先来看看乐心手环产品功能和外观照片去掉手环的表带,通过热风枪调至200℃,对这面盖和四周均匀加热至烫手,然后从两边拆开即可分离面盖和主体元器件清单可以看到使用的…

请求响应

apipost插件,用于测试1. 简单参数 通过request手动获取请求参数: @RestController public class easy {@RequestMapping("/easyget")public String easyget(HttpServletRequest request) { //通过request获取参数String name = request.getParameter("name"…

【机器学习面试场景问题】

1、ResNet是什么? ‌ResNet(Residual Network,残差网络)是一种在深度学习领域中非常重要的卷积神经网络(CNN)架构。 ResNet的核心思想是残差学习,通过学习输入与输出的残差,简化优化任务。其关键结构是残差块,通过短连接(Skip Connection)直接跳过部分非线性层,将输…

Linux中删除第一列中指定分隔符最后的一个字段

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 00_3 8834 1b_kk ffaa 55_f3_34 8834 aa_bb_kk_44 44aa [root@localhost test]# sed s/\([^ ]*\)_[^ ]\+\t\(.*\)/\1\t\2/ a.txt ## 删除第一列的最后一个字…

2021-PTA总决赛-L2-1 包装机(队列+栈,纯模拟)

栈+队列+模拟题目怎么说就怎么做AcCode: #include<bits/stdc++.h> using namespace std; queue<char> track[110]; stack<char> s; int main(){int N, M, S;cin >> N >> M >> S;for(int x = 1; x <= N; x++){for(int i = 0; i < M; …