AtCoder Beginner Contest 355

C - Bingo 2

题意

有一个 n × n n\times n n×n 的网格,初始全白,有 t t t 次操作,每次操作涂黑一个指定的格子。
问执行第几个操作后,有一行或一列或对角线的格子全部被涂黑。

思路

如果暴力判断,那么总时间复杂度是 O ( n 2 t ) O(n^2t) O(n2t) 的,而 n ≤ 2000 , t ≤ 200000 n \le 2000,t \le 200000 n2000,t200000 ,会超时。

我们可以记录每行、每列、主次对角线中被涂黑的格子数量 r i , c i , d 0 , d 1 r_i,c_i,d_0,d_1 ri,ci,d0,d1,每次操作后检查该格子对应的行列对角线的黑格子数是否 = n =n =n 即可。

代码

#include <iostream>
#include <vector>
using namespace std;
int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, t;cin >> n >> t;vector<int> r(n, 0), c(n, 0), d(2, 0);for(int i = 0, num; i < t; i++){cin >> num; num--;int x = num / n, y = num % n;r[x]++; c[y]++;if(x == y) d[0]++;if(x + y == n - 1) d[1]++;if(r[x] == n || c[y] == n || d[0] == n || d[1] == n){cout << i + 1 << endl;return 0;}}cout << -1 << endl;return 0;
}

D - Intersecting Intervals

题意

给定 n n n 个区间 [ l i , r i ] [l_i,r_i] [li,ri],问两两相交的区间对数,交点重叠也算入。

思路

暴力枚举的时间复杂度是 O ( n 2 ) O(n^2) O(n2),不能满足要求。
发现直接求相交的对数不好想,但正难则反,我们可以求出不相交的区间对数 c n t cnt cnt,易知 n ( n − 1 ) 2 − c n t \dfrac{n(n-1)}{2} - cnt 2n(n1)cnt 就是答案。

发现不相交的两个区间 i , j i, j i,j一定满足 r j ≤ l i r_j \le l_i rjli(这里假定区间 j j j 在区间 i i i 左边)。

我们可以用双指针,将 l i l_i li r i r_i ri 分别升序排序。
记对于每个 i i i,满足 r j ≤ l i r_j \le l_i rjli j j j 的个数为 c i c_i ci
由于 r r r 升序,满足 r j ≤ l i r_j \le l_i rjli j j j 递增,因此可以得到以下算法:

按照 i = 1 , 2 , ⋯ , n i=1,2,\cdots,n i=1,2,,n 的顺序执行以下操作:

  1. c = 1 c = 1 c=1
  2. 如果 r c ≤ l i r_c \le l_i rcli,那么 c = c + 1 c=c+1 c=c+1,直到不满足前述条件。
  3. c i = c − 1 c_i=c-1 ci=c1

但稍加分析可以发现,上述算法的时间复杂度仍为 O ( n 2 ) O(n^2) O(n2),我们需要进一步优化。

发现 c i c_i ci 一定不降,所以计算 c i + 1 c_{i+1} ci+1 时,可以直接从 c i c_i ci 开始,这样时间复杂度就可以优化至 $O(n) $。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define int long longsigned main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n;cin >> n;vector<int> l(n), r(n);for(int i = 0; i < n; i++) cin >> l[i] >> r[i];sort(l.begin(), l.end());sort(r.begin(), r.end());int ans = n * (n - 1) / 2, j = 0;for(int i = 0; i < n; i++){while(r[j] < l[i]) j++;ans -= j;}cout << ans << endl;return 0;
}

E - Guess the Sum

题意

交互题。
有一个长度为 2 n 2^n 2n 的序列 a a a,但是你不知道它。你需要用最少的询问次数求出 ( ∑ i = l r a i ) m o d 100 (\sum_{i=l}^r a_i) \mod 100 (i=lrai)mod100 的值。(下标从 0 0 0 开始)。
每次询问给出 i , j i,j i,j,回答 l = 2 i j , r = 2 i ( j + 1 ) − 1 , ( ∑ i = l r a i ) m o d 100 l=2^ij, \ r=2_i(j+1)-1, \ (\sum_{i=l}^r a_i) \mod 100 l=2ij, r=2i(j+1)1, (i=lrai)mod100 的值。

思路

