ABC346 A-G 题解

ABC346 A-G题解

  • A
    • 题目
    • AC Code:
    • 时间复杂度
  • B
    • 题目
    • 时间复杂度
    • AC Code:
  • C
    • 题目
    • 时间复杂度
    • AC Code:
  • D
    • 题目
    • 时间复杂度
    • AC Code:
  • E
    • 题目
    • 时间复杂度
    • AC Code:
  • F
    • 题目
    • 时间复杂度
    • AC Code:
  • G
    • 题目
    • 时间复杂度
    • AC Code:

下面的内容不包括题目翻译,要想获取题目翻译,请参照 这篇教程 来获取题目翻译。

A

题目

循环处理每一个数字即可,不再赘述。

AC Code:

#include <iostream>
using namespace std;
int n, a[200100];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i < n; i++) cout << a[i] * a[i + 1] << ' ';return 0;
}

时间复杂度

O ( N ) O(N) O(N)

B

题目

由于键盘是有规律的,所以任何子串都可以从从 12 12 12 以内开始的子串提取出来。暴力即可, 200 200 200 够用了。

时间复杂度

O ( 20 0 2 ) O(200^2) O(2002)

AC Code:

#include <iostream>
#include <cstring>
using namespace std;
int w, b;
string s = "wbwbwwbwbwbw";
string s1;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> w >> b;for (int i = 0; i <= 20; i++) {for (int j = 0; j < (int)s.length(); j++) {s1.push_back(s[j]);}}for (int i = 0; i < (int)s1.size(); i++) {int cntw = 0, cntb = 0;for (int j = i; j < (int)s1.size(); j++) {if (w == cntw && b == cntb) {cout << "Yes\n";return 0;}if (s1[j] == 'b') cntb++;else cntw++;}}cout << "No";return 0;
}

C

题目

我们发现,与其一个一个找没有出现在 A A A 里面的数,不如从小于等于 K K K 的所有数字里面寻找在 A A A 里出现过的数字。我们使用一个 map 记录这个数字有没有被去除。对于每一个 A i A_i Ai,如果 A i ≤ K A_i \le K AiK 且没有被去除,就从所有小于等于 K K K 的数字的和里面减去这个数字,把这个数字标记为已去除。

时间复杂度

O ( N log ⁡ ( 1 0 9 ) ) O(N\log(10^9)) O(Nlog(109))

AC Code:

#include <iostream>
#include <map>
using namespace std;
int n;
long long k, a[200100];
long long ans;
map<long long, bool> m;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k;ans = (k + 1ll) * k / 2ll;for (int i = 1; i <= n; i++) {cin >> a[i];if (!m[a[i]] && a[i] <= k) {ans -= a[i];m[a[i]] = 1;}}cout << ans;return 0;
}

D

题目

我们发现,一个好字串无非就是可以从某个位置切成两个字串,字串里相邻两个字符不一样,字串切开的位置的字符相同。

我们计算前缀后缀以 01 开始的相邻两个字符不一样的代价,即使这个字串变为 10101... 的代价。对于每一个分割点,如果原串长度是偶数,那么这两个分割后的字串另外一边要一样,否则,不一样。计算代价,取最小值即可。

时间复杂度

O ( N ) O(N) O(N)

AC Code:

#include <algorithm>
#include <iostream>
using namespace std;
int n;
char s[200100];
int c[200100];
long long sum[200100];
long long c00[200100], c01[200100], c10[200100], c11[200100];
long long ans = 1e18;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) cin >> s[i];for (int i = 1; i <= n; i++) cin >> c[i];for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + c[i];for (int i = 1; i <= n; i++) {c00[i] = c00[i - 1] + ((i - 1) % 2 == s[i] - '0') * c[i];c01[i] = c01[i - 1] + (i % 2 == s[i] - '0') * c[i];}for (int i = n; i >= 1; i--) {c10[i] = c10[i + 1] + ((n - i) % 2 == s[i] - '0') * c[i];c11[i] = c11[i + 1] + ((n - i + 1) % 2 == s[i] - '0') * c[i];}for (int i = 1; i < n; i++) {if (n % 2 == 0) {ans = min({ans, c00[i] + c10[i + 1], c01[i] + c11[i + 1]});}else {ans = min({ans, c01[i] + c10[i + 1], c00[i] + c11[i + 1]});}}cout << ans;return 0;
}

E

题目

我们倒着考虑所有操作,对于每一个横排操作,如果之前(指更晚的操作)把这一排覆盖了,那么跳过这个操作,否则统计没被覆盖的列数,该颜色数量加上这个值,把这一排标记为操作了,剩余横排数量减一,结束。
如果这是一个竖列操作,如果这一列没有被覆盖,该颜色数量加上没被覆盖的横排数,把这一列标记为被覆盖,没被覆盖的列数减去一,结束。

