[usOJ8972]七夕祭

280 篇文章 1 订阅

题目

传送门 to usOJ

题目描述
七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是 F r e n c h    B r e a d    I n n \tt French\;Bread\;Inn FrenchBreadInn(法国面包旅馆,简称 F B I \tt FBI FBI)今年举办了一次线下七夕祭。 L L T \tt LLT LLT 同学今年成功邀请到了 L J \tt LJ LJ 同学陪他来共度七夕,于是他们决定去 F B I \tt FBI FBI 七夕祭游玩。

矩形的祭典会场由 N N N M M M 列共计 N × M N×M N×M 个摊点组成。虽然摊点种类繁多,不过 L J \tt LJ LJ 只对其中的一部分摊点感兴趣,比如棋牌室、肥宅快乐屋、网咖……什么的。 L L T \tt LLT LLT 预先联系了七夕祭的负责人 S Y \tt SY SY ,希望能够通过恰当地布置会场,使得各行中 L J \tt LJ LJ 感兴趣的摊点数一样多,并且各列中 L J \tt LJ LJ 感兴趣的摊点数也一样多。

不过 S Y \tt SY SY 告诉 L L T \tt LLT LLT ,摊点已经随意布置完毕了,如果想满足 L J \tt LJ LJ 的要求,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于 L L T \tt LLT LLT 率领的天下所有衙门,成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在 L L T \tt LLT LLT 想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。

输入格式
第一行包含三个整数 N N N M M M T T T T T T 表示 L J \tt LJ LJ 对多少个摊点感兴趣。

接下来 T T T 行,每行两个整数 x , y x,y x,y ,表示 L J \tt LJ LJ 对处在第 x x x 行第 y y y 列的摊点感兴趣。行列从 1 1 1 开始编号。

输出格式
首先输出一个字符串。如果能满足 L L T \tt LLT LLT 的全部两个要求,输出 b o t h \tt both both ;如果通过调整只能使得各行中 L J \tt LJ LJ 感兴趣的摊点数一样多,输出 r o w \tt row row ;如果只能使各列中 L J \tt LJ LJ 感兴趣的摊点数一样多,输出 c o l u m n \tt column column ;如果均不能满足,输出 i m p o s s i b l e \tt impossible impossible

如果输出的字符串不是 i m p o s s i b l e \tt impossible impossible , 接下来输出最小交换次数,与字符串之间用一个空格隔开。

数据范围与约定
对于 30 % 30\% 30% 的数据, N , M ≤ 100 N, M≤100 N,M100

对于 70 % 70\% 70% 的数据, N , M ≤ 1000 N, M≤1000 N,M1000

对于 100 % 100\% 100% 的数据, 1 ≤ N , M ≤ 100000 , 0 ≤ T ≤ min ⁡ ( N M , 100000 ) , 1 ≤ x ≤ N , 1 ≤ y ≤ M 1≤N, M≤100000,0≤T≤\min(NM, 100000),1≤x≤N,1≤y≤M 1N,M1000000Tmin(NM,100000)1xN1yM

思路

其实这个东西可以想象成 k k k 个点在地图里乱动。

能否

如果 n ∣ k n|k nk ,那么一定可以满足每行数量一样。

如果 m ∣ k m|k mk ,那么一定可以满足每列数量一样。

行和列是独立的。所以,如果 n ∣ k ∧ m ∣ k n|k\wedge m|k nkmk ,那么两个都可以满足。

怎么证明?从题目中可以发现,不存在“既可以 r o w \tt row row ,也可以 c o l u m n \tt column column ,就是不能 b o t h \tt both both”的情况。

好吧,追求严谨,就得通过下面的操作来证明。

最小操作次数

前置知识:请先看糖果传递的做法。

行和列分开讨论。

所以此时就是这样一个问题:对于一个序列 { a } \{a\} {a} ,每次可以将 a i a_i ai 减去(加上)一,将 a i + 1 a_{i+1} ai+1 加上(减去)一,代价为 1 1 1 。求全部相同的最小代价。

为什么是一样的呢?因为 a i > a i + 1 a_i>a_{i+1} ai>ai+1 时,第 i i i 行一定至少有 a i − a i + 1 a_i-a_{i+1} aiai+1 个点是可以直接移动到第 i + 1 i+1 i+1 行(而不需要改变列的编号)的。

目标是全部相同,自然是较大者移动至较小者。

所以就可以了。显然,行和列互不影响。

代码

这么简单的代码,还需要我教你吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值