审完题可以想到 ABC349D ,将区间变成左闭右开区间。
但是那题不能将两个区间相减,而本题可以,比如询问 [ 1 , 7 ] [1,7] [1,7],如果按照那题的思路,需要询问区间 [ 1 , 1 ] + [ 2 , 3 ] + [ 4 , 7 ] [1,1]+[2,3]+[4,7] [1,1]+[2,3]+[4,7] 即询问 ( 0 , 1 ) , ( 1 , 1 ) , ( 2 , 1 ) (0,1),(1,1),(2,1) (0,1),(1,1),(2,1),共三个询问。
但是可以用 [ 0 , 7 ] − [ 0 , 0 ] [0,7]-[0,0] [0,7][0,0],即询问 ( 3 , 0 ) , ( 0 , 0 ) (3,0),(0,0) (3,0),(0,0)

于是相当于在一张 2 n 2^n 2n 个点的无向图上,对于所有 i , j i,j i,j,连接 2 i j 2^ij 2ij 2 i ( j + 1 ) 2^i(j+1) 2i(j+1),求 l l l r + 1 r+1 r+1 的最短路。

由于边权为 1 1 1,我们直接 bfs,记录下路径。
接下来遍历路径,考虑如何提问,实际上这很简单,每次查询时往左跳就减去查询的和,往右跳就加上,如果从后往前的话就反过来。

为了省空间,可以不建图,直接bfs时判断(其实没必要)。

代码

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, l, r;cin >> n >> l >> r;r++;int v = 1 << n;vector<int> pre(v + 1, -1);queue<int> q;q.push(l);pre[l] = l;while(q.size()) {int x = q.front();q.pop();for (int i = 1; i <= v; i *= 2) {for (auto y : {x - i, x + i}) {if (y < 0 || y > v) continue;if (pre[y] == -1) {pre[y] = x;q.push(y);}}if (x & i) break;}}int ans = 0;for (int i = r; i != l; i = pre[i]) {int a = pre[i], b = i, t = 1;if (a > b) {swap(a, b);t = -1;}int p = __lg(b - a), q = a / (b - a), res;cout << "? " << p << " " << q << endl;cin >> res;ans = (ans + t * res + 100) % 100;}cout << "! " << ans << endl;return 0;
}

F - MST Query

题意

给你一棵 n n n 个点的带边权的树,有 q q q 次询问,每次询问添加一条边,输出当前的最小生成树的边权和。
所有边权不大于 10 10 10

思路

首先否决掉跑 q q q 次 kruskal 的做法。

可以LCT做,但是这道题中边的权值非常小,那么我们从可以这里找突破口.

考虑维护每个边权选择的数量,算出生成树边权,删边的话,可以维护边权为 i i i 的边所形成的连通性, 这样加一条边权为 i i i 的边时,看有没有边权 > i >i >i 的使得那两点连通,从而决定删除哪条边。但会发现不好维护,因为会产生依赖关系。

为了不依赖其他情况,我们可以用并查集维护边权 $ \le i$ 的边所形成的连通性情况,这样我们就建立 10 10 10 个互不依赖的并查集。

接下来看如何求出最小生成树的边权,关键是求出每个边权的在MST中的个数。由于每加一条边,连通块的个数就会少一。
所以边权为 i i i 使用的个数就是 d i d_i di 的连通块个数减去 d i − 1 d_{i-1} di1 的连通块个数。

代码

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;struct DSU {vector<int> f;DSU() {}DSU(int n){init(n);}void init(int n){f.resize(n);iota(f.begin(), f.end(), 0);}int find(int x){while (x != f[x]) x = f[x] = f[f[x]];return x;}bool same(int x, int y){return find(x) == find(y);}bool merge(int x, int y){x = find(x);y = find(y);if (x == y) return false;f[y] = x;return true;}
};int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, q;cin >> n >> q;vector<DSU> dsu(10, DSU(n));vector<int> cnt(10, n);for(int i = 0, a, b, c; i < n - 1; i++){cin >> a >> b >> c;a--, b--;for(int j = c; j <= 10; j++) cnt[j - 1] -= dsu[j - 1].merge(a, b);}for(int i = 0, u, v, w; i < q; i++){cin >> u >> v >> w;u--, v--;for(int j = w; j <= 10; j++) cnt[j - 1] -= dsu[j - 1].merge(u, v);int ans = 0, last = n;for(int j = 1; j <= 10; j++){ans += j * (last - cnt[j - 1]);last = cnt[j - 1];}cout << ans << endl;}return 0;
}

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

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