时间复杂度

O ( 1 ) O(1) O(1)

AC Code:

#include <iostream>
#define int long long
using namespace std;
int h, w;
int m;
int t[200100], a[200100], x[200100];
int c_h, c_w;
int cnt[200100];
int cnt1;
bool vis_h[200100], vis_w[200100];signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> h >> w;cin >> m;c_h = h, c_w = w;for (int i = m; i >= 1; i--) cin >> t[i] >> a[i] >> x[i];for (int i = 1; i <= m; i++) {if (t[i] == 1) {if (c_h && !vis_h[a[i]]) {c_h--;cnt[x[i]] += c_w;vis_h[a[i]] = 1;}}else {if (c_w && !vis_w[a[i]]) {c_w--;cnt[x[i]] += c_h;vis_w[a[i]] = 1;}}}cnt[0] += c_h * c_w;for (int i = 0; i <= 200000; i++) {if (cnt[i]) cnt1++;}cout << cnt1 << '\n';for (int i = 0; i <= 200000; i++) {if (cnt[i]) {cout << i << ' ' << cnt[i] << '\n';}}return 0;
}

F

题目

如果重复三次的情况可以,那么二次,一次的情况也可以。如果重复四次的情况不可以,重复五次,六次也不可以。可以看出这东西满足单调性,可以二分。

我们判断这个情况可不可以时,如果暴力在重复 N N N 次的串中寻找的话, N N N 很大,会爆炸。我们记录现在找到了重复第几遍的串中的第几个字符,分情况讨论找完后会不会跳到下一遍即可。如果跳不到下一遍,找到刚刚好重复我们要重复的次数的位置,否则,让总共要重复的次数除以这一边中字符个数就是要重复的次数,还要考虑这个坐标多的次数。

如果重复了 N + 1 N+1 N+1 边才找完或没找完,就说明不行。

细节很多,考验你的调试技术。

时间复杂度

O ( ∣ T ∣ log ⁡ ( N ∣ S ∣ ) ) O(|T|\log(N|S|)) O(Tlog(NS))

AC Code:

#include <iostream>
#define int long longusing namespace std;
int n;
string s, t;
int cnt[200100][50];
int idx[200100][50];
bool check(int x) {int now1 = 0, now2 = 0;for (int i = 0; i < (int)t.size(); i++) {if (!cnt[0][t[i] - 'a']) return 0;if (cnt[now2][t[i] - 'a'] >= x) {int tmp = x;if (now2) tmp += cnt[0][t[i] - 'a'] - cnt[now2][t[i] - 'a'];now2 = idx[tmp][t[i] - 'a'] + 1;}else {int tmp = x;tmp -= cnt[now2][t[i] - 'a'];now1++;now2 = 0;if (cnt[0][t[i] - 'a'] >= tmp) {now2 = idx[tmp][t[i] - 'a'] + 1;}else {now1 += tmp / cnt[0][t[i] - 'a'];now2 = idx[tmp % cnt[0][t[i] - 'a']][t[i] - 'a'] + 1;if (tmp % cnt[0][t[i] - 'a'] == 0) {now1--;now2 = idx[cnt[0][t[i] - 'a']][t[i] - 'a'];}}}now1 += now2 / (int)s.size();now2 %= (int)s.size();if (now1 > n || (now1 == n && now2)) return 0;}return 1;
}
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> s >> t;for (int i = (int)s.size() - 1; i >= 0; i--) {for (int j = 0; j < 26; j++) cnt[i][j] = cnt[i + 1][j];cnt[i][s[i] - 'a']++;}for (int i = (int)s.size() - 1; i >= 0; i--)for (int j = 0; j < 26; j++) idx[cnt[0][j] - cnt[i + 1][j]][j] = i;int l = 0, r = n * (int)s.size();while (l < r) {int mid = (l + r + 1) / 2;if (check(mid)) {l = mid;}else {r = mid - 1;}}cout << l;return 0;
}

G

题目

我们可以找到对于每一个 A i A_i Ai,它的上一个和它相同的值的位置和下一个和它相同的值的位置。通过正序和倒序便利数组,存储这个值上一个出现位置,每遇到一个值将其上一个和它相等的值的位置更新为我们储存的这个值的位置,在更新这个值的上一个出现位置为现在遍历到的位置。

这样就算出了对于每一个只出现一次的数的区间范围,拿样例解释:

1 2 1 4 3 3 3 2 2 4

如果以第三个元素:1 为只出现一次元素的话,区间可以这么取:

1 [2 {1] 4 3 3 3 2 2 4}

