牛客:Holding Two,Inverse Pair,Counting Triangles

news2024/10/9 11:21:32

Holding Two

题目描述

登录—专业IT笔试面试备考平台_牛客网

​运行代码

#include<bits/stdc++.h>
using namespace std;
const int N=3e4+5;
string s1,s2; 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++){
		if(i&1){
			s1+='0';
			s2+='1';
		} 
		else{
			s1+='1';
			s2+='0';
		} 
	}
	for(int i=0;i<n/2;i++){
		if(i&1) 
            cout<<s1<<endl<<s1<<endl;
		else 
            cout<<s2<<endl<<s2<<endl;
	}
	if(n&1){
		if((n/2)&1) 
            cout<<s1<<endl;
		else 
            cout<<s2<<endl;
	} 
	return 0;
} 

代码思路

  • nm:通过cin从标准输入读取两个整数,分别表示矩阵的行数和列数。
  • s1s2:定义了两个string类型的变量,用于存储构建矩阵每行字符串的两种基本模式。
  • 通过一个循环从i = 0i < m来构建s1s2
  • i为奇数(i & 1为真)时,s1添加字符'0's2添加字符'1'
  • i为偶数(i & 1为假)时,s1添加字符'1's2添加字符'0'
  • 最终s1s2分别是长度为m的由01交替组成的字符串,且s1s2的对应位不同
  • 首先处理行数为偶数的情况(n为偶数):
  • 通过一个循环从i = 0i < n / 2来构建矩阵的前n / 2行。
  • i为奇数(i & 1为真)时,连续输出两次s1,即输出两行相同的由01组成的字符串,对应矩阵中的两行。
  • i为偶数(i & 1为假)时,连续输出两次s2,对应矩阵中的另外两行。
  • 然后处理行数为奇数的情况(n为奇数):
  • 通过判断(n / 2) & 1来确定最后一行输出s1还是s2。如果(n / 2)为奇数,则输出s1;如果(n / 2)为偶数,则输出s2

Inverse Pair

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
int a[maxn], c[maxn], n;
bool v[maxn];

int lowbit(int n) {
    return n & (-n);
}

void add(int x) {
    while (x <= n + 1) {
        c[x]++;
        x += lowbit(x);
    }
}

int ask(int x) {
    int sum = 0;
    while (x > 0) {
        sum += c[x];
        x -= lowbit(x);
    }
    return sum;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    reverse(a + 1, a + n + 1);
    long long ans = 0;

    for (int i = 1; i <= n; i++) {
        if (!v[a[i]]) {
            a[i]++;
        }
        ans += ask(a[i] - 1);
        add(a[i]);
        v[a[i]] = true;
    }

    cout << ans << endl;
    return 0;
}

代码思路

  • maxn:定义了一个常量,表示数组的最大长度,用于确定数组的大小,避免数组越界。
  • a数组:用于存储输入的排列a_1...n{}
  • c数组:这是一个树状数组,用于辅助计算逆序对数。
  • n:通过输入获取,表示排列的长度。
  • v数组:用于标记某个数是否已经在处理过程中被使用过,是一个布尔类型的数组。
  • lowbit函数:用于获取一个数的二进制表示中最低位的所对应的数值。这是树状数组中常用的操作,用于快速定位和更新树状数组中的节点。
  • add函数:用于在树状数组中对指定位置的元素进行更新。它会从给定的位置开始,向上更新所有包含该位置的父节点,更新方式是将对应节点的值加。
  • ask函数:用于查询树状数组中从到指定位置的所有元素之和。它通过不断减去当前位置的lowbit值,获取到所有需要累加的节点,并返回累加的结果。
  1. 通过cin读取排列的长度,然后再读取a_1...n{}排列的各个元素。将排列反转,这一步操作可能是为了方便后续从后往前处理排列,以便更好地利用树状数组计算逆序对数。
  2. 初始化一个变量ans为,用于累加逆序对数。从i=1到i=n遍历反转后的排列。
    • 将当前元素标记为已使用(即v[a[i]]设置为true)。
    • 调用add(a[i])在树状数组中更新当前元素的位置,将对应节点的值加,以便后续计算其他元素的逆序对数时使用。
    • 通过ask(a[i] - 1)查询树状数组中小于当前元素的元素个数,并累加到ans中。这一步计算了当前元素与前面已经处理过的元素形成的逆序对数。
    • 如果当前元素没有被标记过(即v[a[i]]false),则将其加。这一步操作是在选择合适的,使得,通过将部分元素加来调整序列,以减少逆序对数。
  3. 输出部分:最后输出计算得到的最小逆序对数ans

