比赛链接

A

题意

给一个字符串每个物品对应的灯的照明方向,L/R 能照亮它左侧/右侧的所有物品(不包括自己对应的物品),现在能交换相邻两个灯一次(不改变照明方向),问能否找亮所有物品。

题解

知识点:贪心。

显然,如果存在 LRRL 就可以照亮全部,否则全是 LR 就不可行。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
string s;
cin >> s;
s = "?" + s;
for (int i = 1;i < n;i++) {
if (s[i] != s[i + 1]) {
if (s[i] == 'L') cout << i << '\n';
else cout << 0 << '\n';
return true;
}
}
return false;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

B

题意

构造一组数,使得任意相邻两项之和等于全部和。

题解

知识点:构造。

\(n\) 为偶数时,构造 \(1,-1,1,-1,\cdots\) 即可。

\(n\) 为奇数时,显然奇数项和偶数项要各自相等,随后由 \(a_1+\cdots+a_n = a_{n-1}+a_{n}\) 可以得到 \((n-1)a_1+(n-3)a_2 = 0\) ,取 \(a_1 = n-3,a_2 = 1-n\) 即可,只有 \(n=3\) 时无解(因为 \(a_1 = 0\))。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
if (n & 1) {
if (n == 3) return false;
cout << "YES" << '\n';
for (int i = 1;i <= n;i++) {
if (i & 1) cout << n - 3 << ' ';
else cout << 1 - n << ' ';
}
cout << '\n';
}
else {
cout << "YES" << '\n';
for (int i = 1;i <= n;i++) {
if (i & 1) cout << 1 << ' ';
else cout << -1 << ' ';
}
cout << '\n';
}
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

C

题意

给一组数,可以修改元素变成其相反数。问最少修改几次,可以使得第 \(m\) 个前缀和 \(a_1+\cdots+a_m\) 是所有前缀和里最小的。

题解

知识点:前缀和,数学,贪心。

定义 \(a[l,r] = a_l+\cdots+a_r\) 。

当 \(k\in [1,m-1]\) 时

\[\begin{aligned}
a[1,k] &\geq a[1,m]\\
a[1,k] &\geq a[1,k] + a[k+1,m]\\
0 &\geq a[k+1,m]
\end{aligned}
\]

当 \(k\in [m+1,n]\) 时

\[\begin{aligned}
a[1,k] &\geq a[1,m]\\
a[1,m] + a[m+1,k] &\geq a[1,m]\\
a[m+1,k] &\geq 0
\end{aligned}
\]

所以只要保证任意 \(i\in[2,m]\) ,满足 \(a[i,m]\leq 0\) ;任意 \(i\in[m+1,n]\) ,满足 \(a[m+1,i] \geq 0\) 即可。