其中中括号是左端点的范围,大括号是右端点的取值范围。

这样就有 2 × 8 2\times 8 2×8 16 16 16 种情况。

但是就这样会有重复的区间,朴素去重就是 N 2 N^2 N2 的时间复杂度了,怎么办呢?

我们可以把一个区间表示成一个点: [ i , j ] [i,j] [i,j] 表示成 ( i , j ) (i,j) (i,j),如图 i , j i,j i,j 2 , 3 2,3 2,3

在这里插入图片描述

那么两个区间里的点的组合是不是就可以表示成一个矩形?

那么样例中例子的矩形就是:

( 2 , 3 ) to ( 3 , 10 ) (2,3) \text{to} (3,10) (2,3)to(3,10)

这个矩形的面积就是这个值只有一个的区间的总和。

那么把这些矩形的面积并起来,求这个不规则图形的总面积就是我们要求的答案?

你应该可以想到 扫描线。

时间复杂度

O ( N log ⁡ ( N ) ) O(N\log(N)) O(Nlog(N))

什么?你不会?我放的链接是拿来干嘛的?

AC Code:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n, a[200100];
int l[200100], r[200100], l1[200100], r1[200100];
struct node{int l, r, tag;long long sum;
};
node t[1600100];
void maketree(int l, int r, int p) {t[p].l = l;t[p].r = r;if (l < r) {maketree(l, (l + r) / 2, p * 2);maketree((l + r) / 2 + 1, r, p * 2 + 1);}
}
void add(int l, int r, int p, int k) {if (t[p].l > r || t[p].r < l) return;if (l <= t[p].l && t[p].r <= r) {t[p].tag += k;if (t[p].tag) t[p].sum = t[p].r - t[p].l + 1;else t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;return;}add(l, r, p * 2, k);add(l, r, p * 2 + 1, k);if (!t[p].tag) t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;
}
struct segment{int l, r, x, f;
};
segment seg[1600100];
int segcnt;
bool cmp(segment a, segment b) {if (a.x == b.x) return a.f < b.f;return a.x < b.x;
}
long long ans;
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) {l[i] = r1[a[i]];r1[a[i]] = i;}memset(l1, 0x3f, sizeof(l1));for (int i = n; i >= 1; i--) {r[i] = l1[a[i]];l1[a[i]] = i;}for (int i = 1; i <= n; i++) r[i] = min(r[i], n + 1);for (int i = 1; i <= n; i++) {segcnt++;seg[segcnt].l = i;seg[segcnt].r = r[i] - 1;seg[segcnt].x = l[i];seg[segcnt].f = 1;segcnt++;seg[segcnt].l = i;seg[segcnt].r = r[i] - 1;seg[segcnt].x = i;seg[segcnt].f = -1;}maketree(1, n, 1);sort(seg + 1, seg + segcnt + 1, cmp);for (int i = 1; i < segcnt; i++) {add(seg[i].l, seg[i].r, 1, seg[i].f);ans += (long long)(seg[i + 1].x - seg[i].x) * (long long)t[1].sum;}cout << ans;return 0;
}

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

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

相关文章

Learn OpenGL 32 PBR光照

光照 在本章节中&#xff0c;我们把重点放在将之前讨论的理论转化为实际的渲染器&#xff0c;这个渲染器将使用直接的&#xff08;或解析的&#xff09;光源&#xff1a;比如点光源&#xff0c;定向灯或聚光灯。 我们先来看看上一个章提到的反射方程的最终版&#xff1a; 我们…

红楼梦人物关系知识图谱构建及推理研究

红楼梦人物关系知识图谱构建及推理研究 前言数据爬取与处理知识图谱构建可视化分析与推理研究总结 前言 《红楼梦》是中国古典文学巅峰之作&#xff0c;其中丰富的人物关系构成了一幅错综复杂的社会画卷。本文将介绍如何利用Python编写爬虫代码&#xff0c;使用Requests库进行…

字符串常量池

特点 1 只要是双引号引起来的字符串都存储在常量池中 2 每次存储字符串的时候&#xff0c;先检查常量池是否有该字符串&#xff0c;如果没有则存储&#xff0c;有则直接使用常量池中的字符串。 示例一&#xff1a; 字符串String由两部分组成&#xff0c;value(存储常量池中的…

Unity-C#进阶——3.27更新中

文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈&#xff0c;泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法&#xff1a;线程之间共享数据&#xff1…

Java智慧工地源码 智慧工地的价值体现 开发一套智慧工地系统需要多少钱

智慧工地是智慧地球理念在工程领域的行业具现&#xff0c;是一种崭新的工程全生命周期管理理念。它运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生…

一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

