Description
TYVJ七夕祭和11区的夏祭的形式很像。矩形的祭典会场由N排M列共计N×M个摊点组成。虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。
不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在Vani想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。
Input
接下来T行,每行两个整数x, y,表示cl对处在第x行第y列的摊点感兴趣。
Output
如果输出的字符串不是impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。
Sample Input
样例输入1
2 3 4
1 3
2 1
2 2
2 3
样例输入2
3 3 3
1 3
2 2
2 3
Sample Output
样例输出1
row 1
样例输出2
both 2
Data Constraint
对于70% 的数据,N, M≤1000。
对于100% 的数据,1≤N, M≤100000,0≤T≤min(NM, 100000),1≤x≤N,1≤y≤M。
题目大意:给定n*m的图,再给出t个点的坐标。首先分别判断是否可以做到使每行的点数相等和使每列的点数相等,若可以输出达到的最小步数。(如果都可以就把步数加起来)
题解:
我们发现行和列是不互相影响的,因此我们完全可以分开来处理。做过均分纸牌吧,这就是两个环形的均分纸牌。设有 n 堆纸牌,每堆有 ai 张,所有堆一共有 s 张,那么最终每堆应该有 s / n 张。因此如果 s mod n≠0,显然是无解的。于是每堆减去平均数(最终数值),即我们构造数列 bi=ai-s/n。原始的均分纸牌做法是,从开头到结尾扫一遍,每次贪心的从下一个堆把这个堆“少的”填满,统计移动的答案即可。那么这里呢?
1.由于是环形的,很容易想的就是我们枚举开头(其实就是枚举断开环的位置),然后像上面一样扫一遍,时间复杂度 O(n2),预计得分70分
2.设bi的前缀和为sumi.如果从第 k 个位置开始,那么第 i 堆和第 i+1 堆交换的纸牌数就是 |sumi-sumk|(手动模拟即可明白)。总代价就是|sum1-sumk|+|sum2-sumk|+|sum3-sumk|+……+|sumn-sumk|。发现什么了?当sumk是sum1~sumn中位数的时候,上式有最小值!所以把 sumi 排序后,令 sumk=sum[(n+1)/2],计算代价即可。时间复杂度 O(nlogn),预计得分 100 分
我只想说。。。考试的时候我做过这题了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std; const int maxn=1e5+;
int n,m,t,p1,p2;
ll ans;
int a[maxn],b[maxn],sum[maxn];
inline int read()
{
char ch=getchar();
int s=,f=;
while (!(ch>=''&&ch<='')) {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
n=read();m=read();t=read();
for (int i=;i<=t;i++)
{
a[read()]++;
b[read()]++;
}
if (t%n) p1=;
if (t%m) p2=;
if (p1&&p2) {puts("impossible");return ;}
if (!p1&&!p2) printf("both ");
else if (!p1) printf("row ");
else printf("column ");
for (int i=;i<=n;i++) a[i]-=t/n;
for (int i=;i<=m;i++) b[i]-=t/m;
if (!p1)
{
for (int i=;i<=n;i++)
sum[i]=sum[i-]+a[i];
sort(sum+,sum++n);
int mm=sum[+n>>];
for (int i=;i<=n;i++) ans+=1ll*abs(mm-sum[i]);
}
if (!p2)
{
for (int i=;i<=m;i++)
sum[i]=sum[i-]+b[i];
sort(sum+,sum++m);
int mm=sum[+m>>];
for (int i=;i<=m;i++) ans+=1ll*abs(mm-sum[i]);
}
printf("%lld",ans);
return ;
}
[JZOJ3382] [NOIP2013模拟] 七夕祭 解题报告的更多相关文章
-
冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
-
冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...
-
20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
-
冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
-
冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
题1 素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...
-
20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
-
20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
-
NOIP欢乐模拟赛 T1 解题报告
小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...
-
【模拟】Class 解题报告
[问题描述] 信息班这期的课将要结束了,老师要从现在班上的同学中选出比较优秀的同学进入下一期的学习.而录取标准则是将平时作业和考试一起考虑,综合成绩排在前面的则录取.经过一番思考,老师作了以下的筛选计 ...
随机推荐
-
本周psp(11月17-23)
本周psp进度 11月19号 内容 开始时间 结束时间 打断时间 净时间 发布读书笔记 11:05 11:25 0 20m 看构建之法书 9:50 10:48 5m 53m 11月20号 内容 开始时 ...
-
开发者如何利用工具快速开发出完美APP
文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...
-
移动平台自动化测试从零开始-MonkeyRunner工具使用 (第二节)
选自:http://yuedu.baidu.com/search?word=%D3%DA%D3%BF&pbook=0 第2节 MonkeyRunner 安装部署 如果您已经正确的安装部署了A ...
-
windows server 2008 R2 FTP登陆错误。
建立了一个域用户ftp. 始终登陆不上winserver 2008 R2上的FTP. 错误如下: 530-User cannot log in. Win32 error: Logon failur ...
-
bootstrap实现手风琴功能(树形列表)
首先把架包拷进项目,然后在页面中引进css,js <script src="js/jquery/jquery-2.1.1.min.js"></script> ...
-
aiohttp的笔记之TCPConnector
TCPConnector维持链接池,限制并行连接的总量,当池满了,有请求退出再加入新请求.默认是100,limit=0的时候是无限制 1.use_dns_cache: 使用内部DNS映射缓存用以查询D ...
-
dubbo服务启动的方式
dubbo服务启动的方式: 1.dubbo自带的脚本, 2.直接用main方法启动dubbo的spring容器,参见dubbo-test里的各个例子 3.dubbo的spring boot start ...
-
Tinker + Bugly + Jenkins 爬坑之路
前阵子 Android 端的线上崩溃比较多,热修复被提上日程.实现方案是 Tinker,Jenkins 打包,最后补丁包上传到 Bugly 进行分发.主要在 Jenkins 打包这一块爬了不少坑,现记 ...
-
oracle 查询本周数据生成下周数据
CreateTime--2018年1月4日16:38:01 Author:Marydon oracle 查询本周数据生成下周数据 第一步:查询指定区间数据 第二步:改变查询结果的值 查询日期字段+ ...
-
如何实现uboot和linux之间的参数传递
参考http://cgxcn.blog.163.com/blog/static/132312422009101133251202/ 参考:http://blog.chinaunix.net/uid-1 ...