深圳大学的一些简单题

news/2025/4/1 2:47:09/文章来源:https://www.cnblogs.com/OoXiaoQioO/p/18799689

A

打表,发现是这样的东西:

然后规律很显然,相邻的两个数,一组在左边,另一组在右边,依次循环,偶数的时候是 \(23\) 开头,奇数的时候是 \(12\) 开头,再处理一下 \(1\)\(n\) 就可以,比较简单的分讨

显然规律不止一个

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[1000001];
int main()
{int t;cin >> t;while(t--){int n;cin >> n;if(n == 1){cout << 1 << endl;continue;}else if(n == 2){cout << "1 2" << endl;continue;}if(n % 2 == 1){int mid = (n + 1) / 2;a[1] = n - 1;a[n] = n;a[mid] = 1;for(int i = 2; i < mid; i++){if(i % 2 == 0)a[i] = a[i - 1] - 1;elsea[i] = a[i - 1] - 3;}for(int i = n - 1; i > mid; i--){if(i % 2 == 0)a[i] = a[i + 1] - 3;elsea[i] = a[i + 1] - 1;}}else{int mid;if(n % 4 == 0)mid = n / 2 + 1;elsemid = n / 2;a[1] = n - 1;a[n] = n;a[mid] = 1;for(int i = 2; i < mid; i++){if(i % 2 == 0)a[i] = a[i - 1] - 1;elsea[i] = a[i - 1] - 3;}for(int i = n - 1; i > mid; i--){if(i % 2 == 1)a[i] = a[i + 1] - 3;elsea[i] = a[i + 1] - 1;}}for(int i = 1; i <= n; i++)cout<<a[i]<<' ';cout<<endl;}
}

官解:

B

比较典的线段树,题目核心是找最小缺失编号、加/减球、移除最少的球使 \(x\) 是偶数,你可以用两个线段树

  • 一个主线段树(ST_all),作用:维护编号 \(1\)\(n\) 处的球数,支持区间更新,查询最小缺失编号 \(x\)

  • 偶数编号线段树(st_even):只储存偶数编号的球数,和找到最少需要移除的球数,使得缺失的编号为偶数

具体实现:用 ST_all 来二分查询出第一个个数为 \(0\) 的下标 \(j\),没有的话就令 \(j = n+1\);用 ST_even 维护偶数位置,对于一个偶数 \(i\),如果球数是 \(b_i\),那么如果使用魔法取出所有 \(i\) 号球,其代价为 \(b_i\),更新时,由于更新是按原下标区间给出的,我们只对落在 \([l,r]\) 中且下标为偶数的数字进行更新。

判断胜负与代价时,假设现在缺的是 \(j\)

  • \(j\) 是偶数,那么 \(Thephix\) 已经赢了,就是 \(0\)

  • \(j\) 是奇数,让缺失数字变为 \(i\),需要代价是 \(b_i\),显然取成本最低的那个就行,如果区间 \([2,j-1]\) 内没有偶数,就不能获胜,输出 \(-1\),注意如果一开始 \(b_1 = 0\),或第一个缺失数字 \(j=1\),那么无论如何都赢不了,输出 \(-1\)

因为魔法移除只对当前回合起作用,回合结束后恢复原状态,因此我们只在查询时“虚拟地”考虑移除操作,不修改主数据结构