前面写了个博客《conda&#xff1a;解决多项目开发环境配置的神器&#xff01;》简单介绍了 Conda 的安装和基本命令&#xff0c;在做开发时经常会使用 Conda 建立多个应用环境&#xff0c;Conda 的命令虽不复杂&#xff0c;但还是有时会弄混&#xff0c;所以就考虑写个脚本&am…

day5-QT

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QFontDialog> //字体对话框类 #include<QFont> //字体类 #include<QMessageBox> //消息对话框类 #include<QColorDialog> //颜色对话框类 #include<QColor> //颜…

2024年腾讯云4核8G12M轻量服务器并发数测试,支持多少人?

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

Charles+posten 抓APP包

Charles 是一个比较好用的抓包工具&#xff0c;在实际的工作中&#xff0c;发现一旦模拟器配置了 charles 所在的机器代理&#xff0c;有些app就无法访问网络&#xff0c;这个问题困扰了好几天&#xff0c;最后在书中找到 charles 配合 postern 抓包。 Charles 地址&#xff1…

Springboot+vue的旅游信息推荐系统设计与实现+数据库+论文+数据库表结构文档+免费远程调试

项目介绍: Springbootvue的旅游信息推荐系统设计与实现。Javaee项目&#xff0c;springboot vue前后端分离项目 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot Mybati…

访问者模式(数据与行为解耦)

目录 前言 UML plantuml 类图 实战代码 SimpleFileVisitor FileVisitor 接口 删除指定文件夹 模板 IVisitor IVisitable Client 前言 一个类由成员变量和方法组成&#xff0c;成员变量即是类的数据结构&#xff0c;方法则是类的行为。 如果一个类的数据结构稳定&am…

金融投贷通(金融投资+贷款通)项目准备

金融投贷通&#xff08;金融投资贷款通&#xff09;项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例&#xff1a;张三借给李四5W&#xff0c;约定期满1年后…

畅捷通T+ Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞

一、漏洞信息 漏洞名称&#xff1a;畅捷通T Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞 漏洞类别&#xff1a;远程命令执行漏洞 风险等级&#xff1a;高危 二、漏洞描述 畅捷通TPlus适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企…

AI论文速读 |(Mamba×时空图预测!) STG-Mamba:通过选择性状态空间模型进行时空图学习

&#xff08;来了来了&#xff0c;虽迟但到&#xff0c;序列建模的新宠儿mamba终于杀入了时空预测&#xff01;&#xff09; 论文标题&#xff1a;STG-Mamba: Spatial-Temporal Graph Learning via Selective State Space Model 作者&#xff1a;Lincan Li, Hanchen Wang&…

​网络安全概论——网络加密与密钥管理​

一、网络加密的方式及实现 1、常见的加密算法 常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。 对称加密算法采用单密钥加密&#xff0c;在通信过程中&#xff0c;数据发送方将原始数据分割成固定大小的块&#xff0c;经过密钥和加密算法逐个加密…

LLM应用:Prompt flow vs LangChain

背景 Prompt flow和LangChain都是LLM时代&#xff0c;为高效地构建LLM应用而生。 Prompt flow是Microsoft开源的&#xff0c;其诞生时&#xff0c;LangChain已经很有名气了。 所以作为后生的Prompt flow会为我们带来哪些新的东西呢&#xff1f; ​​​​​​​ Prompt flo…

Solana 低至 0.4 Sol 创建OpenBook市场ID教程

Raydium上线代币之前&#xff0c;需要OpenBook ID&#xff0c;但是Raydium官方提供的链接创建需要花费 3-4 SOL。这成本使得我们对发行代币望而却步。 本篇文章介绍OpenBook的概念和教大家如何更低成本 (最低0.4 SOL) 创建 OpenBook Market ID。 目录 1、Raydium加池子创建为什…

实名羡慕!这些人已经用上了Sora

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 Sora 第三方口碑出炉&#xff0c;或许带给艺术家们最大的好处是&#xff1a;…

C++入门 (1) >>命名空间与缺省参数

1. c与c语言的区别 c兼容c语言90&#xff05;以上的语法与规则&#xff0c;c语言相当于用锤子和凿子制作工艺品&#xff0c;c相当于用电钻&#xff0c;电动雕刻刀制作工艺品。 2. c的框架 #include<iostream> //stdio.h的升级版 using namespace std; //展开命…

【笔记】Python学习记录

Python学习记录 Hello World变量简单数据类型字符串大小写转换插入变量Tab和Enter删除前后空格删除前后缀 Hello World 老调调了&#xff0c;如何在终端输出信息呢&#xff1f; print("Hello World")Hello World变量 变量命名遵从代码变量命名通则&#xff0c;几乎…