牛客周赛 Round 63(构造、组合数、线性基)

文章目录

  • 牛客周赛 Round 63(构造、组合数、线性基)
    • A. 小红的好数
    • B. 小红的好数组
    • C. 小红的矩阵行走(简单思维题)
    • D. 小红的行列式构造(构造、数学题)
    • E. 小红的 red 计数(组合数)
    • F. 小红开灯(线性基)

牛客周赛 Round 63(构造、组合数、线性基)

A. 小红的好数

按照题意判断即可。

#include<bits/stdc++.h>
using namespace std;int main() {string s;cin >> s;if(s.size() == 2 && s[0] == s[1]) cout << "Yes" << endl;else cout << "No" << endl;return 0;
}

B. 小红的好数组

枚举所有区间长度为 k 的子区间即可。

#include<bits/stdc++.h>
using namespace std;const int maxn = 2e5 + 5;
int a[maxn];int main() {int n, k;cin >> n >> k;for(int i = 1; i <= n; i++) cin >> a[i];int res = 0;for(int x = 1; x+k-1 <= n; x++){ // 枚举左端点int cnt = 0;for(int i = 1; i <= k; i++){int l = x + i - 1, r = x + k - i; // 计算对称位置的下标if(l > r) break;if(a[l] != a[r]) cnt++;}		res += (cnt == 1);}cout << res << endl;return 0;
}

C. 小红的矩阵行走(简单思维题)

判断 ( 1 , 1 ) (1,1) (1,1) ( n , n ) (n, n) (n,n) 的路径中,是否存在一条路径满足“路径上有 n + m - 1 个 a [ 1 ] [ 1 ] a[1][1] a[1][1] ”。

#include<bits/stdc++.h>
using namespace std;const int maxn = 100 + 5;
int a[maxn][maxn];int main() {int ncase;cin >> ncase;while(ncase--){int n, m;cin >> n >> m;int first = -1, x;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> x;if(first == -1) first = x;a[i][j] = max(a[i-1][j], a[i][j-1]) + (x == first);}}if(a[n][m] == n + m - 1) cout << "Yes" << endl;else cout << "No" << endl;}return 0;
}

D. 小红的行列式构造(构造、数学题)

看代码。

