七夕祭 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] 张牌,相邻的人交换牌,使得每个人手中的牌数量相等。

还是先找最浅显性质。

所以我们可以看看在哪破环最优,列出对应的表达式。

  • 观察最特殊点 -- 环的处理 (环的处理方法): 发现一定有两个人之间没有换牌 (反证法证明:如果每两个人间都交换,那么牌一定被换一圈,不是最优)。

具体推导

  1. 每个人手中最后 \(\frac{m}{n}\) 张,设每个人多或少 \(a[i] = \frac{m}{n} - x[i]\)。

  2. 环上不好看,先看链上:

  • 对于第 1 个人,还差 \(a[i] = \frac{m}{n} - x[i]\), 只能找 2 要。

  • 2 此时还差 \(a[2] + a[1]\), 只能找 3 要。

  • 发现有前缀和关系:

    • a 的前缀和数组是 s:

      \(ans = \sum s[i]\)

  1. 扩展到环上:假设 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]\)

\[ans = \sum_{j=1}^{n}|s[j] - s[k-1]|
\]

就是求它的最小值,把绝对值视作距离:问题转化为 “货舱选址问题”

数轴上有一些仓库,位置是 s [i], 找一个仓库,使得它到所有仓库距离和最小。

  1. 结论: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 七夕祭题解的更多相关文章

  1. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  2. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  3. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  4. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  7. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

  8. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  9. 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】

    大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...

  10. 洛谷P5364 [SNOI2017]礼物 题解

    传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...

随机推荐

  1. Java编程--简单的Proxy程序(代理设计模式)

    有时候对象要完成某项任务(功能)需要很多步骤,而这些步骤全部交给对象自己完成显然是不现实的,就像我们人要吃饭,你总不能要求我们每个人都去种地.打面.做饭一样,我们只需要完成其中的吃饭这一核心操作就可以 ...

  2. 超越代码生成:AI 如何重塑软件开发全生命周期 (SDLC)? (需求、测试到部署)

    引言:AI 不止写代码,软件开发的"全链路"变革已至 各位技术圈的朋友们,提到 AI 在软件开发中的应用,恐怕大多数人首先想到的还是 GitHub Copilot.DeepSeek ...

  3. 信息资源管理综合题之“某国企投资IT应用人员减少但生成率没有实质性变化的IT黑洞问题”

    一.某大型国企在IT应用上投资了2000万美元,虽然蓝领工人数量大幅减少,但实际生产率并未有实质性变化 1.企业在IT应用上的巨额投资并未达到预期目标的这种现象被称为什么? 2.产生这现象的原因有哪些 ...

  4. codeup之字符串比较

    Description 比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数:若s1=s2,则输出0:若s1<s2,则输出一个负数. 要求:不用strcpy函数:两个字符串用ge ...

  5. ES查不到最近的数据解决方法

    其实是因为索引的刷新策略导致的,不是实时刷新的. 下载开源的 ES 界面客户端ES King:https://github.com/Bronya0/ES-King 连接后,选择索引,选择flush索引 ...

  6. 为什么使用MQ

    在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...

  7. docker-compose 启动容器

    docker-compose 是什么 docker-compose 是一个用来把 docker 自动化的东西.有了 docker-compose 你可以把所有繁复的 docker 操作全都一条命令,自 ...

  8. ps ef命令查询进程号pid

      楼兰胡杨已经在<五分钟扫盲:25个工作中常用的Linux命令>分享了ps命令的简单使用方法,但是,写的过于笼统,这里详细介绍一下.   语法:ps -ef | grep process ...

  9. select * 和 select 字段的区别

    摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select * .   在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验:业界各位大佬都提到 ...

  10. Spring、Spring Framework、Spring Boot、Spring Cloud的区别

    Spring Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework.Spring Boot.Spring Cloud等(还包括Spring Cloud ...