相关文章

一文搞懂线性回归模型

1、简单介绍 线性回归模型是一种基础的预测建模技术&#xff0c;用于分析一个或多个自变量&#xff08;特征&#xff09;与因变量&#xff08;目标&#xff09;之间的关系。它的基本假设是目标变量&#xff08;y&#xff09;与特征&#xff08;X&#xff09;之间存在线性关系。…

提升篇---接口和抽象类的本质区别

大家好&#xff0c;这里是教授.F 语法区别&#xff1a; 方法实现&#xff1a;接口中定义的方法默认都是抽象的&#xff0c;不包含方法的实现&#xff1b;而抽象类可以包含抽象方法和具体方法的实现。 多继承&#xff1a;一个类只能继承一个抽象类&#xff0c;但可以实现多个接…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类&#xff1a; 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数&#xff0c;当一个异步请求需要依赖上一个异步请求返回的结果的时候&#xff0c;就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义&#xff1a;RabbitMQ是一个消息中间件&#xff0c;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递…

2024年土建施工员考试题库及答案

一、单选题 1.某工程项目桩基工程采用套管成孔灌注桩&#xff0c;为了保证施工质量&#xff0c;桩管灌满混凝土后开始拔管&#xff0c;按照规定&#xff0c;管内应保持不少于&#xff08;&#xff09;m高的混凝土。 A.1 B.1.5 C.2 D.2.5 答案&#xff1a;C 解析&…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

MySQL-函数/约束

MySQL-函数 distinct-去重 //放在select后 1、字符串函数 SELECT 函数(参数) CONCAT(S1,S2,S3...)-字符串拼接&#xff0c;拼接成一个字符串。 LOWER(str)-将字符串str全部转换为小写。 UPPER(str)-将字符串str全部转换为大写。 LPAD(str,n,pad)-左填充&#xff0c;用字…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

【Python】在【数据挖掘】与【机器学习】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…

基于小波的多元信号降噪-基于马氏距离和EDF统计(MATLAB R2018a)

马氏距离是度量学习中一种常用的距离指标&#xff0c;通常被用作评定数据样本间的相似度&#xff0c;可以应对高维线性分布数据中各维度间非独立同分布的问题&#xff0c;计算方法如下。 &#xff08;1&#xff09;计算样本向量的平均值。 &#xff08;2&#xff09;计算样本向…

Golang:malformed module path “xxx“: missing dot in first path element

首先&#xff0c;这个问题往往是在golang中引入自己创建的包时发生的错误。解决方案如下 解决方案1: 检查被引入包下是否存在go.mod,因为你首先要保证你引入的是一个模块&#xff0c;而不只是一个文件夹&#xff0c;类似python包下init.py。因此&#xff0c;一个列子如下&…

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器&#xff0c;它包含了运行协程的资源&#xff0c;如果线程想运行协程&#xff0c;必须先获取P&#xff0c;P中还包含了可运行的G…

redis-benchmark 基准测试

我们可以通过 redis 自带工具 redis-benchmark 来对 redis 服务器进行性能测试。 我们可以通过简单的 redis-benchmark 命令直接对本地部署的 redis 进行性能测试&#xff0c;不用输入任何的参数。默认情况下&#xff0c;redis-benchmark 会向 redis 服务器使用 50 个并发连接…

零基础直接上手java跨平台桌面程序,使用javafx(二)可视化开发Scene Builder

我们只做实用的东西&#xff0c;不学习任何理论&#xff0c;如果你想学习理论&#xff0c;请去买几大本书&#xff0c;慢慢学去。 NetBeans有可视化工具&#xff0c;但是IntelliJ IDEA对于javafx,默认是没有可视化工具的。习惯用vs的朋友觉得&#xff0c;写界面还要是有一个布局…

永久免费的iPhone,iPad,Mac,iWatch锁屏,桌面壁纸样机生成器NO.105

使用这个壁纸样机生成器&#xff0c;生成iPhone&#xff0c;iPad&#xff0c;Mac&#xff0c;iWatch锁屏&#xff0c;桌面壁纸&#xff0c;展示你的壁纸作品&#xff0c;一眼就看出壁纸好不好看&#xff0c;适不适合 资源来源于网络&#xff0c;免费分享仅供学习和测试使用&am…