每次操作时,贪心地取最优的即可。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[200007];
bool solve() {
int n, m;
cin >> n >> m;
for (int i = 1;i <= n;i++) cin >> a[i];
int cnt = 0;
multiset<int> ms;
ll sum = 0;
for (int i = m;i >= 2;i--) {
sum += a[i];
ms.insert(a[i]);
if (sum > 0) {
sum -= 2 * (*prev(ms.end()));
ms.erase(prev(ms.end()));
cnt++;
}
}
ms.clear();
sum = 0;
for (int i = m + 1;i <= n;i++) {
sum += a[i];
ms.insert(a[i]);
if (sum < 0) {
sum -= 2 * (*ms.begin());
ms.erase(ms.begin());
cnt++;
}
}
cout << cnt << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

D

题意

给定一组头发长度 \(a_i\) ,以及理想头发长度 \(b_i\) 。

理发师有刀片 \(x_i\) ,每个刀片只能用一次,每次可以修减一段连续区间的头发,满足 \(a'_i = \min(a_i,x),i\in[L,R]\)。

问理发师能不能通过这些刀片将 \(a\) 修剪至 \(b\) 。

题解

知识点:单调栈。

显然 \(a_i<b_i\) 无解。

利用最大值单调栈维护刀片的值。以下按顺序满足:

  1. \(b_i\) 大于栈顶刀片,则栈顶刀片因为太小不能再用了,刀片需要出栈直至 \(b_i\) 小于等于栈顶刀片或栈空。
  2. \(b_i = a_i\) ,说明 \(b_i\) 不需要修剪,什么都不用干。
  3. \(b_i \neq a_i\) ,说明 \(b_i\) 需要修剪,此时如果 \(b_i\) 小于栈顶刀片或栈空,则需要使用新的刀片,满足 \(x = b[i]\) ,如果不存在这个刀片则无解。

全部满足后,即 YES

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[200007];
int b[200007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) cin >> b[i];
int m;
cin >> m;
map<int, int> mp;
for (int i = 1;i <= m;i++) {
int x;
cin >> x;
mp[x]++;
}
stack<int> st;
for (int i = 1;i <= n;i++) {
if (a[i] < b[i]) return false;
while (!st.empty() && b[i] > st.top()) st.pop();
if (a[i] != b[i]) {
if (st.empty() || b[i] < st.top()) {
if (mp[b[i]]) {
mp[b[i]]--;
st.push(b[i]);
}
else return false;
}
}
}
cout << "YES" << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

Hello 2023 A-D的更多相关文章

  1. 1630/2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

    2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 85  Solved: 40[S ...

  2. 「LOJ2000~2023」各省省选题选做

    「LOJ2000~2023」各省省选题选做 「SDOI2017」数字表格 莫比乌斯反演. 「SDOI2017」树点涂色 咕咕咕. 「SDOI2017」序列计数 多项式快速幂. 我们将超过 \(p\) ...

  3. HDU 2023 求平均成绩

    Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...

  4. 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;

    描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...

  5. 【BZOJ1630/2023】[Usaco2007 Demo]Ant Counting DP

    [BZOJ1630/2023][Usaco2007 Demo]Ant Counting 题意:T中蚂蚁,一共A只,同种蚂蚁认为是相同的,有一群蚂蚁要出行,个数不少于S,不大于B,求总方案数 题解:DP ...

  6. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  7. ural 2023 Donald is a postman(水)

    2023. Donald is a postman Time limit: 1.0 secondMemory limit: 64 MB Donald Duck works as a postman f ...

  8. loj #2023. 「AHOI / HNOI2017」抛硬币

    #2023. 「AHOI / HNOI2017」抛硬币   题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ...

  9. bzoj1630/2023 [Usaco2007 Demo]Ant Counting

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1630 http://www.lydsy.com/JudgeOnline/problem.ph ...

  10. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

随机推荐

  1. MyBatis(入参的类型和日志记录)

    入参的类型是对象 1. 新增的参数是对象 2. 空值的处理,占位符 字段,jdbcType=VARCHAR          字符串 字段,jdbcType=DATE                  ...

  2. 刷完一千道java笔试题的常见题目分析

    java基础刷题遇到的最常见问题 可以先看一下这位博主整理的java面试题(很详细,我看了好几遍了):https://blog.csdn.net/ThinkWon/article/details/10 ...

  3. 一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.简述MySQL中索引类型对数据库的性能的影响 2.RDB和AOF机制 3.Redis的过期键的删除策略 4.Redis ...

  4. Redis 01: 非关系型数据库 + 配置Redis

    数据库应用的发展历程 单机数据库时代:一个应用,一个数据库实例 缓存时代:对某些表中的数据访问频繁,则对这些数据设置缓存(此时数据库中总的数据量不是很大) 水平切分时代:将数据库中的表存放到不同数据库 ...

  5. 30.Serializers模块源码解析

    rest_framework序列化类的继承关系 field类: 序列化基类的基类 BaseSerializer: 继承field 派生ListSerializer序列化类 Serializer: 继承 ...

  6. (二)Three光线检测-实现摄像机向鼠标点击位置滑动动画

    (二)Three.js光线检测 摘要:使用three.js中的光线检测 Raycaster() ,实现一下效果: 通过点击处的坐标,修改摄像机位置,实现摄像机由远及近的过渡动态效果(由远景到近景) 1 ...

  7. numpy常用知识点备忘

    常用函数 a.max(axis=0) a.max(axis=1) a.argmax(axis=1) : 每列的最大值(在行方向找最大值).每行的最大值(在列方向找对大致).最大值的坐标 sum()求和 ...

  8. Scrapy 发送Request Payload

    Scrapy 发送Request Payload 首先要打开 F12 进入调试模式 然后 查看是用什么方法获取的 如果是Json: 1. json.dumps 转化成Json yield Reques ...

  9. 京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用

    摘要 随着云计算和人工智能的兴起,如何安全有效地利用数据,对持有大量数字资产的企业来说至关重要.同态加密,是解决云计算和分布式机器学习中数据安全问题的关键技术,也是隐私计算中,横跨多方安全计算,联邦学 ...

  10. C# 多线程访问之 SemaphoreSlim(信号量)【C# 进阶】

    SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待. 由于 SemaphoreSlim ...