牛客:Holding Two,Inverse Pair,Counting Triangles

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.rhkb.cn/news/448013.html

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

相关文章

jvm内存溢出问题排查Java服务自动停止问题排查

Java服务自动停止&#xff0c;Java服务内存溢出问题解决记录。 过程描述 服务器上的一个项目突然服务不了了&#xff0c;登录服务器一看&#xff0c;服务被停了&#xff0c;第一反应大概率就是内存溢出导致的&#xff0c;结果查看日志没有任何报错&#xff0c;就很奇怪&#…

鸿蒙开发案例:HarmonyOS NEXT语法实现2048

【实现的功能】 • 游戏逻辑&#xff1a;实现了2048游戏的核心逻辑&#xff0c;包括初始化游戏盘面、添加随机方块、处理四个方向的滑动操作等。 • UI展示&#xff1a;构建了游戏的用户界面&#xff0c;显示得分、游戏盘面&#xff0c;并提供了重新开始按钮。 • 用户交互&…

OpenAI 公布了其新 o1 模型家族的元提示(meta-prompt)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火&#xff0c;国内头部平台型公司一拥而上&#xff0c;先后发布AGI或垂类LLM&#xff0c;但鲜有大模型基础设施在数据层面的进化&#xff0c;比如向量数据库。 在此之前&#xff0c;向量数据库经历了几年的沉寂期&#xff0c;现在似乎终于乘着Ch…

python 位运算 笔记

起因&#xff0c; 目的: 位运算&#xff0c;令我头疼的地方。算法题里面也是经常见到。 位运算。 按位或&#xff0c;OR, | , 只要有一个为1&#xff0c; 结果就是1&#xff0c;否则为0按位异或&#xff0c;XOR, ^, 2个数不同&#xff0c;结果为1&#xff0c; 否则为0&#…

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

【Matlab 六自由度机器人】笛卡尔空间规划和关节空间规划(附MATLAB建模代码)

笛卡尔空间规划和关节空间规划 近期更新前言正文1. 笛卡尔空间规划特点&#xff1a;步骤&#xff1a; 2. 关节空间规划特点&#xff1a;步骤&#xff1a; 3. 两种方法的区别4. MATLAB代码&#xff1a;机械臂避障路径规划问题和解答4.1 关节空间规划方法4.2 笛卡尔空间规划方法4…

Java中关于算数运算符的理解

在Java中基本的算数运算符有五类 加减-乘*在编程语言中乘号一律写为 *除/在Java中两个整数相除结果还是整数取余%取得的是两个数相除的余数 这里可以看见&#xff0c;在输出加法和减法时&#xff0c;我在后面多加了一个括号&#xff0c;这是因为运算优先级的原因&#xff0c;加…

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 105. 从前序与中序遍历序列构造二叉树 一、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

基于Spring Boot的医疗病历B2B平台开发策略

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善&#xff0c;而且还要界面友好&#xff0c;因此&#xff0c;对于一个成功的系统设计&#xff0c;功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作&#xff0c;本系统具有一般适用性&#xff0c;其…

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一篇文章我们学习了第一种结构型模式&#xff1a;代理模式。它在不改变原始类&#xff08;或者叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到&#xff0c;常用在业务系统中开发一些非功能性需求&#xf…

Docker consul注册中心

一、consul 1.1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。 起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。 直到后来出现了多个节点的分布式架构&#x…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

模电板测试分析报告【积分/微分电路】

积分电路常用于波形转换&#xff0c;如将矩形波变三角波。对正弦波积分可以实现相移。 微分电路&#xff1a; 为什么直接串联0.1uF电容到反馈线上去&#xff1a; 整改&#xff1a;这么看的话原理图中C58应该换成电阻的。 积分电路下图中红色的换成电容就可以变成微分电路了。 从…

八、随机名字功能

摘要&#xff1a; XML在C#与Unity3D中的实战运用 - PlaneZhong - 博客园 (cnblogs.com) 读取策划提供的配置文件。 策划提供一份execel文档&#xff0c;程序将它转化为一个配置文件&#xff08;xml&#xff09; 首先&#xff1a; XML是一个可扩展标记的语言 一、转换方法…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

Node.js管理工具NVM

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令&#xff1a; 一、安装 nvm 下载 nvm&#xff1a; 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

【C语言】你不知道的知识小盲区——柔性数组

文章目录 一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势 一、什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。在C99标准中&#xff0c;如果结构体的最后一个成员是…