复杂度 \(O(m \log n)\)

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
using namespace std;
typedef long long ll;
const ll INF = 1LL << 60;
int a[500001];
// 构造偶数下标数组(下标从1开始)
vector<int> even_idx;
vector<ll> even_a;
// 线段树模板:支持区间加更新和区间最小值查询
struct ST
{int n;vector<ll> tree, lazy;ST(int n) : n(n){tree.assign(4 * n, INF);lazy.assign(4 * n, 0);}void build(int idx, int l, int r){if(l == r){tree[idx] = a[l - 1];return;}int mid = (l + r) / 2;build(idx * 2, l, mid);build(idx * 2 + 1, mid + 1, r);tree[idx] = min(tree[idx * 2], tree[idx * 2 + 1]);}void push_down(int idx, int l, int r){if(lazy[idx] != 0){int mid = (l + r) / 2;lazy[idx * 2] += lazy[idx];lazy[idx * 2 + 1] += lazy[idx];tree[idx * 2] += lazy[idx];tree[idx * 2 + 1] += lazy[idx];lazy[idx] = 0;}}void update(int idx, int l, int r, int ql, int qr, ll val){if(ql > r || qr < l)return;if(ql <= l && r <= qr){tree[idx] += val;lazy[idx] += val;return;}push_down(idx, l, r);int mid = (l + r) / 2;update(idx * 2, l, mid, ql, qr, val);update(idx * 2 + 1, mid + 1, r, ql, qr, val);tree[idx] = min(tree[idx * 2], tree[idx * 2 + 1]);}ll queryMin(int idx, int l, int r, int ql, int qr){if(ql > r || qr < l)return INF;if(ql <= l && r <= qr)return tree[idx];push_down(idx, l, r);int mid = (l + r) / 2;return min(queryMin(idx * 2, l, mid, ql, qr), queryMin(idx * 2 + 1, mid + 1, r, ql, qr));}// 返回区间[ql,qr]内,第一个值为0的下标,如果不存在返回 -1int q_first0(int idx, int l, int r, int ql, int qr){if(ql > r || qr < l)return -1;if(ql <= l && r <= qr){if(tree[idx] > 0)return -1; // 此区间没有0// 否则往下找if(l == r)return l;}push_down(idx, l, r);int mid = (l + r) / 2;int res = q_first0(idx * 2, l, mid, ql, qr);if(res != -1)return res;return q_first0(idx * 2 + 1, mid + 1, r, ql, qr);}
};
// 辅助函数:在一个排好序的偶数下标数组 even_idx 中,给定原区间 [L, R],返回在偶数数组中的左右下标区间
pair<int, int> get(int L, int R)
{int l = int(lower_bound(even_idx.begin(), even_idx.end(), L) - even_idx.begin());int r = int(upper_bound(even_idx.begin(), even_idx.end(), R) - even_idx.begin()) - 1;if(l > r)return {-1, -1};return {l, r};
}
struct ST_e
{int n;vector<ll> tree, lazy;ST_e(int n) : n(n){tree.assign(4 * n, INF);lazy.assign(4 * n, 0);}void build(int idx, int l, int r){if(l == r){tree[idx] = even_a[l - 1];return;}int mid = (l + r) / 2;build(idx * 2, l, mid);build(idx * 2 + 1, mid + 1, r);tree[idx] = min(tree[idx * 2], tree[idx * 2 + 1]);}void push_down(int idx, int l, int r){if(lazy[idx] != 0){int mid = (l + r) / 2;lazy[idx * 2] += lazy[idx];lazy[idx * 2 + 1] += lazy[idx];tree[idx * 2] += lazy[idx];tree[idx * 2 + 1] += lazy[idx];lazy[idx] = 0;}}void update(int idx, int l, int r, int ql, int qr, ll val){if(ql > r || qr < l)return;if(ql <= l && r <= qr){tree[idx] += val;lazy[idx] += val;return;}push_down(idx, l, r);int mid = (l + r) / 2;update(idx * 2, l, mid, ql, qr, val);update(idx * 2 + 1, mid + 1, r, ql, qr, val);tree[idx] = min(tree[idx * 2], tree[idx * 2 + 1]);}ll queryMin(int idx, int l, int r, int ql, int qr){if(ql > r || qr < l)return INF;if(ql <= l && r <= qr)return tree[idx];push_down(idx, l, r);int mid = (l + r) / 2;return min(queryMin(idx * 2, l, mid, ql, qr), queryMin(idx * 2 + 1, mid + 1, r, ql, qr));}
};
int n,m;
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;for(int i = 0; i < n; i++)cin >> a[i];// 建立两个线段树ST ST_all(n);ST_all.build(1, 1, n);for(int i = 1; i <= n; i++){if(i % 2 == 0){even_idx.push_back(i);even_a.push_back(a[i - 1]);}}int e_cnt = even_idx.size();ST_e ST_even(e_cnt);if(e_cnt > 0)ST_even.build(1, 1, e_cnt);// 每回合操作// 注意:每回合更新都是对当前状态累积的while(m--){int l, r;ll k;cin >> l >> r >> k;// 更新主线段树ST_all.update(1, 1, n, l, r, k);// 更新偶数下标树:更新所有偶数 i in [l, r]if(e_cnt > 0){// 在 even_idx 中寻找落在 [l, r] 的下标位置auto pr = get(l, r);if(pr.first != -1){ST_even.update(1, 1, e_cnt, pr.first + 1, pr.second + 1, k);}}// 查询第一个值为0的下标int first0 = ST_all.q_first0(1, 1, n, 1, n);int j; // j为自然状态下箱子中最小缺失数字,下标从1开始,如果都非0,则 j = n+1if(first0 == -1){j = n + 1;}else{j = first0;}// 如果 j == 1,则必定 b1==0,无论如何都无法获得胜利if(j == 1){cout << -1 << endl;continue;}// 自然状态下,缺失数字为 j// 如果 j 为偶数,则 Thephix 获胜,代价为0if(j % 2 == 0){cout << 0 << endl;continue;}// j 为奇数,则需要利用魔法取出某个偶数 i (< j) 的球,代价为 b_i// 在区间[1, j-1]中偶数下标集合:实际上就是偶数在区间 [2, j-1]if(j - 1 < 2){// 区间中没有偶数cout << -1 << endl;continue;}// 在 even_idx 中查找属于 [2, j-1] 的下标auto pr = get(2, j - 1);if(pr.first == -1){cout << -1 << endl;continue;}ll ans = ST_even.queryMin(1, 1, e_cnt, pr.first + 1, pr.second + 1);// ans 为区间中最小的球数,也即移除该偶数所需代价cout << ans << endl;}cout << "\n";return 0;
}

