\[\texttt{Preface}
\]

感觉 C 比 B 还简单?

\[\texttt{Description}
\]

给定一个 \(n×n\) 的矩阵,你可以进行若干次操作。

每次操作,你可以将一个 \(k×k\) 的 连续 子矩阵里的所有数全都加上 \(1\) 或者全部都减去 \(1\) 。

初始时,矩阵中有 \(m\) 个位置上的数不为 \(0\) ,其他位置上的数均为 \(0\) 。

请你求出至少需要多少次操作,可以将矩形中所有数都变为 \(0\) 。

\[\texttt{Solution}
\]

为了方便叙述,我们称原矩阵为 \(A\) 。

\(~\)

Subtask1 : \(n \leq 10^3\),\(k \leq 1\)

很显然,答案为 \(\sum\limits_{i=1}\limits^{n}\sum\limits_{j=1}\limits^{n}|A[i][j]|\) 。

至此能拿到 \(11pts\) 。

\(~\)

Subtask2 : \(n \leq 20\),\(k \leq 20\)

我不知道怎么艹过这个子任务欸 qwq 。

理论上是留给暴力选手的。

至此能拿到 \(25pts\) 。

\(~\)

Subtask3 : \(n \leq 100\),\(k \leq 100\)

有点正解的味道了。

首先我们注意到操作的顺序不会影响答案,且一个 \(k×k\) 的子矩阵不能一会加一会减。

\(~\)

考虑 A[1][1] ,它显然只会被一个 \(k×k\) 的子矩阵覆盖(一个左上 \((1,1)\) ,右下 \((k,k)\) 的子矩阵),那么我们只能通过该矩阵来控制 A[1][1]

那我们直接使得该矩阵中的所有元素减去 A[1][1] 即可,我们就要保证该矩阵不能再被操作了。

接着考虑 A[1][2] ,它只会被两个 \(k×k\) 的子矩阵覆盖(一个左上 \((1,1)\) ,右下 \((k,k)\) 的子矩阵,一个左上 \((1,2)\) ,右下 \((k,k+1)\) 的子矩阵),但是我们要保证左上 \((1,1)\) ,右下 \((k,k)\) 的子矩阵不能被操作,否则就破坏了 A[1][1],所以我们只能通过左上 \((1,2)\) ,右下 \((k,k+1)\) 的子矩阵来控制 A[1][2]

直接使得该矩阵所有元素减去 A[1][2] 即可。

以此类推,对于 \((i,j)\) 满足 \(i,j \leq n-k+1\) 的位置,都能按顺序控制 **左上 \((i,j)\) ,右下 \((i+k-1,j+k-1)\) ** 的子矩阵使得 A[i][j] = 0 ,即令该矩阵所有元素减去 A[i][j] 即可。

那么对于剩下的 \((i,j)\) 不满足 \(i,j \leq n-k+1\) 的位置,则已经不能改变 A[i][j] 的值了,所以说,若在这些位置中找到一个 A[i][j] ≠ 0 ,则说明无解。

暴力去修改矩阵,时间复杂度 \(O(k^2(n-k)^2)\) ,由小学数学可得,当 \(k=\frac{n}{2}\) 时,复杂度最高,为 \(O(\frac{n^4}{16})\) ,计算量约为 \(6250000\) ,稳的一批。

至此能拿到 \(42pts\) 。

\(~\)

Subtask4 : \(n \leq 10^3\),\(k \leq 10^3\)

我们发现对矩阵做减法操作可以用一维差分优化到 \(O(k)\) 。

具体的,开个一位差分数组 S[i][j] ,每次令 **左上 \((i,j)\) ,右下 \((i+k-1,j+k-1)\) ** 的矩阵减去 \(d\) 时,我们只需要令 S[i~i+k-1][j] += d, S[i~i+k-1][j+k] -= d 即可,记得在枚举的过程中要用一维前缀和还原当前状态的 \(S\) 数组。

时间复杂度 \(O(k(n-k)^2)\) ,由小学数学可得,当 \(k=\frac{n}{3}\) 时,复杂度最高,为 \(O(\frac{4n^3}{27})\) ,计算量约为 \(148148148\) ,没有亲测过,开个 \(\text{O2}\) 应该稳。

至此能拿到 \(76pts\) 。

\(~\)

Subtask5 : \(n \leq 5×10^3\),\(k \leq 10^3\)

能一维差分干嘛不能二维差分阿

我们发现对矩阵做减法操作可以用二维差分优化到 \(O(1)\) 。

具体的,开个一位差分数组 S[i][j] ,每次令 **左上 \((i,j)\) ,右下 \((i+k-1,j+k-1)\) ** 的矩阵减去 \(d\) 时,我们只需要令 S[i][j] += d, S[i+k][j] -= d, S[i][j+k] -= d, S[i+k][j+k] += d 即可,记得在枚举的过程中要用二维前缀和还原当前状态的 \(S\) 数组。