Counting Triangles

题目描述

登录—专业IT笔试面试备考平台_牛客网

链接:https://ac.nowcoder.com/acm/contest/90188/J
来源:牛客网

namespace GenHelper
{
    unsigned z1,z2,z3,z4,b,u;
    unsigned get()
    {
        b=((z1<<6)^z1)>>13;
        z1=((z1&4294967294U)<<18)^b;
        b=((z2<<2)^z2)>>27;
        z2=((z2&4294967288U)<<2)^b;
        b=((z3<<13)^z3)>>21;
        z3=((z3&4294967280U)<<7)^b;
        b=((z4<<3)^z4)>>12;
        z4=((z4&4294967168U)<<13)^b;
        return (z1^z2^z3^z4);
    }
    bool read() {
      while (!u) u = get();
      bool res = u & 1;
      u >>= 1; return res;
    }
    void srand(int x)
    {
        z1=x;
        z2=(~x)^0x233333333U;
        z3=x^0x1234598766U;
        z4=(~x)+51;
      	u = 0;
    }
}
using namespace GenHelper;
bool edge[8005][8005];
int main() {
  int n, seed;
  cin >> n >> seed;
  srand(seed);
  for (int i = 0; i < n; i++)
    	for (int j = i + 1; j < n; j++)
        	edge[j][i] = edge[i][j] = read();
 	return 0;
}

运行代码

#include <iostream>
#include <array>

class GenHelper {
public:
    unsigned z1, z2, z3, z4, b, u;

    unsigned get() {
        b = ((z1 << 6) ^ z1) >> 13;
        z1 = ((z1 & 4294967294U) << 18) ^ b;
        b = ((z2 << 2) ^ z2) >> 27;
        z2 = ((z2 & 4294967288U) << 2) ^ b;
        b = ((z3 << 13) ^ z3) >> 21;
        z3 = ((z3 & 4294967280U) << 7) ^ b;
        b = ((z4 << 3) ^ z4) >> 12;
        z4 = ((z4 & 4294967168U) << 13) ^ b;
        return z1 ^ z2 ^ z3 ^ z4;
    }

    bool read() {
        while (!u) u = get();
        bool res = u & 1;
        u >>= 1;
        return res;
    }

    void srand(int x) {
        z1 = x;
        z2 = (~x) ^ 0x233333333U;
        z3 = x ^ 0x1234598766U;
        z4 = (~x) + 51;
        u = 0;
    }
};

int main() {
    int n, seed;
    std::cin >> n >> seed;
    GenHelper helper;
    helper.srand(seed);
    bool edge[8005][8005] = {false};
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            edge[j][i] = edge[i][j] = helper.read();
        }
    }

    long long ans = 0;
    for (int i = 0; i < n; i++) {
        std::array<long long, 2> cnt = {0, 0};
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            cnt[edge[i][j]]++;
        }
        ans += cnt[0] * cnt[1];
    }

    ans = 1LL * n * (n - 1) * (n - 2) / 6 - ans / 2;
    std::cout << ans << "\n";
    return 0;
}

代码思路

