当前位置: 首页 > news >正文

牛客周赛 Round 104(小红的矩阵不动点/小红的不动点权值)

小红的矩阵不动点

我们不难发现当i==j时,i或j任意一方增大都起不动点都是a[i][j]==z(z==i==j)。

因为数据最大为min(i,j)及500,所以我们可以用数组b[z][j]表示此位置min应为z,实际为j的个数

先计算不交换时 不动点个数 记为ans
则答案要么是ans+2 要么是ans+1 要么是ans
当且仅当两个数交换之后(b[z][j]>0&&b[j][z]>0时) 分别成为新的不动点时 答案为ans+2
当且仅当两个数交换之后 (i!=j&&b[i][j] > 0 && b[j][j] < (m + n-1 - 2 * (j - 1))只有一个成为新的不动点时 答案为ans+1,m + n-1 - 2 * (j - 1)表示该值最多有多少个不动点
否则 答案为ans.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n, m;
int a[502][502], b[502][502];
int main() {ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin与cout绑定cin >> n >> m;int ans = 0;int min_p = min(n, m);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];}}for (int z = 1; z <= min_p; z++) {for (int j = z; j <= m; j++) {if (a[z][j] <= min_p) {b[z][a[z][j]]++;}}for (int i = z + 1; i <= n; i++) {if (a[i][z] <= min_p) {b[z][a[i][z]]++;}}}for (int i = 1; i <= min_p; i++) {int j;for ( j = 1; j <i; j++) {if (b[i][j] >0 && b[j][i] >0) {ans = 2;break;}}if (j <i) {break;}}if (ans == 0) {for (int i = 1; i <= min_p; i++) {int j;for (j = 1; j <= min_p; j++) {if (i!=j&&b[i][j] > 0 && b[j][j] < (m + n-1 - 2 * (j - 1))) {ans = 1;break;}}if (j < min_p) {break;}}}int sum = 0;for (int i = 1; i <= min_p; i++) {sum += b[i][i];}cout << sum+ans << endl;return 0;
}

小红的不动点权值

我们可以发现当i为不动点时,1-i-1个数都必须在区间内,所以我们根据这个找到最小区间的左右边界,i为不动点的区间就为  (long long)(n - r+1)* l

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
typedef pair<int, int> pii;
int n;
pii a[300005];
int main() {ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin与cout绑定cin >> n;for (int i = 0; i < n; i++) {cin >> a[i].first;a[i].second = i + 1;}int l, r;sort(a, a + n);ll ans = 0;for (int i = 0; i < n; i++) {if (i == 0) {l = a[i].second;r = a[i].second;}else {if (a[i].second < l) {l = a[i].second;}if (a[i].second > r) {r = a[i].second;}}ans += (ll)(n - r+1)* l;}cout << ans << endl;return 0;
}

http://www.lryc.cn/news/623864.html

相关文章:

  • 03高级语言逻辑结构到汇编语言之逻辑结构转换if (...) {...} else if {...} else {...}
  • react 错误边界
  • git stash临时保存工作区
  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • 【牛客刷题】成绩统计与发短信问题详解
  • 【Git系列】如何从 Git 中删除 .idea 目录
  • 【线程安全(二) Java EE】
  • 寻找数组的中心索引
  • 如果用ApiFox调用Kubernetes API,需要怎么设置证书?
  • Day16 多任务(2)
  • USB-A 3.2 和 USB-A 2.0的区别
  • Day27 装饰器
  • 从零配置YOLOv8环境:RTX 3060显卡完整指南
  • AI评测的科学之道:当Benchmark遇上统计学
  • 48.Seata认识、部署TC服务、微服务集成
  • [Responsive theme color] 动态更新 | CSS变量+JS操控 | 移动端-汉堡菜单 | 实现平滑滚动
  • 实现用户输入打断大模型流式输出:基于Vue与FastAPI的方案
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 【每日一题】Day 6
  • 凸函数与损失函数
  • 开源数据发现平台:Amundsen Search Service 搜索服务
  • Python注解
  • 零墨云A4mini打印机设置电脑通过局域网络进行打印
  • C#对象的本地保存与序列化详解笔记
  • GitLab CI/CD、Jenkins与GitHub Actions在Kubernetes环境中的方案对比分析
  • 【Golang】:错误处理
  • 任务型Agent架构简介
  • Visual Studio Code 基础设置指南
  • 【R语言】R 语言中打印含有双引号的字符串时会出现 “\” 的原因解析
  • GaussDB常用术语缩写及释义