时间复杂度 \(O((n-k)^2)\) ,稳的一批。

至此能拿到 \(100pts\) 。

\[\texttt{Code}
\]

#include<cstdio>
#include<algorithm> #define RI register int // 卡常1 using namespace std; namespace IO // 卡常2
{
static char buf[1<<20],*fs,*ft;
inline char gc()
{
if(fs==ft)
{
ft=(fs=buf)+fread(buf,1,1<<20,stdin);
if(fs==ft)return EOF;
}
return *fs++;
}
#define gc() getchar()
inline int read()
{
int x=0,f=1;char s=gc();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=gc();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=gc();}
return x*f;
}
}using IO::read; const int N=5010; int n,m,k; long long a[N][N];
long long S[N][N]; long long ans; int main()
{
n=read(),m=read(),k=read(); for(RI i=1;i<=m;i++)
{
int x=read(),y=read(),d=read();
a[x][y]=d;
} for(RI i=1;i<=n;i++)
for(RI j=1;j<=n;j++)
{
S[i][j]=S[i][j]+S[i-1][j]+S[i][j-1]-S[i-1][j-1];
a[i][j]+=S[i][j]; if(i+k-1>n||j+k-1>n)
{
if(a[i][j]==0)
continue;
else
{
puts("-1");
return 0;
}
} ans+=abs(a[i][j]);
S[i][j]+=-a[i][j];
S[i+k][j]-=-a[i][j];
S[i][j+k]-=-a[i][j];
S[i+k][j+k]+=-a[i][j];
} printf("%lld\n",ans); return 0;
}

\[\texttt{Thanks} \ \texttt{for} \ \texttt{watching}
\]

题解 【[MdOI2020] Decrease】的更多相关文章

  1. 题解-Decrease

    [MdOI2020] Decrease 古老的博文. 今天巨佬团队 \(\texttt{luogu}\) 公开赛中的第三题,当时我写了好久才想到暴力做法 \(\texttt{42分}\),后来我还很离 ...

  2. [题解] LuoguP6071 [MdOI2020] Treequery

    传送门 感觉这是一个写的很舒服的题? 树上路径的交什么的就很想树上差分?发现根本没法做...它还要求在线.... 好先来看\(Subtask\)吧\(qwq\)... Subtask 1 \(l=r\ ...

  3. CF1012C Hills 题解【DP】

    思路还是比较简单的 dp 吧,但是就是想不出来-甚至类似的方程都被自己推翻了 Description Welcome to Innopolis city. Throughout the whole y ...

  4. Atcoder arc079 D Decrease (Contestant ver.) (逆推)

    D - Decrease (Contestant ver.) Time limit : 2sec / Memory limit : 256MB Score : 600 points Problem S ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. 大数据框架开发基础之Sqoop(1) 入门

    Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle , ...

  2. OOP之重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的. 属性的重载通过调用类中的__set,__get,__isset,__unset方法来分别实现对不存在属性的赋值.读取.判断属性是否设 ...

  3. Spring Boot从零入门3_创建Hello World及项目剖析

    目录 1 前言 2 名词术语 3 创建Hello World项目 3.1 基于STS4创建项目 3.2 使用Spring Initializr Website创建项目并导入 3.3 基于Spring ...

  4. Java电商支付系统实战(一)- 简介

    现如今,支付成为热点 对于电商业务,这都是不可或缺的 核心功能剖析 下单->支付 nginx 将用户请求反向代理到我们编写的电商系统 = 下单 之后,点击支付跳转到支付系统,最后对接 通过跳转将 ...

  5. PythonI/O进阶学习笔记_11.python的多进程

    content: 1. 为什么要多进程编程?和多线程有什么区别? 2. python 多进程编程 3. 进程间通信 =======================================   ...

  6. 用postman导出excel文件

    原文地址:https://jingyan.baidu.com/article/915fc414559b4351394b2084.html 现在的web和移动开发,常常会调用服务器提供restful接口 ...

  7. 分布式缓存Redis的持久化方式RDB和AOF

    一.前言 Redis支持两种方式的持久化,RDB和AOF.RDB会根据指定的规则“定时”将内存中的数据存储到硬盘上,AOF会在每次执行命令后将命令本身记录下来.两种持久化方式可以单独使用其中一种,但更 ...

  8. Java基础系列1:Java基本类型与封装类型

    Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...

  9. python,for循环的使用案例集

    1.循环执行某一系列操作.将该操作定义为一个def,然后使用for去循环执行该操作 思路,先把操作定义为一个函数,在for循环执行这个函数 比如下面案例,把微信好友列表内的好友,循环的方式依次调整到第 ...

  10. Postwoman-接口测试工具

    地址是:https://postwoman.io/ ,不过只能使用它们自己提供的测试接口,如果你调试自己的API接口的话,你需要自己部署一套代码. 自己搭建一套Postwomen环境的话,只需要安装了 ...