计算一个无向完全图中同色三角形(即三个顶点构成的三角形三条边颜色相同)的数量。通过给定顶点数量n和随机数生成器种子seed,利用特定的随机生成方式生成图的边颜色,然后计算同色三角形的数量并输出结果。

  1. 变量

    • n:表示无向完全图的顶点数量。
    • seed:随机数生成器的种子。
    • edge[8005][8005]:二维布尔数组,用于存储无向完全图的边颜色,edge[i][j]=1表示顶点i到顶点j的边为黑色,否则为白色。
    • ans:用于存储最终的同色三角形数量。
    • cnt:长度为 2 的数组,用于统计与某个顶点相连的边中黑色边和白色边的数量。
  2. GenHelper

    • 这个类用于生成随机数和读取随机生成的布尔值,以确定图中边的颜色。
    • 成员变量:z1z2z3z4bu:用于内部的随机数生成算法。
    • 成员函数:
      • get():通过一系列位运算生成一个随机数。
      • read():读取一个随机生成的布尔值。如果u为 0,则调用get()生成新的随机数,然后取u的最低位作为结果,并将u右移一位。
      • srand(int x):设置随机数生成器的种子,初始化z1z2z3z4u
  3. 输入部分:从标准输入读取顶点数量n和随机数生成器种子seed。创建GenHelper对象helper,并使用seed调用srand方法初始化随机数生成器。

  4. 生成图的边颜色:使用两个嵌套的循环遍历图的所有边(不包括自环),对于每条边(i, j),调用helper.read()获取一个随机布尔值,确定边的颜色,并将结果存储在edge数组中。

  5. 计算同色三角形数量:初始化变量ans为 0。

    • 对于每个顶点i
      • 创建一个长度为 2 的数组cnt,用于统计与顶点i相连的边中黑色边和白色边的数量。
      • 遍历所有顶点jj不等于i),根据edge[i][j]的值更新cnt数组。
      • ans增加cnt[0] * cnt[1],表示以顶点i为一个顶点的异色三角形数量。
    • 最终的同色三角形数量等于总三角形数量减去异色三角形数量的一半。总三角形数量为n * (n - 1) * (n - 2) / 6,因为从n个顶点中选三个顶点的组合数为这个值。而异色三角形被计算了两次,所以要除以 2。
  6. 输出部分:输出计算得到的同色三角形数量ans

通过随机生成图的边颜色,然后利用组合数学的原理计算异色三角形的数量,进而得到同色三角形的数量。对于每个顶点,统计与其相连的边中黑色边和白色边的数量,通过组合数的计算可以得到以该顶点为一个顶点的异色三角形数量。最后通过总三角形数量减去异色三角形数量的一半得到同色三角形数量。

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

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

相关文章

架构师:Spring Cloud Gateway 的技术指南

1、简述 Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个重要组件,作为微服务架构的 API 网关,它为路由、限流、安全、监控等功能提供了全面支持。相比传统的 Zuul 网关,Spring Cloud Gateway 使用了非阻塞的 WebFlux 框架,性能上有了显著提升,并且提供了更现代化…

BLE MESH学习2——自定义MESH网络架构思考

BLE MESH学习2——自定义MESH网络架构思考 基于对WCH CH582这款单片机的了解&#xff0c;其可以实现mesh配网、朋友节点、低功耗节点和中继节点的角色&#xff0c;基本功能无问题。在此基础上&#xff0c;考虑满足IoT需求的MESH架构设计&#xff0c;作为后续设计的“白皮书”。…

构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程

最近要实现一个类似导播台的功能&#xff0c;于是我先用 FFmpeg 实现一个参考对照的 Demo&#xff0c;我将其整理为一篇文章&#xff0c;方便后续大家或者和自己参考&#xff01; 1、软件工具介绍 本次部署相关软件 / 工具如下&#xff1a; FFmpeg&#xff1a;全称是 Fast Fo…

java脚手架系列1--模块化、多环境

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…

kkFileView 4.4.0最新版本发行版安装包部署及使用文档

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 一. 下载&部署 下载最新发行包&…

网络层协议 --- IP

序言 在这篇文章中我们将介绍 IP协议&#xff0c;经过这篇文章的学习&#xff0c;我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网&#xff0c;公网到底又是什么&#xff0c;区别是什么&#xff1f; IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…

Java中String类的常见操作Api

目录 String类的常见操作 1).int indexOf (char 字符) 2).int lastIndexOf(char 字符) 3).int indexOf(String 字符串) 4).int lastIndexOf(String 字符串) 5).char charAt(int 索引) 6).Boolean endWith(String 字符串) 7).int length() 8).boolean equals(T 比较对象) 9).b…

【2024】作为前端开发,必须掌握的 Vue3 的 5 个组合式 API 方法

