牛客小白月赛86 A - F

水盐平衡

  • 思维
  • 判断一下浓度大小,再选择加水还是加盐。
signed main() {int T = 1;T = read();while (T--) {vector<int> a(5);for (int i = 1; i <= 4; ++i) a[i] = read();int t1 = a[1] * a[4], t2 = a[2] * a[3];t1 > t2? puts("S"): puts("Y");}return 0;
}

水平考试

  • 思维
  • 无论多选还是单选,有错的选项 0 0 0 分,没选全满分(小灰灰会填满)。
signed main() {int T = 1;T = read();while (T--) {string s1, s2; cin >> s1 >> s2;bool f = 1;for (auto it: s1) {if (s2.find(it) == -1) {f = 0;break;}}if (s2.size() > 1) f? puts("10"): puts("0");else f? puts("10"): puts("0");}return 0;
}

数组段数

  • 前缀和
  • p r e f i pref_i prefi 表示从 1 1 1 i i i 最少划分多少段。
  • 注意:如果 a i = = a l − 1 a_i==a_{l-1} ai==al1 你得保留从 a l a_l al 开始的那段。
signed main() {int T = 1;
//    T = read();while (T--) {int n = read(), m = read();vector<int> a(n + 1), pref(n + 1);for (int i = 1; i <= n; ++i) a[i] = read();for (int i = 1; i <= n; ++i) {if (a[i] ^ a[i - 1]) pref[i] = 1;pref[i] += pref[i - 1];}while (m--) {int l = read(), r = read();writeln(pref[r] - pref[l - 1] + (a[l - 1] == a[l]));}}return 0;
}

剪纸游戏

  • d f s dfs dfs
  • 题目说明了剪下来的图案不会联通,那么跑 d f s dfs dfs 的时候就记录一下面积,同时筛选出最小的行,列和最大的行,列。如果是一个矩形那么 S = ( l i n e m a x − l i n e m i n ) ⋅ ( c o l u m n m a x − c o l u m n m i n ) S = (line_{max}-line_{min})\cdot(column_{max}-column_{min}) S=(linemaxlinemin)(columnmaxcolumnmin) ,判断并记录答案即可。
