解析

先考虑n=2的情况
可以利用一个空队在不超过5m的操作次数下把两个满队还原
如何推广?
考虑分治
把[l,mid]的球看成同色,[mid+1,r]的球看成同色
在左右两两匹配柱子进行n=2的还原操作
最后在递归处理
操作次数:5mnlogn

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+20000;
const int mod=998244353;
inline ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m;
int a[55][405],num[405];
int from[N],to[N],tot;
bool ok[55];
void print(){printf("print:\n");for(int i=1;i<=n+1;i++){printf("[%d]:",i);for(int j=1;j<=num[i];j++) printf("%d ",a[i][j]);printf("\n");}printf("\n");
}
inline void move(int x,int y){//printf("move:%d->%d\n",x,y);assert(num[x]);assert(num[y]<m);++tot;from[tot]=x;to[tot]=y;a[y][++num[y]]=a[x][num[x]--];//print();//if(tot%1000==0) fprintf(stderr,"%d\n",tot);
}
void solve(int l,int r){if(l>=r) return;int mid=(l+r)>>1;//fprintf(stderr,"(%d %d)\n",l,r);//print();memset(ok,0,sizeof(ok));for(int i=l;i<=mid;i++){for(int j=mid+1;j<=r;j++){//printf("i=%d j=%d\n",i,j);if(ok[i]||ok[j]) continue;int ss=0;for(int k=1;k<=m;k++){ss+=a[i][k]<=mid;ss+=a[j][k]<=mid;}int s=0;for(int k=1;k<=m;k++) s+=a[i][k]<=mid;for(int k=1;k<=s;k++) move(j,n+1);while(num[i]){if(a[i][num[i]]<=mid) move(i,j);else move(i,n+1);}for(int k=1;k<=s;k++) move(j,i);for(int k=1;k<=m-s;k++) move(n+1,i);for(int k=1;k<=m-s;k++) move(j,n+1);for(int k=1;k<=m-s;k++) move(i,j);if(ss>=m){for(int k=1;k<=m;k++){if(a[n+1][num[n+1]]<=mid&&num[i]<m) move(n+1,i);else move(n+1,j);}ok[i]=1;}else{for(int k=1;k<=m;k++){if(a[n+1][num[n+1]]>mid&&num[j]<m) move(n+1,j);else move(n+1,i);}ok[j]=1; }}}solve(l,mid);solve(mid+1,r);return;
}
int main() {#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();for(int i=1;i<=n;i++){num[i]=m;for(int j=1;j<=m;j++) a[i][j]=read();}//print();solve(1,n);printf("%d\n",tot);for(int i=1;i<=tot;i++) printf("%d %d\n",from[i],to[i]);return 0;
}

NOIP2020洛谷P7115:移球游戏(分治)相关推荐

  1. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  2. P7115-[NOIP2020]移球游戏【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 n+1n+1n+1个柱子,前面nnn个上面各有mmm个球,球有nnn种颜色,每种mmm个. 你每 ...

  3. 洛谷解题P1000 超级玛丽游戏(C++)

    此文章关于洛谷P1000 超级玛丽游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1000题目的解析: 先看题 ...

  4. 【bzoj3240 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法--然而我太弱了,一开始只想到了矩阵乘法的 ...

  5. [洛谷P2584][ZJOI2006]GameZ游戏排名系统

    题目大意:同[洛谷P4291][HAOI2008]排名系统(双倍经验) 题解:略 卡点:无 C++ Code: #include <cstdio> #include <map> ...

  6. 【洛谷P4705】玩游戏【二项式定理】【NTT卷积】【生成函数】【分治NTT】【函数求导】【多项式对数】

    传送门 题意:给定长度为N,MN,MN,M的序列a,ba,ba,b和ttt,随机选取x∈[1,N],y∈[1,M]x \in[1,N],y\in[1,M]x∈[1,N],y∈[1,M],对于i=1,2 ...

  7. 洛谷P1288 取数游戏II[博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  8. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  9. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$ f_i=\sum_{j=1}^if_{i-j}g_j\\ f_0=1 $$ 题解:直接求复杂度是$O ...

最新文章

  1. 数据绑定控件之ListView
  2. columnproperty server sql_导出SQL Server数据库表中字段的说明/备注
  3. CSS解决display:inline-block产生的缝隙间隙-代码写在一行 设置字体大小为0 设置负margin
  4. 如何在 SAP Fiori Elements List Report 表格工具栏里增添新的自定义按钮
  5. 字符串反序输出字符串
  6. WPF学习笔记-第二周【基本笔刷】
  7. 报错, org.hibernate.PropertyAccessException
  8. error_reporting()函数
  9. 45.分支算法练习:  7622:求排列的逆序数
  10. 狂神说 es笔记_【开源推荐】专门为程序员朋友量身打造的笔记软件—— Boostnote...
  11. 在ubuntu下配置C和C++的编译环境
  12. 交互设计原则有哪些?
  13. 【指纹识别】基于matlab GUI指纹预处理+特征点提取【含Matlab源码 1693期】
  14. Java程序员如何写好一份个人求职简历
  15. Java,List转json,json转List
  16. 在路上——黄山、宏村
  17. java抽象和接口的理解_Java学习笔记16---抽象类与接口的浅显理解
  18. 电脑双屏有一个黑屏_电脑显示器 黑屏(只应对其中一个原因的方案)
  19. java中peek是什么意思,在Java流中,PEEK真的只用于调试吗?
  20. 全国计算机一级级考试试题及答案,全国计算机等级考试一级考试试题及答案

热门文章

  1. linux实时进程优先级rt,Linux实时性- PREEMPT_RT实时抢占实现
  2. servlet需要和ajax,如何使用Servlet和Ajax?
  3. oracle虚拟用户是什么意思,lr脚本中oracle 2tier虚拟用户相关内容
  4. matlab绘制二元一次函数图像_【八上数学】 一次函数必考知识点(下)
  5. php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作
  6. memcached mysql缓存_memcached做数据库缓存
  7. 欧几里得范数_从范数到正则化
  8. python numpy数据类型_python numPy模块 与numpy里的数据类型、数据类型对象dtype
  9. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
  10. quill变html转化,将Quill Delta转换为HTML