题目描述

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

输入格式

第一行包含三个整数 NNN 和 MMM 和 TTT,TTT 表示 cl 对多少个摊点感兴趣。
接下来 TTT 行,每行两个整数 x,yx,yx,y,表示 cl 对处在第 xxx 行第 yyy 列的摊点感兴趣。

输出格式

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

题解

首先思考造成四种情况的条件
由于要使每一行每一列的摊点数量相同
不难想到当摊点数量不为行或列的倍数时,就不能满足上述条件
也就可以通过很简单的运算判断出四种情况
进一步去思考,至少要换多少次摊点
现在的题目类似于一道经典的贪心题目:均分纸牌
先来考虑一下线性的均分纸牌问题
假设第i个人手中有cic_ici​张牌,gig_igi​为ccc的前缀和,M为要分成的份数,T为纸牌的总数,那么达成目标所需要的最少步数为∑i=1M∣i∗TM−gi∣\sum_{i=1}^{M}\lvert i*\frac{T}{M}-g_i\rvert∑i=1M​∣i∗MT​−gi​∣
推导一下这个公式
当i=1i=1i=1,对于使它达到平均值需要的步数为∣TM−c1∣=∣TM−g1∣\lvert\frac{T}{M} - c_1\rvert=\lvert\frac{T}{M} - g_1\rvert∣MT​−c1​∣=∣MT​−g1​∣
当i=2i=2i=2,对于使它达到平均值需要的步数为∣TM−g1∣+∣TM−(c2−(TM−c1))∣=∣TM−g1∣+∣2∗TM−(c2+c1)∣=∣TM−g1∣+∣2∗TM−g2∣\lvert\frac{T}{M} - g_1\rvert+\lvert\frac{T}{M}-(c_2-(\frac{T}{M}-c_1))\rvert=\lvert\frac{T}{M} - g_1\rvert+\lvert2*\frac{T}{M}-(c_2+c_1)\rvert=\lvert\frac{T}{M} - g_1\rvert+\lvert2*\frac{T}{M}-g_2\rvert∣MT​−g1​∣+∣MT​−(c2​−(MT​−c1​))∣=∣MT​−g1​∣+∣2∗MT​−(c2​+c1​)∣=∣MT​−g1​∣+∣2∗MT​−g2​∣
后面的可以自己再去推一下,就可以逐步推出上述的公式
那么我们再假设每个人手中的牌直接就减去了TM\frac{T}{M}MT​,将这些值存到a数组中
并用s数组表示a数组的前缀和
显然可以通过上述公式得到以下公式:
最少步数即为∑i=1M∣si∣\sum_{i=1}^{M}\lvert s_i\rvert∑i=1M​∣si​∣
接下来我们来针对此题,思考环形均分纸牌
对于环形问题,就要想到一个重要的方法:破环成链
那么在何处将这个环断开呢
\假设在k号点将环断开
ak+1a_{k+1}ak+1​的前缀和就变为了sk+1−sks_{k+1}-s_ksk+1​−sk​
ak+2a_{k+2}ak+2​的前缀和就变为了sk+2−sks_{k+2}-s_ksk+2​−sk​
aMa_MaM​的前缀和就变为了sM−sks_M-s_ksM​−sk​
a1a_1a1​的前缀和就变为了s1+sM−sks_1+s_M-s_ks1​+sM​−sk​
由此推导可以得出需要的最少步数为∑i=1M∣si−sk∣\sum_{i=1}^M\lvert s_i-s_k\rvert∑i=1M​∣si​−sk​∣
很朴素的做法就是暴力枚举每一个点,假设在这个点断开,然后按线性的方法计算一遍需要的步数
这样做显然会超时
仔细观察公式,会发现这个公式已经被推成了货仓选址的模型
所以将kkk号点取中位数即为最优解

code
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
long long b[N],c[N],f[N];
long long n,m,t;
int x,y;
long long calc(long long a[N],int n)
{long long ans=0;for(int i=1;i<=n;i++){a[i]-=t/n;f[i]=f[i-1]+a[i];}sort(f+1,f+n+1);for(int i=1;i<=n;i++) ans+=abs(f[i]-f[(n+1)>>1]);return ans;
}
int main()
{cin>>n>>m>>t;for(int i=1;i<=t;i++){scanf("%d%d",&x,&y);b[x]++,c[y]++; }if(t%n==0&&t%m==0)printf("both %lld\n",calc(b,n)+calc(c,m));else if(t%n==0)printf("row %lld\n",calc(b,n));else if(t%m==0)printf("column %lld\n",calc(c,m));else puts("impossible");return 0;
}

《算法竞赛进阶指南》0x05 T3 七夕祭相关推荐

  1. 算法竞赛进阶指南---0x05(排序)七夕祭

    题面 题解 我们可以发现,通过行与行(上下)交换,对列无影响,列与列(左右)交换,对行无影响 .也就是说行与列的交换是相互独立的,那么求总的交换次数最小就可以变成求行与列的最小,然后相加即可 那我们在 ...

  2. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  3. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  4. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  5. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  6. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  7. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  8. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  9. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  10. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

最新文章

  1. 独家 | 为你的数据科学项目提供有力支撑——3个寻找数据集的最佳网站
  2. spoj 26130 Binary numbers
  3. Tensorflow tf.keras.models.load_model() 打开h5文件失败
  4. springcloud、consul和Springboot的版本
  5. 关闭数据执行保护(DEP)
  6. php gearmanclient addoptions,gearman PHP7扩展安装
  7. navigator工具_Javascript常用工具类
  8. 禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧
  9. HTML期末作业-汽车奔驰4s店
  10. 微信小程序中的空格和换行操作
  11. 如何使用digiKam进行照片管理
  12. 十进制负数的二进制表示法
  13. class循环获取 Undefined var str = '';
  14. 小贝拉机器人是朋友_被Angelababy、周震南等摸头杀?机器人贝拉凭什么受宠
  15. Web测试中性能测试基础
  16. Mac绿联USB转以太网无法连接解决方法
  17. baidu 地图 3d版 自定义地图样式
  18. 游百望山(记于17.09.05)
  19. k8s学习-深入理解Pod对象
  20. 算术右移与逻辑右移的区别

热门文章

  1. 常见的压缩和解压工具
  2. IndexError: boolean index did not match indexed array along dimension 0; dimension is 1 but correspo
  3. 微服务治理框架- - -Spring Cloud
  4. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)
  5. android studio 九宫格,Android Studio 实现九宫格功能
  6. 15个经典面试问题及回答思路,3面直接拿到offer
  7. global-forwards和forward的区别
  8. Nginx Rewrite 和正则表达式
  9. java 获取MP4时长 | Java工具类
  10. oracle rac问题处理,Oracle RAC 故障处理