引言&#xff1a;2024 你还不知道 Vue3 的 defineProps、defineEmits、defineExpose、defineOptions 和 defineSlots 吗&#xff1f;这几个 Vue3 组合式 API 方法不仅开发常用&#xff08;涉及组件通信、组件复用等&#xff09;&#xff0c;在面试中也是不可或缺的一部分&#…

SpringBoot实现电子文件签字+合同系统!

一、前言 二、项目源码及部署 1、项目结构及使用框架 2、项目下载及部署 三、功能展示 一、前言 今天公司领导提出一个功能,说实现一个文件的签字+盖章功能,然后自己进行了简单的学习,对文档进行数字签名与签署纸质文档的原因大致相同,数字签名通过使用计算机加密来验证 (…

LabVIEW提高开发效率技巧----阻塞时钟

在LabVIEW开发中&#xff0c;阻塞时钟&#xff08;Blocking Timed Loops&#xff09;是一种常见且强大的技术&#xff0c;尤其适用于时间关键的应用。在这些应用中&#xff0c;精确控制循环的执行频率是关键任务。阻塞时钟通过等待循环的执行完成后再进入下一次迭代&#xff0c…

鸿蒙 Next 实战: 烟花模拟器

前言 通过上一篇文章可以看出&#xff0c;要在鸿蒙应用中实现特别炫的特效还是比较复杂。动画固然重要&#xff0c;但如果在赶工期的情况下&#xff0c;大家都会优先业务&#xff0c;那有没有简单快速的方法呢&#xff1f; 有的&#xff0c;也用像 Android 和 iOS 里 WebView …

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

宝兰德亮相2024国际信息通信展:数智创新,信创力量!

9月25日-27日&#xff0c;2024中国国际信息通信展览会在北京国家会议中心隆重召开。本届展会以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;全面展示信息通信业发展最新成果。作为国内领先的基础软件供应商&#xff0c;宝兰德再度闪耀会场&#xff0c;在…

[ROS】rqt工具箱

作用&#xff1a; 可以方便的实现 ROS 可视化调试&#xff0c;并且在同一窗口中打开多个部件&#xff0c;提高开发效率&#xff0c;优化用户体验。 组成&#xff1a; rqt工具箱组成有三大部分 rqt 核心实现&#xff0c;开发人员无需关注 rqt_common_plugins rqt…

Gated Transformer Networks for Multivariate Time Series Classification

博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类&#xff0c;Transformer&#xff0c;门控 摘要 用于时间序列分类的深度学习模型&#xff08;主要是卷积网…

GO网络编程(七):海量用户通信系统5:分层架构

P323开始&#xff08;尚硅谷GO教程&#xff09;老韩又改目录结构了&#xff0c;没办法&#xff0c;和之前一样&#xff0c;先说下目录结构&#xff0c;再给代码&#xff0c;部分代码在之前讲过&#xff0c;还有知识的话由于本人近期很忙&#xff0c;所以这些就不多赘述了&#…

【源码+文档】基于SpringBoot+Vue的健康宝个人健康管理平台

一、项目技术架构&#xff1a; 本项目是一款基于SpringBootVue的个人健康信息管理系统。后端采用SpringBoot架构&#xff0c;前端采用VueElementUI实现页面的快速开发&#xff0c;并使用关系型数据库MySQL存储系统运行数据。本系统分为两种角色&#xff0c;分别是系统管理员&a…

DS入门引言(0)

文章目录 前言一、什么是数据结构&#xff1f;二、什么是算法&#xff1f;三、数据结构与算法的重要性&#xff1f;四、如何学习它们&#xff1f;总结 前言 是的&#xff0c;我又开了一个专栏&#xff0c;数据结构&#xff08;Data Structure&#xff09;&#xff0c;其实数据结…

【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;详解1. 特征与结构CNN的基本结构 2. 应用场景3. 代码示例 二、循环神经网络&#xff08;RNN&#xff09;详解1. 网络结构与特点RNN的基本结构 2. 应用场景3. 代码示例 三、CNN与RNN的异同点1. 相同点2. 不同点 四、CNN与R…