题目描述

七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。
于是TYVJ今年举办了一次线下七夕祭。
Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩。
TYVJ七夕祭和11区的夏祭的形式很像。
矩形的祭典会场由N排M列共计N×M个摊点组成。
虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。
Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。
不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。
两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。
由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。
现在Vani想知道他的两个要求最多能满足多少个。
在此前提下,至少需要交换多少次摊点。

输入格式

第一行包含三个整数N和M和T,T表示cl对多少个摊点感兴趣。
接下来T行,每行两个整数x, y,表示cl对处在第x行第y列的摊点感兴趣。

输出格式

首先输出一个字符串。
如果能满足Vani的全部两个要求,输出both;
如果通过调整只能使得各行中cl感兴趣的摊点数一样多,输出row;
如果只能使各列中cl感兴趣的摊点数一样多,输出column;
如果均不能满足,输出impossible。
如果输出的字符串不是impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。

数据范围

1≤N,M≤100000,0≤T≤min(N∗M,100000),1≤x≤N,1≤y≤M

输入样例:

2 3 4
1 3
2 1
2 2
2 3

输出样例:

row 1

思路分治+贪心+前缀和+中位数+排序

这道题目有一个非常重要的性质就是,只会改变相邻的两个数的位置,因此我们交换两个数,只会改变一行的喜爱小摊或者一列的喜爱小摊,而不会同时改变行和列的喜爱小摊,既然这样的话,我们就可以将这道题目分成两个部分,一部分是求行的最少次数,一部分是求列的最少次数。

既然如此的话,这道题目就成为了环形的均分纸牌问题,均分纸牌这是一道经典的贪心问题,可以自行百度理解即可懒惰病发作ing 但是环形均分纸牌问题和普通均分纸牌问题又有不同之处,因此我们要截环为序列,所以说我们可以利用中位数把环形变成区间,具体思路可见《算法竞赛进阶指南》。

代码如下:

/*
我们可以分别把行和列看成俩个环形均分纸牌问题:1.行和列的操作是互不影响的,相邻的列于列交换时,这一行的摊点数是不变的,同理,相邻的行与行交换时,这一列的摊点数也是不变的2.我们不用考虑某一点具体在这一行的哪一列,或这一列的哪一行,因为如果是在同一列的话,交换是没有作用的,如果要交换,那肯定是在不同的列上.这样才可以改变摊位数3.所以我们可以将所有的行和所有的列都抽象的转化为一个具体的代表一个实数的点,这样某一行有几个摊位数,就表示这个点的数值是多少4.全部转化为点后,就变成了典型的均分纸牌问题,套膜板就行
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, t;
int a[100005], b[100005];
ll cal(int a[100005], int n)  //环形均分纸牌问题模板
{ll ans = 0;int t;a[1] -= a[0] / n;for(int i = 2; i <= n; i++)a[i] += a[i - 1] - a[0] / n;sort(a + 1, a + n + 1);t = a[(n + 1) / 2];for(int i = 1; i <= n; i++)ans += abs(t - a[i]);return ans;
}
int main()
{cin >> n >> m >> t;int x, y;for(int i = 0; i < t; i++){cin >> x >> y;a[x]++;       //转换思想:将行、列都看成代表一个实数的点,这样这道题就变成了经典的纸牌问题b[y]++;}for(int i = 1; i <= n; i++)a[0] += a[i];for(int i = 1; i <= m; i++)b[0] +=b[i];if(a[0] % n == 0 && b[0] % m == 0){          //行和列是互不干涉的,所以分别判断就行cout << "both" << ' ' << cal(a, n) + cal(b, m) << endl;}else if(a[0] % n == 0 && b[0] % m != 0)cout << "row" << ' ' << cal(a, n) << endl;else if(a[0] % n != 0 && b[0] % m == 0)cout << "column" << ' ' << cal(b, m) << endl;else cout << "impossible" <<endl;return 0;
}

均分纸牌问题——(分治 + 贪心 + 前缀和 + 中位数 + 排序)相关推荐

  1. P1031 均分纸牌(经典贪心)

    题目描述 有N堆纸牌,编号分别为1,2,-,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上:在编号为N的 ...

  2. 均分纸牌(经典贪心)

    1  题目描述 有N堆纸牌,编号分别为1,2,-,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上:在编号 ...

  3. BZOJ3032 七夕祭 均分纸牌问题的变式 (前缀和+中位数)

    题目: 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是JoyOI今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去JoyOI七夕祭游玩. 描述 ...

  4. 环形均分纸牌问题(中位数)

    引入1:货仓选址问题 在X轴上有N个商店,其位置位xi(1<i<N),现需要求将货仓在X轴上某一 点,求货仓建在何处时使得货仓到各商店距离之和最小. Sum_distance=∑abs(x ...

  5. Luogu P1031 均分纸牌(贪心)

    P1031 均分纸牌 题目描述 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌 ...

  6. 均分纸牌(线性、环形、二维)

    感觉好久没写博客了- 题目描述 有N堆纸牌,编号分别为1,2,-,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为 ...

  7. 【算法专题】均分纸牌问题

    均分纸牌问题 1. 概述 有n个小朋友,每个小朋友手中有一些糖果,每个小朋友都可以把他手中的糖果给相邻的小朋友,问使得所有小朋友手中糖果数量相同需要多少至少给多少次?或者至少传递多少糖果? 存在两种类 ...

  8. [codevs] 1098 均分纸牌

    均分纸牌 题目描述 Description 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 ...

  9. 105. 七夕祭【环形均分纸牌问题】

    首先你会发现,行交换和列交换是无影响的.故可以分开讨论. 这不就变成了环形均分纸牌的问题了么,和蓝桥杯糖果那题类似. #include<bits/stdc++.h> using names ...

最新文章

  1. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4
  2. bootstrap五星评分_星型打分插件 bootstrap-rating-input
  3. 快递物流查询接口介绍
  4. mysql5.6 replication_MySQL5.6 Replication主从复制(读写分离) 配置完整版
  5. 解密春晚微信红包十亿级并发压力
  6. 一行代码取出HTML页面某个按钮的css属性,比如margin
  7. 版本交付_连续交付友好的Maven版本
  8. 腾讯管家去除桌面快捷小图标
  9. centos系统mysql连接workbench
  10. 用Eclipse远程调试部署在Tomcat下的Web应用程序
  11. Python绘制分形树(一)
  12. 常用的 7 款 MySQL 客户端工具,你值得拥有
  13. C++实现图片格式转换
  14. mzy对于枚举的理解
  15. 电信NB-IOT物联网卡与阿里云物联网平台,不得不说的秘密!
  16. 东原地产的女性视角——对话罗韶颖
  17. 网络信息安全从业者,持NISP二级或CISP证书,最高可补贴30000元
  18. html 图片 填充方式,css怎么让图片填满?
  19. SpringBoot热部署方案
  20. openlayers 利用克里金插值法渲染等值面

热门文章

  1. Unity,基于layer的碰撞配置
  2. http://renmin.cnblogs.com/archive/2006/03/03/341669.aspx
  3. 返回一个整数数组中最大子数组的和。
  4. 用Python写一个批量生成账号的函数(用户控制数据长度、数据条数)
  5. nyoj 456 邮票分你一半【01背包】
  6. spring.xml从外部文件引入数据库配置信息
  7. Github上好的Android开源框架
  8. SQLite学习笔记(三)--创建内存数据库
  9. 驾校学员驾考成绩管理系统
  10. Vue 学习笔记(3)路由的基本使用 结合 SpringBoot