官解:

C

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

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

相关文章

AI可解释性 I | 对抗样本(Adversarial Sample)论文导读(持续更新)

本文作为AI可解释性系列的第一部分,旨在以汉语整理并阅读对抗攻击(Adversarial Attack)相关的论文,并持续更新。与此同时,AI可解释性系列的第二部分:归因方法(Attribution)也即将上线,敬请期待。AI可解释性 I | 对抗样本(Adversarial Sample)论文导读(持续更新) 导…

day:33 jmeter性能测试——压力测试

一.单接口性能测试(同一用户进行压力测试) POST http://49.233.201.254:8080/cms/manage/loginJump.do POST data: userAccount=admin&loginPwd=123456(1)在线程中修改虚拟用户数线程组 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里…

c#winform,倒鸭子字幕,仿AE软件的typemonkey插件,类似抖音的瀑布流字幕

不废话 直接上效果图C# winform 开发 类似抖音的瀑布流字幕。也是类似AE软件的typemonkey插件或者咱再网上常说的倒鸭子字幕 主要功能 1,软件可以自定义添加字幕内容2,软件可以添加字幕显示的时间区间3,可以自定义字幕颜色,可以随机颜色4,支持字幕的上下调节5,支持字幕的…

20241110 实验二《Python程序设计》实验报告

学号 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2411 姓名: 王方俊 学号:20241110 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 (一)设计并完成一个计算器,支持整数和复数,可以完成加、减、乘、除、对数…

打造用户认证系统,构筑信息安全防线

在当今的数字化时代,信息安全和用户隐私保护变得越来越重要。用户身份认证是确保信息安全的第一道防线。通过验证用户身份,可以防止未经授权的访问和数据泄露。它有助于保护用户的个人信息、账户资金和其他敏感数据。此外,用户身份认证还可以提高系统的安全性,减少恶意行为…

LAN网的搭建

1 此下列三台主机都在局域网内,不涉及和ISP的Internet网络连接 2 以下三台主机,每台主机都各自有两个网卡,一个是无线网卡,一个是有线网卡。注:有线网卡和无线网卡通用,都可以既连接WAN又可以连接以太网(LAN局域网)。3 [Acer laptop] [Dell mini …

UML用例图-UML Use Case Diagram

用例图是UML中最简单,使用最高频的图之一,它通常用于诠释“这个软件做了什么”。用例图的的表达非常简单并且通俗易懂,不论研发、产品、测试,还是完全不懂软件的外行,用例图基本都能被看懂。.wj_nav { display: inline-block; width: 100%; margin-top: 0; margin-bottom:…

喜提好人卡?混元模型模块独立维护与开源发布

接着我们上次向Spring AI提交的混元模型模块,我已经完成了所有关于混元的聊天对接,并提交了相应的PR描述。提交后,荣获了一张“好人卡”,如图所示:今天,我们决定将之前提交给Spring AI官方的PR重新拿出来,并准备将其独立维护在一个开源仓库中。做出这一决策的原因是Spri…

VMware Aria Automation 8.18.1 新增功能简介

VMware Aria Automation 8.18.1 新增功能简介VMware Aria Automation 8.18.1 - 多云基础架构自动化平台 Multi-Cloud Infrastructure Automation Platform 请访问原文链接:https://sysin.org/blog/vmware-aria-automation/ 查看最新版。原创作品,转载请保留出处。 作者主页:…

最小二乘及最小二乘法系统辨识

目录一般最小二乘法加权最小二乘递推最小二乘 一般最小二乘法 无需每次对整体数据进行最小二乘估计,利用上次计算的值与当前数据融合计算,获取计算结果。本质上是对老的计算结果修正的方式,节省计算步骤,降低运算量,提升计算的效率。 若辨识模型: \[z_{(k)}={h_{(k)}}^T\…

氩气保护焊接气体流量控制

该节气装置通过以下方法,为您减少30%-50%的焊接气体的用量。在整个焊接过程中,气流与焊接电流自动同步调节。 “较大电流 — 较多气体/较小电流 — 较少气体”极高速气阀即使在焊接停止时间很短的情况下,也可开闭。通过持续的气体保护以及预先“编程”,脉冲气体可进一步减小…

2025.3.29日 清华大学-郝泽旭 的模拟赛

2025.3.29日 清华大学-郝泽旭 的模拟赛原题可以转化为给定了 \(k\) 个起点,求 \(k\) 个终点,使得路径两两无公共点的所有路径之和的最大值。 注意到先上再下的路径可以拆成两部分,即从关键点开始先向上到达一个点后再向下可以看作一条从关键点向上的路径与一条从非关键点向上…