bzoj3032 七夕祭题解
题面
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, 接下来输出最小交换次数,与字符串之间用一个空格隔开。
解析
此题我们可分析得交换左右相邻的摊点只会改变某两列cl感兴趣的摊点数,不会改变每一行cl感兴趣的摊点数,同理交换上下相邻的摊点只会改变某两行cl感兴趣的摊点数,不会改变每一列cl感兴趣的摊点数。也就是说左右交换和上下交换是两个相互独立的过程,故可以独立求解,此问题就被划分为两个问题。
1.通过最少次数的左右交换使每列中cl感兴趣的摊点数相同。
2.通过最少次数的上下交换使每行中cl感兴趣的摊点数相同。
显然当且仅当m|T时1问题有解,n|T时2问题有解,我们的目的就是让每行都有T/n个cl感兴趣的摊点,每列都有T/m个cl感兴趣的摊点。此时问题就类似于前面 均分纸牌的拓展
(以下简称均分纸牌问题)
此题又与均分纸牌有一些区别,它可看作是一个环形的均分纸牌问题我们便可以去枚举它的断点。
(以下的A[i]是减去了T/m的,S[i]是A[i]的前缀和,即 S[i]=\(\sum_{j=1}^i\)A[i] )
一般均分纸牌问题每个人持有的纸牌数A[1] \(\cdots\) A[m] 和前缀和S[i] \(\cdots\) S[m]
如果在第k个人断开这m个人持有的纸牌和前缀和是
A[K+1],A[K+2] \(\cdots\) A[m],A[1] \(\cdots\) A[K]。
S[K+1],S[K+2] \(\cdots\) S[m],S[1] \(\cdots\) S[K]。
故可求的公式 \(\sum_{i=1}^m\) \(\mid\)S[i]-S[k]\(\mid\),我们就要求得其最小值,此时问题又变为了前面的货仓选址排序后求得最小值即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,T,xi[100010],yi[100010],A[100010],S[100010],nx,ny,u,v,k;
int main(){
scanf("%d %d %d",&n,&m,&T);
for(int i=1;i<=T;i++){
scanf("%d %d",&u,&v);
xi[u]++;
yi[v]++;
}
if(!(T%n)){
nx=T/n;
for(int i=1;i<=n;++i){
A[i]=xi[i]-nx;
S[i]=S[i-1]+A[i];
}
sort(S+1,S+1+n);
k=n>>1;
if(n&1)k++;
u=0;
for(int i=1;i<=n;++i){
u+=abs(S[i]-S[k]);
}
}
if(!(T%m)){
ny=T/m;
for(int i=1;i<=m;++i){
A[i]=yi[i]-ny;
S[i]=S[i-1]+A[i];
}
sort(S+1,S+1+m);
k=m>>1;
if(m&1)k++;
v=0;
for(int i=1;i<=m;++i){
v+=abs(S[i]-S[k]);
}
}
if((!(T%m))&&(!(T%n))) printf("both %lld",(long long)u+v);//此处要强制类型转换防止溢出
else if(!(T%n)) printf("row %d",u);
else if(!(T%m)) printf("column %d",v);
else printf("impossible");
}
bzoj3032 七夕祭题解的更多相关文章
- BZOJ3032 七夕祭
https://remmina.github.io/BZPRO/JudgeOnline/3032.html 题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ 今年举办了一次线 ...
- BZOJ3032 七夕祭[中位数]
发现是一个类似于“纸牌均分”的问题.然后发现,只要列数整除目标.行数整除目标就一定可以. 如果只移动列,并不会影响行,也就是同一行不会多不会少.只移动行同理. 所以可以把两个问题分开来看,处理起来互不 ...
- <BZOJ3032>七夕祭
水 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> ...
- [Poetize II]七夕祭
描述 Description TYVJ七夕祭和11区的夏祭的形式很像.矩 形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖. ...
- [JZOJ3382] [NOIP2013模拟] 七夕祭 解题报告
Description 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. ...
- 2018.11.3 Nescafe18 T1 七夕祭
题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是 TYVJ 今年举办了一次线下七夕祭.Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩. ...
- JZOJ 3382. 【NOIP2013模拟】七夕祭
3382. [NOIP2013模拟]七夕祭 Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Goto Problem ...
- AcWing:105. 七夕祭(前缀和 + 中位数 + 分治 + 贪心)
七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11 ...
- 【NOIP2013模拟】七夕祭
题目描述七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和 ...
随机推荐
- java遍历所有目录和文件
package xian; import java.io.File; import java.util.ArrayList; public class GetFile { private static ...
- codeforces 576 div2 A-D题解
A题 Description 题目链接: https://codeforces.com/contest/1199/problem/A 题意: 给定长度为n(1≤n≤100000)的一个序列a,以及两个 ...
- 2. 源码分析---SOFARPC客户端服务引用
我们先上一张客户端服务引用的时序图. 我们首先来看看ComsumerConfig的refer方法吧 public T refer() { if (consumerBootstrap == null) ...
- Leetcode solution 227: Basic Calculator II
Problem Statement Implement a basic calculator to evaluate a simple expression string. The expressio ...
- Selenium+java - 截图操作
写在前面 自动化测试过程中,运行失败截图可以很好的帮我们定位问题,因此,截图操作也是我们自动化测试中的一个重要环节. 截图方法 1.通过截图类TakeScreenshout实现截图 特点:截取浏览器窗 ...
- java并发编程(五)----(JUC)ReentrantLock
上一节我们了解了Lock接口的一些简单的说明,知道Lock锁的常用形式,那么这节我们正式开始进入JUC锁(java.util.concurrent包下的锁,简称JUC锁).下面我们来看一下Lock最常 ...
- 时间格式的字符串在ios中的转换问题
在移动端使用时间选择器的时候,选择了一个时间转换为时间戳,谷歌浏览器以及安卓手机使用 new Date( 选择的时间 ).getTime() 都能够拿到时间戳, 但是在ios手机上会出现出现NAN ...
- C语言之左移和右移运算符
C语言中的左移和右移运算符移位后的结果老是忘记,最近在刷有关位操作的题目,正好整理下: 1. 左移运算符(<<) 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指 ...
- ABAP:如何等待小数秒数
WAIT UP TO x SECONDS. 和CALL FUNCTION 'ENQUE_SLEEP'都只能支持整数的秒数(如果是非整数,则四舍五入),如果要WAIT非整数的描述,可以如下写法:
- 浅谈 JavaScript 垃圾回收机制
github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...