洛谷P10453 七夕祭题解
七夕祭 P10453 (前缀和)
P10453 七夕祭 - 洛谷
矩形的祭典会场由 N 排 M 列共计 \(N \times M\) 个摊点组成。
虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋…… 么的。
Vani 预先联系了七夕祭的负责人 zhq, 希望能够通过恰当地布置会场,使得各行中 cl 感兴趣的摊点数一样多,并且各列中 cl 感兴趣的摊点数也一样多。
不过 zhq 告诉 Vani, 摊点已经随意布置完毕了,如果想满足 cl 的要求,唯一的调整方式就是交换两个相邻的摊点。
两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。
由于 zhq 率领的 TYVJ 开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。
现在 Vani 想知道他的两个要求最多能满足多少个。
在此前提下,至少需要交换多少次摊点。
输入格式
第一行包含三个整数 N 和 M 和 T , T 表示 cl 对多少个摊点感兴趣。
接下来 T 行,每行两个整数 x , y , 表示 cl 对处在第 行第 y 列的摊点感兴趣。
输出格式
首先输出一个字符串。
如果能满足 Vani 的全部两个要求,输出 both;
如果通过调整只能使得各行中 cl 感兴趣的摊点数一样多,输出 row;
如果只能使各列中 cl 感兴趣的摊点数一样多,输出 colum;
如果均不能满足,输出 impossible。
如果输出的字符串不是 impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。
正式题解
1. 找最浅显性质
行与列的变换都是独立事件 (互不影响)。
容斥思想:当 \(t \% n == 0\) 时,才可能满足行的要求,列同理。
2. 推交换次数表达式
既然已经判断有无解,问题就可以转化为:
有 n 个人和 m 张牌,坐成一个环,第 i 个人有 x [i] 张牌,相邻的人交换牌,使得每个人手中的牌数量相等。
还是先找最浅显性质。
所以我们可以看看在哪破环最优,列出对应的表达式。
- 观察最特殊点 -- 环的处理 (环的处理方法): 发现一定有两个人之间没有换牌 (反证法证明:如果每两个人间都交换,那么牌一定被换一圈,不是最优)。
具体推导
每个人手中最后 \(\frac{m}{n}\) 张,设每个人多或少 \(a[i] = \frac{m}{n} - x[i]\)。
环上不好看,先看链上:
对于第 1 个人,还差 \(a[i] = \frac{m}{n} - x[i]\), 只能找 2 要。
2 此时还差 \(a[2] + a[1]\), 只能找 3 要。
发现有前缀和关系:
a 的前缀和数组是 s:
\(ans = \sum s[i]\)
- 扩展到环上:假设 k 和 k-1 不换牌,a 的前缀和数组是 S :
\([k, n]\) 的人:
\[\sum_{j=k}^{n}|s[j] - s[k-1]|
\]\([1, k-1]\) 的人:
\[\sum_{j=1}^{k-1}|s[j] + s[n] - s[k-1]|
\]发现两个式子差 \(s[n]\), 仔细观察 \(s[n]\) 的性质,为所有人对于全部牌的多或少的量,不难发现只能是 1 :. 对于 \([1, n]\)
\]
就是求它的最小值,把绝对值视作距离:问题转化为 “货舱选址问题”
数轴上有一些仓库,位置是 s [i], 找一个仓库,使得它到所有仓库距离和最小。
- 结论:k-1 就是 s 的中位数。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100009;
int n, m;
int row[N], col[N];
int t;
int a[N];
int cal(int *x, int n)
{
memset(a, 0, sizeof a);
for (int i = 1; i <= n; ++i)
a[i] = t / n - x[i];
for (int i = 1; i <= n; ++i)
a[i] += a[i - 1];
int mid = (n + 1 >> 1);
sort(a + 1, a + 1 + n);
int d = a[mid];
int res = 0;
for (int i = 1; i <= n; ++i)
res += (abs(a[i] - a[mid]));
return res;
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
cin >> n >> m >> t;
memset(row, 0, sizeof row);
memset(col, 0, sizeof col);
for (int i = 1; i <= t; ++i)
{
int x, y;
cin >> x >> y;
++row[x];
++col[y];
}
int ans = 0;
bool yr = 0, yc = 0;
if (!(t % n))
yr = 1;
if (!(t % m))
yc = 1;
if (yr && yc)
{
int p = cal(row, n) + cal(col, m);
cout << "both" << " " << p << "\n";
}
else if (yr)
{
cout << "row" << " " << cal(row, n) << "\n";
}
else if (yc)
{
cout << "column" << " " << abs(cal(col, m)) << "\n";
}
else
cout << "impossible" << "\n";
return 0;
}
部分题解思路来自蓝书
洛谷P10453 七夕祭题解的更多相关文章
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
- 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】
大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...
- 洛谷P5364 [SNOI2017]礼物 题解
传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...
随机推荐
- ORA-24247:网络访问被访问控制列表(ACL)拒绝器
我在oracle 存储过程中发送http请求, 报错如下: ORA-29273:HTTP请求失败 ORA-06512:在"SYS.UTL HTTP",line 1527 ORA-2 ...
- IO流-转换流、序列化流--java进阶day14
1.转换流 转换流本质还是字符流的子类 转换流的作用 1.可以按照指定的编码进行读写操作 我们使用的IO流,默认格式都是UTF-8,如果一个文件是GBK格式,在读写的时候就会乱码,此时就可以使用转换流 ...
- 遇到的问题之“input的值感觉没有设置上去,却有值”
案例一.批量设置参数 1.被设置的框 改为下拉框的问题可参考:https://www.cnblogs.com/saoge/p/16985318.html <td> <app:inpu ...
- 浅析鸿蒙(ark runtime)执行动态代码
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- TwoSum---LeetCode进阶路①
LeetCode敲门题: 题目: Given an array of integers, return indices of the two numbers such that they add up ...
- JuiceFS v1.3-Beta1:一亿文件备份分钟级完成,性能优化全解析
在最新发布的 JuiceFS v1.3 Beta1 版本中,我们引入了一种全新的二进制备份机制,旨在更高效地应对亿级文件规模下的备份与迁移场景.相比现有的 JSON 备份方式,该机制在导入导出元数据时 ...
- 【深入理解Base64编码】原理、应用与Java实战
深入理解Base64编码:原理.应用与Java实战 目录 1-什么是base64编码 2-base64编码原理详解 3-base64的java实现 4-高级应用与技巧 5-注意事项与常见误区 6-总结 ...
- EasyExcel工具类,可导出单个sheet、导出多个sheet
单个sheet导出案例 ExcelUtil.exportXlsx(response, "测试数据", "测试数据", list, TestDataPageDto ...
- Huawei Matebook e 2022 安装 archlinux 双系统
本文同步发布于我的网站 安装之前 wifi 名称修改为英文+数字的,以防之后没法联网 准备好 U 盘并使用 GPT 分区表写入最新的 arch 镜像. 基础安装 开机按 F2 进入 UEFI/BIOS ...
- Gin?有这一篇就够了!
Gin Gin是Golang的一个后端框架,封装比较优雅,API友好. go get -u github.com/gin-gonic/gin 1.hello word package main imp ...