string mp[SN];
int n, m;
int d[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
bool vis[SN][SN];
tuple<int, int, int, int, int> dfs(int x, int y) {int x1 = x, y1 = y, x2 = x, y2 = y, sum1 = 1;for (int i = 0; i < 4; ++i) {int xx = x + d[i][0], yy = y + d[i][1];if (xx < 0 || yy < 0 || xx >= n || yy >= m || vis[xx][yy] || mp[xx][yy] == '*') continue;vis[xx][yy] = 1;auto [xs1, ys1, xs2, ys2, sum] = dfs(xx, yy);x1 = min(x1, xs1), y1 = min(y1, ys1);x2 = max(x2, xs2), y2 = max(y2, ys2);sum1 += sum;}return {x1, y1, x2, y2, sum1};
}
signed main() {int T = 1;
//    T = read();while (T--) {n = read(), m = read();for (int i = 0; i < n; ++i) cin >> mp[i];int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < mp[i].size(); ++j) {if (mp[i][j] ^ '*' && !vis[i][j]) {vis[i][j] = 1;auto [x1, y1, x2, y2, sum] = dfs(i, j);if ((x2 - x1 + 1) * (y2 - y1 + 1) == sum) ++ans;}}}write(ans);}return 0;
}

可口蛋糕

  • 前缀和 + 枚举 + 双指针 O ( n ) O(n) O(n) o r or or 线段树 + 二分 O ( n l o g n ) O(nlogn) O(nlogn)
  • 从左往右枚举右端点,在保证 W W W 的情况下,你可以得出区间 [ 1 , j ] [1\;,\;j] [1,j] ,在这个区间选择一个左端点然后减去 1 1 1 到左端点的前缀和,因为是减去所以左端点的选定是区间 [ 1 , j ] [1\;,\;j] [1,j] 的最小值的索引。
  • 双指针左端点就保证 W W W 的情况一直往右移动选出最小值就好,
  • 注意:更新答案一定是满足 W W W 的情况下才能更新。

线段树 c o d e code code

vector<int> w(N), d(N), prefd(N), prefw(N);
struct p {int l, r, Min;
}tr[N << 2];
void pushup(int i) { tr[i].Min = min (tr[ls].Min, tr[rs].Min); }
void build(int i, int l, int r) {tr[i] = {l, r, (int)1e18};if (l == r) {tr[i].Min = prefd[l];return ;}int mid = (l + r) >> 1;build(ls, l, mid), build(rs, mid + 1, r);pushup(i);
}
int query(int i, int l, int r) {if (tr[i].l >= l && tr[i].r <= r) return tr[i].Min;int res = 1e18;if (tr[ls].r >= l) res = min(res, query(ls, l, r));if (tr[rs].l <= r) res = min(res, query(rs, l, r));return res;
}
signed main() {int T = 1;
//    T = read();while (T--) {int n = read(), W = read();for (int i = 1; i <= n; ++i) {prefw[i] = w[i] = read();prefw[i] += prefw[i - 1];}for (int i = 1; i <= n; ++i) {prefd[i] = d[i] = read();prefd[i] += prefd[i - 1];}build(1, 1, n);int res = 0, ans = -1e18, ww = 0;for (int i = 1; i <= n; ++i) {ww += w[i], res += d[i];if (ww >= W) {int pos = upper_bound(prefw.begin() + 1, prefw.begin() + i + 1, ww - W) - prefw.begin();if (!--pos) continue;ans = max({ans, res - query(1, 1, pos), res});}}write(ans);}return 0;
}

双指针 c o d e code code

signed main() {int T = 1;
//    T = read();while (T--) {vector<int> w(N), d(N), prefd(N), prefw(N);int n = read(), W = read();for (int i = 1; i <= n; ++i) {prefw[i] = w[i] = read();prefw[i] += prefw[i - 1];}for (int i = 1; i <= n; ++i) {prefd[i] = d[i] = read();prefd[i] += prefd[i - 1];}int res = 0, ans = -1e18, ww = 0, l = 0, Min = 1e18;for (int i = 1; i <= n; ++i) {ww += w[i], res += d[i];while (ww - W >= prefw[l]) Min = min(Min, prefd[l++]);ans = max({ans, res - Min});}write(ans);}return 0;
}

喜欢序列

  • s e t set set + 树状数组 o r or or 线段树
  • 预处理断点, s e t set set 存断点下标。
  • 考虑加上 w w w l , r l,r l,r 处的关联情况。
    • l l l 与前一个断点相邻, r r r 不为断点。
    • l l l 与前一个断点相邻, r r r 为断点。
    • l l l 与前一个断点不相邻, r r r 不为断点。
    • l l l 与前一个断点不相邻, r r r 为断点。
  • 在断点处的情况考虑更新后两个区间是否能合并即可。
  • 不在断点处更新后则从端点处断开即可。
  • 注意:断点下标可能为 0 o r n 0\;or\;n 0orn 此时不用断开。

树状数组 c o d e code code

vector<int> a(N), tr(N);
signed main() {auto add = [] (int x, int n, int v) {for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;};auto query = [&] (int x, int n) {int ans = 0;for (int i = x; i; i -= lowbit(i)) ans += tr[i];return ans;};int T = 1;
//    T = read();while (T--) {int n = read(), m = read();for (int i = 1; i <= n; ++i) {a[i] = read();add(i, n, a[i] - a[i - 1]);}set<int> endpos;for (int i = 1; i <= n; ++i) {if (a[i] ^ (a[i - 1] + 1)) endpos.insert(i - 1);}endpos.insert(0), endpos.insert(n);int s = 0, pre = 0;for (auto it: endpos) {s += (it - pre) * (it - pre);pre = it;}auto powt = [&] (int x) {return x * x;};while (m--) {int l = read(), r = read(), w = read();if (!w) {writeln(s);continue;}add(l, n, w), add(r + 1, n, -w);auto pos1 = endpos.lower_bound(l), pos2 = endpos.lower_bound(r);if (l == *prev(pos1) + 1 && r ^ *pos2) {if (*prev(pos1)) {int v1 = query(l - 1, n), v2 = query(l, n);if (v1 + 1 == v2) {int t1 = powt(*pos1 - *prev(pos1)), t2 = powt(*prev(pos1) - *prev(prev(pos1)));int t3 = powt(*pos1 - *prev(prev(pos1)));s = s - t1 - t2 + t3;endpos.erase(l - 1);}}int t1 = powt(*pos2 - *prev(pos2));int t2 = powt(*pos2 - r), t3 = powt(r - *prev(pos2));s = s - t1 + t2 + t3;endpos.insert(r);}else if (l == *prev(pos1) + 1 && r == *pos2) {if (*prev(pos1)) {int v1 = query(l - 1, n), v2 = query(l, n);if (v1 + 1 == v2) {int t1 = powt(*pos1 - *prev(pos1)), t2 = powt(*prev(pos1) - *prev(prev(pos1)));int t3 = powt(*pos1 - *prev(prev(pos1)));s = s - t1 - t2 + t3;endpos.erase(l - 1);}}if (r ^ n) {int v1 = query(r, n), v2 = query(r + 1, n);if (v1 + 1 == v2) {int t1 = powt(*next(pos2) - r), t2 = powt(r - *prev(pos2));int t3 = powt(*next(pos2) - *prev(pos2));s = s - t1 - t2 + t3;endpos.erase(r);}}}else if (l ^ (*prev(pos1) + 1) && r == *pos2) {if (r ^ n) {int v1 = query(r, n), v2 = query(r + 1, n);if (v1 + 1 == v2) {int t1 = powt(*next(pos2) - r), t2 = powt(r - *prev(pos2));int t3 = powt(*next(pos2) - *prev(pos2));s = s - t1 - t2 + t3;endpos.erase(r);}}int t1 = powt(*pos1 - *prev(pos1));int t2 = powt(*pos1 - l + 1), t3 = powt(l - 1 - *prev(pos1));s = s - t1 + t2 + t3;endpos.insert(l - 1);}else if (l ^ (*prev(pos1) + 1) && r ^ *pos2) {int t1 = powt(*pos1 - *prev(pos1));int t2 = powt(*pos1 - l + 1), t3 = powt(l - 1 - *prev(pos1));s = s - t1 + t2 + t3;endpos.insert(l - 1);t1 = powt(*pos2 - *prev(pos2));t2 = powt(*pos2 - r), t3 = powt(r - *prev(pos2));s = s - t1 + t2 + t3;endpos.insert(r);}writeln(s);}}return 0;
}

线段树 c o d e code code

vector<int> a(N);
struct p {int l, r, v, tag;
}tr[N << 2];
void build(int i, int l, int r) {tr[i] = {l, r, 0, 0};if (l == r) {tr[i].v = a[l];return ;}int mid = (l + r) >> 1;build(ls, l, mid), build(rs, mid + 1, r);
}
void pushdown(int i) {if (tr[i].tag) {tr[ls].tag += tr[i].tag, tr[rs].tag += tr[i].tag;tr[ls].v += (tr[ls].r - tr[ls].l + 1) * tr[i].tag;tr[rs].v += (tr[rs].r - tr[rs].l + 1) * tr[i].tag;tr[i].tag = 0;}
}
void modify(int i, int l, int r, int k) {if (tr[i].l >= l && tr[i].r <= r) {tr[i].tag += k;tr[i].v += k;return ;}pushdown(i);if (tr[ls].r >= l) modify(ls, l, r, k);if (tr[rs].l <= r) modify(rs, l, r, k);
}
int query(int i, int pos) {if (tr[i].l == tr[i].r) return tr[i].v;pushdown(i);if (pos <= tr[ls].r) return query(ls, pos);else return query(rs, pos);
}
signed main() {int T = 1;
//    T = read();while (T--) {int n = read(), m = read();for (int i = 1; i <= n; ++i) a[i] = read();build(1, 1, n);set<int> endpos;for (int i = 1; i <= n; ++i) {if (a[i] ^ (a[i - 1] + 1)) endpos.insert(i - 1);}endpos.insert(0), endpos.insert(n);int s = 0, pre = 0;for (auto it: endpos) {s += (it - pre) * (it - pre);pre = it;}auto powt = [&] (int x) {return x * x;};for (int i = 1; i <= m; ++i) {int l = read(), r = read(), w = read();if (!w) {writeln(s);continue;}modify(1, l, r, w);auto pos1 = endpos.lower_bound(l), pos2 = endpos.lower_bound(r);if (l == *prev(pos1) + 1 && r ^ *pos2) {if (*prev(pos1)) {int v1 = query(1, l - 1), v2 = query(1, l);if (v1 + 1 == v2) {int t1 = powt(*pos1 - *prev(pos1)), t2 = powt(*prev(pos1) - *prev(prev(pos1)));int t3 = powt(*pos1 - *prev(prev(pos1)));s = s - t1 - t2 + t3;endpos.erase(l - 1);}}int t1 = powt(*pos2 - *prev(pos2));int t2 = powt(*pos2 - r), t3 = powt(r - *prev(pos2));s = s - t1 + t2 + t3;endpos.insert(r);}else if (l == *prev(pos1) + 1 && r == *pos2) {if (*prev(pos1)) {int v1 = query(1, l - 1), v2 = query(1, l);if (v1 + 1 == v2) {int t1 = powt(*pos1 - *prev(pos1)), t2 = powt(*prev(pos1) - *prev(prev(pos1)));int t3 = powt(*pos1 - *prev(prev(pos1)));s = s - t1 - t2 + t3;endpos.erase(l - 1);}}if (r ^ n) {int v1 = query(1, r), v2 = query(1, r + 1);if (v1 + 1 == v2) {int t1 = powt(*next(pos2) - r), t2 = powt(r - *prev(pos2));int t3 = powt(*next(pos2) - *prev(pos2));s = s - t1 - t2 + t3;endpos.erase(r);}}}else if (l ^ (*prev(pos1) + 1) && r == *pos2) {if (r ^ n) {int v1 = query(1, r), v2 = query(1, r + 1);if (v1 + 1 == v2) {int t1 = powt(*next(pos2) - r), t2 = powt(r - *prev(pos2));int t3 = powt(*next(pos2) - *prev(pos2));s = s - t1 - t2 + t3;endpos.erase(r);}}int t1 = powt(*pos1 - *prev(pos1));int t2 = powt(*pos1 - l + 1), t3 = powt(l - 1 - *prev(pos1));s = s - t1 + t2 + t3;endpos.insert(l - 1);}else if (l ^ (*prev(pos1) + 1) && r ^ *pos2) {int t1 = powt(*pos1 - *prev(pos1));int t2 = powt(*pos1 - l + 1), t3 = powt(l - 1 - *prev(pos1));s = s - t1 + t2 + t3;endpos.insert(l - 1);t1 = powt(*pos2 - *prev(pos2));t2 = powt(*pos2 - r), t3 = powt(r - *prev(pos2));s = s - t1 + t2 + t3;endpos.insert(r);}writeln(s);}}return 0;
}

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

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

相关文章

Winform使用Webview2(Edge浏览器核心)实现精美教程目录

TOC 简介 使用 Microsoft Edge WebView2 控件&#xff0c;可以使用基于Chromium的 Microsoft Edge 作为呈现引擎&#xff0c;在应用程序中托管 Web 内容。通过本地HTML作为界面实现精美软件。 WebView2优势具体参考 Web 生态系统和技能集。 利用 web 生态系统中存在的整个 w…

【力扣刷题练习】103. 二叉树的锯齿形层序遍历

题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 题目解答&#xff1a; class Solution { p…

短信发送平台上线公告

亲爱的用户们&#xff1a; 我们满怀喜悦地向您宣告&#xff0c;经过精心筹备与严格测试&#xff0c;我们的全新在线短信发送平台已正式上线运营&#xff01; 这是一个专为高效便捷的短信沟通而生的平台。在这里&#xff0c;您可以轻松实现给他人发送短信的服务&#xff0c;无…

编程羔才生-前端访问后端出现read ECONNRESET

排查了原因后发现是node的版本太低的问题造成的&#xff0c;所以升级了下node版本&#xff0c;就好了&#xff01; 基本按照这个顺序排&#xff0c;但node的版本问题却是最后一个解决办法&#xff0c;所以签名时间都浪费了。所以分享! 根据网路资料&#xff0c;解决顺序&…

Python实现离散选择泊松模型(Poisson算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 泊松分布&#xff08;一种离散分布&#xff09;&#xff0c;泊松分布适合于描述单位时间内随机事件发生…

Ubuntu22.04安装GitLab

如果我们是自己本地进行开发,使用Git的简单版本管理功能即可。但如果要做协同开发,使用GitLab自己部署Git代码仓库,是一个不错的选择。 笔者曾使用过svn和Git,相比较而言,Git的使用体验更好。 那么我们接下来安装一下。 安装 首先是升级下包源信息 sudo apt update …

ESP32-HTTP_webServer库(Arduino)

ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器&#xff0c;具有丰富的网络和通信功能。其中之一就是支持HTTP协议&#xff0c;这使得ESP32可以用于创建Web服务器。 HTTP是什么&#xff1f; HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;即超文本传…

Find My相机|苹果Find My技术与相机结合,智能防丢,全球定位

相机是一种利用光学成像原理形成影像并使用底片记录影像的设备&#xff0c;是用于摄影的光学器械。相机让我们能够记录下美丽的风景和珍贵的时刻。当我们到达一个迷人的地方,或者经历了一个特别难忘的时刻时,我们可以使用照相机来拍摄照片,记录下这些美好的回忆。照相机可以帮助…

【算法详解】力扣240.搜索二维矩阵II

一、 题目描述 力扣链接&#xff1a;力扣240.搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 二、思路分析 题目提到该矩阵是从左到右&am…

第90讲:MySQL数据库主从复制集群原理概念以及搭建流程

文章目录 1.MySQL主从复制集群的核心概念1.1.什么是主从复制集群1.2.主从复制集群中的专业术语1.3.主从复制集群工作原理1.4.主从复制中的小细节1.5.搭建主从复制集群的前提条件1.6.MySQL主从复制集群的架构信息 2.搭建MySQL多实例环境2.1.在mysql-1中搭建身为主库的MySQL实例2…

【学习iOS高质量开发】——对象、消息、运行期

文章目录 一、理解“属性”这一概念1.如何定义实例变量2.什么是不兼容现象&#xff0c;如何解决3.理解property关键字4.理解dynamic关键字5.属性特质1.原子性&#xff1a;2.读/写权限&#xff1a;3.内存管理语义 7.要点 二、在对象内部尽量直接访问实例变量1.直接访问和属性访问…

Redis 缓存与数据库双写不一致如何解决

Redis缓存与数据库双写不一致是一个常见的挑战&#xff0c;但可以通过一些方法来解决或减轻这种不一致性。以下是一些可能的解决方案&#xff1a; 事务处理&#xff1a; 在进行缓存和数据库双写时&#xff0c;确保它们被包含在同一事务中。这可以通过使用支持事务的数据库和Red…

高耐用性广西桉木工地模板 — 建筑模板专业批发厂家

对于任何建筑项目而言&#xff0c;选择合适的模板材料是确保工程质量和施工安全的基础。我们能强优品木业的广西桉木工地模板&#xff0c;以其卓越的耐用性和专业的批发供应&#xff0c;成为了建筑行业的优选。 产品特点 卓越耐用性&#xff1a;选择高品质广西桉木&#xff0c…

[EFI]ASUS Tuf Gamming B550m Plus+AMD Ryzen 5 4650G电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Asus TUF Gamming B550m Plus WIFI 处理器 AMD Ryzen 5 4650G 已驱动内存32GB (4 x 8GB) Asgard RGB 3200已驱动硬盘Samsung 970 Pro 512Gb已驱动显卡Sapphire RX 6600XT已驱动声卡ALCS-1200A已驱动网卡RTL8125 2.5GbE已驱动无线网卡蓝牙BCM94360CDSono…

注解实现校验接口传参是否超出取值范围

文章目录 1、定义注解2、使用注解3、其余校验实现思路2.04、其余校验实现思路3.0 写接口&#xff0c;Dto里很多字段要检验传参范围&#xff0c;自定义个注解来校验。 1、定义注解 注解定义代码&#xff1a; import javax.validation.Constraint; import javax.validation.Con…

meshgrid contour contourf

meshgrid contour contourf 参考video: https://www.bilibili.com/video/BV1qW411A775/?spm_id_from333.337.search-card.all.click&vd_sourced171c31a396363b8ea8c0e92a59cee6b 官方文档: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html#ma…

Cesium坐标系统

前言 补一篇Cesium坐标系知识&#xff0c;草草开稿竟把GIS中重中之重的坐标系抛之脑后&#xff0c;实在草率&#xff0c;各位道友招待不周&#xff01; 坐标系是一切花里胡哨的基础与开端&#xff0c;倘若坐标系不能明确展示、计算、分析结果将毫无意义&#xff0c;由于Cesium起…

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写&#xff1a;RTC。显示年、月、日、时、分、秒、星期,自动计算闰年&#xff0c;能够区分每个月的天数。 RTC特点&#xff1a;能从RTC获取到具体的日期时间&#xff0c;断掉后再开机时间仍然准确&#xff08;需要纽扣电池&#xff…

Java中的访问修饰符

目录 public 修饰符&#xff1a; protected 修饰符&#xff1a; private 修饰符&#xff1a; 访问修饰符用于控制类的可见性。在Java中&#xff0c;有四种访问修饰符&#xff1a; public&#xff1a;公共的&#xff0c;可以被任何类访问。protected&#xff1a;受保护的&am…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…