七夕祭 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. linux期末考试题(2)

    linux期末考试题 一.选择题(共30分,每小题2分) 1.以下关于自由软件的说法,正确的是(D) A.自由软件是一种有版权保护的软件 B.修改自由软件应取得原作者的许可 C.微软的 Ofice 软 ...

  2. MFC单文档应用程序引入GDI+

    在MFC中引入GDI+,步骤如下: 1.在需要用到GDI+的文件中添加GDI+文件 1 #include <gdiplus.h> 2 using namespace Gdiplus; 2. ...

  3. C++右值和移动

    值分左右 C++表达式的值类别: 这些名词的字面含义: 一个lvalue是通常可以放在等号左边的表达式,左值 一个rvalue是通常只能放在等号右边的表达式,右值 一个glvalue是generali ...

  4. 阿里云手工配置Nginx

    Nginx服务器是网站反向代理,负载均衡,以及动静分离的神器,由于是第一次在阿里云上配置这个,花费了大半天,终于配置成功了.下面简要的介绍下其流程,以备后面又搞忘了.前提是自动装装不上 购买阿里云服务 ...

  5. codeup之字符串比较

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

  6. Docker基本使用方法

    Docker 的基本使用方法 最近在尝试复现研究CVE,docker太方便了,学了下基本的使用方法,怕忘记,记于此处 1. 容器与镜像 镜像是一堆只读的文件. 容器 = 镜像 + 读写层 运行态的容器 ...

  7. Win32汇编学习笔记05

    定位关键点3种方法: 过程函数 api 字符串 但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的 窗口程序看控件信息 1.通过OD去看 还可以用 spy ++ 查 ...

  8. 10年+.NET Coder 心语 ── 单一职责原则的思维:为什么你的代码总在"牵一发而动全身"

    引言 在编程的世界里,面向对象设计(Object-Oriented Design, OOD)就像盖房子时打下的地基,决定了一个系统是否稳固.耐用.而在众多设计原则中,单一职责原则(Single Res ...

  9. Manim实现旋转变色特效

    在数学动画的世界里,旋转与变色特效无疑是最能吸引观众眼球的元素之一. 今天,就让我们一起探索如何使用Manim框架来实现自定义的旋转变色特效吧! 1. 实现原理 Manim的动画魔法源于Animati ...

  10. C++协程:异步编程的轻量级解决方案

    1. ​协程的本质与特性​ C++20引入的协程(Coroutines)是一种可暂停和恢复的函数,通过co_await.co_yield.co_return三个关键字实现非抢占式任务调度. 与传统线程 ...