#include<bits/stdc++.h>
using namespace std;int main() {int x;cin >> x;if(x == -1){	// 一行列式等于 -1 的矩阵,下列通法不满足题目条件的一种情况。cout << "1 1 1" << endl;cout << "2 3 2" << endl;cout << "2 2 1" << endl;  }else{	// 全一矩阵加一个对角线矩阵cout << x+1 << " 1 1" << endl;cout << "1 2 1" << endl;cout << "1 1 1" << endl;        }return 0;
}

E. 小红的 red 计数(组合数)

核心思路,总方案数 - 受反转影响消失的red + 受反转影响出现的red。细节看代码。

设,每次查询,可以把 ( 1 , n ) (1,n) (1,n) 分割为 A、B、C三个区间。

在这里插入图片描述

#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxn = 1e5 + 5;
ll r[maxn], e[maxn], d[maxn];
ll re[maxn], de[maxn], er[maxn], ed[maxn];
ll red[maxn], der[maxn];int main() {int n, q;cin >> n >> q;string s;cin >> s;s = " " + s;for(int i = 1; i <= n; i++) {r[i] = r[i-1] + (s[i] == 'r');e[i] = e[i-1] + (s[i] == 'e');d[i] = d[i-1] + (s[i] == 'd');re[i] = re[i-1] + (s[i] == 'e' ? r[i-1] : 0);de[i] = de[i-1] + (s[i] == 'e' ? d[i-1] : 0);er[i] = er[i-1] + (s[i] == 'r' ? e[i-1] : 0);ed[i] = ed[i-1] + (s[i] == 'd' ? e[i-1] : 0);red[i] = red[i-1] + (s[i] == 'd' ? re[i-1] : 0);der[i] = der[i-1] + (s[i] == 'r' ? de[i-1] : 0);}int x, y;while(q--){cin >> x >> y;ll res = red[n];// A区间提供‘r’,B区间提供‘ed’的情况。  // 注意ed[y] - ed[x-1] 包含‘e’在 A区间,‘d’在 B区间的情况。减去这种情况,得到由 B区间提供的‘ed’,其他同理。res = res - r[x-1] * (ed[y] - ed[x-1] - e[x-1] * (d[y] - d[x-1]));res = res + r[x-1] * (de[y] - de[x-1] - d[x-1] * (e[y] - e[x-1]));// 由 B区间提供 re 的情况。res = res - (d[n] - d[y]) * (re[y] - re[x-1] - r[x-1] * (e[y] - e[x-1]));res = res + (d[n] - d[y]) * (er[y] - er[x-1] - e[x-1] * (r[y] - r[x-1]));// 由 B区间提供 red 的情况。res = res - (red[y] - red[x-1] - r[x-1] * (ed[y] - ed[x-1] - e[x-1] * (d[y] - d[x-1])) - re[x-1] * (d[y] - d[x-1]));res = res + (der[y] - der[x-1] - d[x-1] * (er[y] - er[x-1] - e[x-1] * (r[y] - r[x-1])) - de[x-1] * (r[y] - r[x-1]));cout << res << endl;}return 0;
}

F. 小红开灯(线性基)

构造一个 n 维的向量空间,把第 i 个灯出现的位置映射到一个二进制向量的第 i 维。

第 i 个灯和与其同行同列的灯构成一个空间向量 x,一共可以构造出 n 个向量。

同时,对正在开着的灯,构造一个向量tar。如果在向量集合 X 中,可以选出若干个向量 x 表示出 tar,即问题有解。

对于样例一,构造一个 3 维的向量空间,其集合 X 为:

x1: (1, 1, 1) // 第一个灯与第二、第三个灯同行同列
x2: (1, 1, 0) // 第二个灯与第一个灯同列
x3: (1, 0, 1) // 第三个灯与第一个灯同行

构造出的目标向量tar为:

tar: (1, 0, 0) // 只有第一个灯开着的

在 X 中选择 x1、x2 和 x3 可表示出 tar,即 tar = x1 ^ x2 ^ x3,即样例一有解,对1、2、3 三个灯都操作一次就好。

但,显然,对于更复杂的样例,我们不能轻易的判断出都要选择什么灯来操作。

这里,我们引入’基’ 的概念,对于 n 维向量空间,对每一维都创建一个’基‘,即选择若干个向量,通过异或,可以得到最高位在 i 为 1 的向量。

举个例子,在样例一中:

第一维的基y1为 (1, 1, 1),即 x1
第二维的基y2为 (0, 1, 0), 即 x1 ^ x3
第三维的基y3为 (0, 0, 1), 即 x1 ^ x2

此时,再看目标向量tar,tar 可由 y1 ^ y2 ^ y3 得到,即 (x1) ^ (x1^x3) ^ (X1^x2) = tar,对1、2、3 三个灯都操作(x1、x2、x3 都出现奇数次)。

这里,样例一可能比较特殊,我们把灯的初始状态修改为 001。

此时,tar = (1, 1, 0),通过 y1 ^ y3 可以得到,即 (x1) ^ (x1 ^ x2) ,即对灯 2 进行一次操作即可。

上述描述,只是为了方便大家了解线性基,深入学习移步其他大佬的教学贴。

#include<bits/stdc++.h>
using namespace std;struct liner_base{vector<bitset<101> > a;	// 表示每个维度的基向量 vector<vector<int> > b;		// 表示每个维度的元素集合 int cnt = 0;liner_base(){a.resize(101);b.resize(101);}int insert(bitset<101> x, int id){vector<int> v = {id};for(int i = 100; i >= 0; i--){	// 高位开始遍历 if(x[i]){	// 第 i 位为1 if(a[i].count() == 0){ // 该维度没有被表示,但是可以被当前集合表示 a[i] = x;b[i] = v;cnt++; 		// 统计可以表示几个维度 return 1; 	// 插入成功 }else{	// 当前维度已经被标示,并且 x 有该维度 x ^= a[i];	// 把 x 中该维度去除 for(auto item : b[i]) v.push_back(item);	// 元素集合合并 } }}return 0; }int size(){return cnt;} vector<int> ask(bitset<101> x){vector<int> res;for(int i = 100; i >= 0; i--){if(x[i]){	// 同上 x ^= a[i];for(auto item : b[i]) res.push_back(item);}}if(x.count() != 0) res.clear();return res;}
};int s[105], x[105], y[105];map<int, vector<int> > m_x, m_y;int main() {int n;cin >> n;char c;for(int i = 1; i <= n; i++){cin >> c;s[i] = c - '0';}for(int i = 1; i <= n; i++) cin >> x[i] >> y[i];for(int i = 1; i <= n; i++) m_x[x[i]].push_back(i);for(int i = 1; i <= n; i++) m_y[y[i]].push_back(i);int count = 0;liner_base lb;for(int i = 1; i <= n; i++){bitset<101> tmp;for(auto item : m_x[x[i]]) tmp[item] = 1;for(auto item : m_y[y[i]]) tmp[item] = 1;lb.insert(tmp, i); // 第i个点相关的灯组合成一个元素,插入线性基 count += s[i];}bitset<101> tar;for(int i = 1; i <= n; i++) if(s[i] == 0) tar[i] = 1;  // 所有没开的灯 if(count == n) cout << 0 << endl;else{vector<int> res = lb.ask(tar);if(res.empty()) cout << -1 << endl;	// 线性基不能表示tar else{vector<int> ans(n+1);for(auto id : res) ans[id]++; 	// 统计第 id 个灯操纵了几次int sum = 0;for(int i = 1; i <= n; i++) sum += ans[i] % 2; // 统计所有奇数次的cout << sum << endl;for(int i = 1; i <= n; i++){if(ans[i] & 1){cout << i << " ";}}}}return 0;
}

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

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

相关文章

QT事件与网络通信

闹钟 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTimer> #include <QTextToSpeech> // 添加此行以引入QTextToSpeech类QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWin…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言&#xff0c;在程序中对某些代码进行标注说明&#xff0c;这就是注释的作用&#xff0c;能够大大增强程序的可读性。 注释的分类及语法 注释分为两类&#xff1a;单行注释 和 多行注释。 单行注释 只能注释一行内容&#xff0c;语法如下…

基于springboot管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

B3622 枚举子集

1. 注意dfs内&#xff0c;for循环的遍历&#xff0c;想清楚把什么赋值给a[x] 2.本题只需要把0或1赋值给a[x]所以 #include<bits/stdc.h> using namespace std; int n; int a[20]; int vis[20]; void pr() {for (int i 1; i < n; i) {if (a[i] 0)cout << N;els…

Flink On kubernetes

Apache Flink 是一个分布式流处理引擎&#xff0c;它提供了丰富且易用的API来处理有状态的流处理应用&#xff0c;并且在支持容错的前提下&#xff0c;高效、大规模的运行此类应用。通过支持事件时间&#xff08;event-time&#xff09;、计算状态&#xff08;state&#xff09…

网络分析仪——提升网络性能的关键工具

目录 什么是网络分析仪&#xff1f; 1. 实时流量监控 2. 历史数据回溯分析 3. 网络性能关键指标监测 4. 可视化界面与报告生成 总结 在当今的数字化世界&#xff0c;网络的稳定性和性能直接影响企业的运营效率。网络拥堵、延迟和丢包等问题会导致用户体验的下降&#xff…

Linux常用功能整合

Linux Linux 前言一、常用操作以及概念 快捷键求助关机PATHsudo包管理工具发行版VIM 三个模式GNU开源协议 二、磁盘 磁盘接口磁盘的文件名 三、分区 分区表开机检测程序 四、文件系统 分区与文件系统组成文件读取磁盘碎片blockinode目录日志挂载目录配置 五、文件 文件属性文件…

银行卡基础信息查询 API 对接说明

本文将介绍一种 银行卡基础信息查询 API 对接说明&#xff0c;它可用于银行卡基础信息查询。 接下来介绍下 银行卡基础信息查询 API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 银行卡基础信息查询 API 对应页面申请对应的服务&#xff0c;进入页面之后&#xf…

服务器系统克隆技术

工作任务&#xff1a;克隆对象是Windows server2019 和2022的datacenter版本 条件&#xff1a;在已经完成安装的虚拟机上做克隆 图1-1 用两个服务器的母盘准备进行克隆 第一步&#xff1a;新建一个文件目录用于安放克隆好的服务器 图1-2 创建两个目录用于安放即将克隆好的服务…

Axure科技感元件:打造可视化大屏设计的得力助手

Axure&#xff0c;作为一款专业的原型设计工具&#xff0c;凭借其强大的设计功能、丰富的组件库和灵活的交互能力&#xff0c;成为了许多设计师打造科技感设计的首选工具。其中&#xff0c;Axure科技感元件更是以其独特的魅力和实用性&#xff0c;在数据可视化大屏、登录界面、…

python画图|在三维空间的不同平面上分别绘制不同类型二维图

【1】引言 前序已经完成了基础的二维图和三维图绘制教程探索&#xff0c;可直达的链接包括但不限于&#xff1a; python画图|3D参数化图形输出-CSDN博客 python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客 在学习过程中&#xff0c;发现一个案例&#xff1…

【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

分支与循环 while循环 if与while的对比 if(表达式)语句&#xff1b;while(表达式)语句&#xff1b;下面来看一个例子&#xff1a; 用 if 写&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {if (1)printf("hehe");//if后面条…

Java双亲委派机制讲解和常见问题解决案例示范

1. 引言 Java 的类加载机制是 JVM 运行时系统的核心之一&#xff0c;而其中的双亲委派机制&#xff08;Parent Delegation Model&#xff09;是保证 Java 平台安全性与可扩展性的关键设计。双亲委派机制确保了 Java 体系中类的加载顺序&#xff0c;防止了类的重复加载与覆盖&a…

ARP欺骗的多种手法

学习参考&#xff1a; ARP欺骗的各种d玩法-CSDN博客 https://juejin.cn/post/7383702153892954164 一、什么是ARP欺骗 1.什么是ARP&#xff1f; ARP (Address Resolution Protocol) 是一种网络层协议&#xff0c;用于将 IP 地址转换为物理地址&#xff08;MAC 地址&#xff0…

湖科大-计网真题笔记

09 序列号不涉及首部

前端开发笔记-- 黑马程序员4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 css 三角写法用户界面鼠标样式取消表单轮廓vertical-align文本溢出 html5 新标签多媒体标签视频标签![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d85d…

深入解析 HashMap 的 remove() 方法及其相关实现

HashMap 是 Java 中最常用的集合类之一&#xff0c;它提供了高效的键值对存储和检索功能。本文将详细解析 HashMap 的 remove() 方法及其相关的内部实现&#xff0c;包括 removeNode() 和 removeTreeNode() 方法。通过这些方法&#xff0c;我们可以了解 HashMap 如何高效地移除…

中国剩余定理 C++

题目 解题思路 原链接&#xff1a;https://www.acwing.com/solution/content/3539/ 大致步骤&#xff1a; 将第2,3,4…n个方程不断与第一个方程合并&#xff0c;得到方程a1k1a2k2m2-m1;用扩展欧几里得算法解出a1k1a2k2gcd(a1, a2)的结果&#xff0c;再将结果扩大(m2-m1)/d倍即…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

12.2 Linux_进程间通信_共享内存

概述 什么是共享内存&#xff1a; 共享内存又叫内存映射&#xff0c;可以通过mmap()映射普通文件。 实际上就是将磁盘中的一个文件映射到内存的一个缓冲区中去&#xff0c;这样进程就可以直接将这块空间当作普通内存来访问&#xff0c;不需要再使用I/O中的read/write去访问这…