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

CF1774D

首先 \(1\) 的总个数不能被 \(n\) 整除时无解。

否则一定有解(因为每一列上的 \(1\) 的位置都可以随意变动,故实际上相当于可以随便放)。为了步数最少,一定是用缺少 \(1\) 行的 \(0\) 与过多 \(1\) 行的 \(1\) 交换,这样能同时使两行更接近答案。实现时先枚举列,再根据每行的情况找出上面两种行,并一一配对交换即可。时间复杂度 \(O(\sum nm)\)

#include<iostream>
#include<cstdio>
#include<vector>
#define N 200010
using namespace std;
int n,m,cnt[N],cnt0;
vector<int> G[N],a,b;
int ans,ansx[N*10],ansy[N*10],ansz[N*10];
void solve(){cnt0=0;cin>>n>>m;for(int i=1;i<=n;i++)G[i].clear();for(int i=1;i<=n;i++){G[i].push_back(0);cnt[i]=0;for(int j=1;j<=m;j++){G[i].push_back(0);cin>>G[i][j];cnt0+=G[i][j];cnt[i]+=G[i][j];}}if(cnt0%n){cout<<-1<<'\n';return;}cnt0/=n;ans=0;for(int j=1;j<=m;j++){a.clear();b.clear();for(int i=1;i<=n;i++){if(cnt[i]<cnt0&&!G[i][j])a.push_back(i);if(cnt[i]>cnt0&&G[i][j])b.push_back(i);}for(int i=0;i<min(a.size(),b.size());i++){ans++;ansx[ans]=a[i],ansy[ans]=b[i],ansz[ans]=j;cnt[a[i]]++,cnt[b[i]]--;}}cout<<ans<<'\n';for(int i=1;i<=ans;i++)cout<<ansx[i]<<' '<<ansy[i]<<' '<<ansz[i]<<'\n';return;
}
int main(){int T;cin>>T;while(T--)solve();return 0;
}
http://www.zskr.cn/news/3256.html

相关文章:

  • CF23C
  • CF37C
  • 支持类 Unix 语法 ``:Windows 下用 PowerShell 7 优化 npm 和 VS Code
  • 初赛程序阅读做题要点
  • 模拟堆(手写堆 的五大操作)
  • 完整教程:简单介绍一下Clickhouse及其引擎
  • 矩阵分解
  • 容斥原理
  • 简历优化全攻略:如何写出吸引HR的简历?
  • bashrc的一些配置记录
  • MyEMS与开源浪潮:如何重塑全球能源管理的未来格局
  • doms.ul.querySelectorvs document.querySelector:DOM查询的层级关系
  • Pwn2Own Automotive 2025 决赛日:49个零日漏洞与88万美元奖金揭晓
  • MyEMS在行动:揭秘开源能源管理系统如何重塑工业与楼宇的能效未来
  • 题解:P14015 [ICPC 2024 Nanjing R] 生日礼物
  • HyperWorks许可回收机制
  • flutter开发window打包成exe可执行文件的步骤
  • 基于Linux系统的定制软件安装硬件设备选型指南
  • c++之is_trivially_default_constructible
  • 猫树分治
  • AI导航生成寻路点-FindPathToLocationSynchronously
  • 智聘无界:AI 破解全球化招聘合规、成本与人才匹配难题的实践路径
  • Flink 与Flink可视化平台StreamPark教程(CDC功能)
  • GAS_Aura-Setting Up Auto Running
  • 源码调试-带你了解下车牌识别的深度学习模型-LPRNet
  • charles破解-在线生成激活码
  • 内部排序-直接插入排序冒泡排序快速排序对比
  • C++ auto关键字
  • ARM主板:低功耗高性能的嵌入式计算核心
  • Gin 模板系统深度解析:客服系统实战开发