当前位置: 首页 > 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.wxhsa.cn/company.asp?id=2201

相关文章:

  • CF23C
  • CF37C
  • CF33D
  • 支持类 Unix 语法 ``:Windows 下用 PowerShell 7 优化 npm 和 VS Code
  • 初赛程序阅读做题要点
  • 模拟堆(手写堆 的五大操作)
  • 【A】杂题悬桨
  • 使用Osquery进行远程取证:NTFS取证扩展实战指南
  • 完整教程:简单介绍一下Clickhouse及其引擎
  • 矩阵分解
  • 11
  • 基于 Gitlab 实现 Go 的 CI/CD
  • 2025.9.11
  • 容斥原理
  • 【B】世良真纯
  • 如何使用jobleap.cn避免简历中的严重错误
  • 在 Zustand 中创建通用 Action 的优雅实践
  • 如何用产品思维优化简历的“用户体验”?
  • 简历如何优化,简历如何投递,面试如何准备?
  • 网络流做题笔记
  • 简历优化全攻略:如何写出吸引HR的简历?
  • 重塑云上 AI 应用“运行时”,函数计算进化之路
  • 25.9.12 C语言基本数据类型
  • Avalonia:基础导航
  • bashrc的一些配置记录
  • H5游戏性能优化系列-----协议相关优化
  • 实现我的第一个langchain应用
  • 小说可视化系统设计(程序员副业项目)
  • MyEMS与开源浪潮:如何重塑全球能源管理的未来格局
  • React Antd or Antd Pro:findDOMNode is deprecated and will be removed in the next major release.