本题解提供的做法思路应该是比较清晰的,可惜代码实现比较繁琐,仅供大家参考。

题解

不难发现 \(x\) ,\(y\) 的取值范围只有 \(200\) ,所以我们可以考虑从这里入手。我们可以先通过二维前缀和将每个点的上色次数算出来,然后考虑再画矩形。

我们可以先考虑一个矩形的情况,不难发现,如果矩形内的每有一个 \(k-1\) 可以使答案加一,每有一个 \(k\) 可以使答案减一。那如果我们要使答案最大,肯定是 \(1\) 与 \(-1\) 的最大的一个矩阵,发现就是做一个最大矩阵和,可以 \(O(200^3)\) 去搞。

我们再来考虑两个矩形的情况,不难发现,如果是两个边与 \(x\) 轴和 \(y\) 轴平行的不相交的矩形,我们肯定可以用一条平行与 \(x\) 轴或 \(y\) 轴的直线将其分开。如图:



所以我们只需要将整个平面通过平行于 \(x\) 轴和 \(y\) 轴的直线分成两部分,再在其中做最大矩阵和就可以了。

当然直接做是肯定会炸的,所以你需要进行一堆的预处理和前缀和,仔细一点就好了。

以上。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=205,K=1e5+5;
int n,m=200,k;
int h[M][M],res=0,ans=0;
int cntx[M][M],cnty[M][M];
int ansx[M][M],ansy[M][M];
int hhhx[2][M],hhhy[2][M];
int main()
{
cin>>n>>k;
for(int i=1,x1,y1,x2,y2;i<=n;++i)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
++x1,++y1,++x2,++y2;
h[x1][y1]++,h[x2][y2]++;
h[x1][y2]--,h[x2][y1]--;
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=m;++j)
h[i][j]+=h[i-1][j]+h[i][j-1]-h[i-1][j-1],res+=(h[i][j]==k);
}
// for(int i=1;i<=8;++i)
// {
// for(int j=1;j<=8;++j)
// printf("%d ",h[i][j]);
// printf("\n");
// }
// printf("\n");
for(int i=1;i<=m;++i)
{
for(int j=1;j<=m;++j)
{
cntx[i][j]=cntx[i-1][j]+(h[i][j]==k-1)-(h[i][j]==k);
cnty[i][j]=cnty[i][j-1]+(h[i][j]==k-1)-(h[i][j]==k);
}
}
// for(int i=1;i<=8;++i)
// {
// for(int j=1;j<=8;++j)
// printf("%d ",cntx[i][j]);
// printf("\n");
// }
// printf("\n");
// for(int i=1;i<=8;++i)
// {
// for(int j=1;j<=8;++j)
// printf("%d ",cnty[i][j]);
// printf("\n");
// }
// printf("\n");
int tmp;
for(int i=1;i<=m;++i)
{
for(int j=1;j<=i;++j)
{
tmp=0;
for(int c=1;c<=m;++c)
{
tmp=max(tmp+cntx[i][c]-cntx[j-1][c],0);
ansx[i][j]=max(ansx[i][j],tmp);
}
}
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=i;++j)
{
tmp=0;
for(int c=1;c<=m;++c)
{
tmp=max(tmp+cnty[c][i]-cnty[c][j-1],0);
ansy[i][j]=max(ansy[i][j],tmp);
}
}
}
// for(int i=1;i<=8;++i)
// {
// for(int j=1;j<=8;++j)
// printf("%d ",ansx[i][j]);
// printf("\n");
// }
// printf("\n");
// for(int i=1;i<=8;++i)
// {
// for(int j=1;j<=8;++j)
// printf("%d ",ansy[i][j]);
// printf("\n");
// }
// printf("\n");
for(int i=1;i<=m;++i)
{
hhhx[0][i]=hhhx[0][i-1];
for(int j=1;j<=i;++j)
hhhx[0][i]=max(hhhx[0][i],ansx[i][j]);
}
for(int i=m;i>=1;--i)
{
hhhx[1][i]=hhhx[1][i+1];
for(int j=m;j>=i;--j)
hhhx[1][i]=max(hhhx[1][i],ansx[j][i]);
}
for(int i=1;i<=m;++i)
{
hhhy[0][i]=hhhy[0][i-1];
for(int j=1;j<=i;++j)
hhhy[0][i]=max(hhhy[0][i],ansy[i][j]);
}
for(int i=m;i>=1;--i)
{
hhhy[1][i]=hhhy[1][i+1];
for(int j=m;j>=i;--j)
hhhy[1][i]=max(hhhy[1][i],ansy[j][i]);
}
ans=res;
for(int i=2;i<=m;++i) ans=max(ans,res+hhhx[0][i-1]+hhhx[1][i]);
for(int i=2;i<=m;++i) ans=max(ans,res+hhhy[0][i-1]+hhhy[1][i]);
printf("%d\n",ans);
return 0;
}

P6100 [USACO19FEB]Painting the Barn G的更多相关文章

  1. [USACO19FEB]Painting the Barn G

    题意 \(n\)个矩阵\((0\le x_1,y_1,x_2,y_2\le 200)\),可交,可以再放最多两个矩阵(这两个矩阵彼此不交),使得恰好被覆盖\(k\)次的位置最大.\(n,k\le 10 ...

  2. 洛谷 P5542 [USACO19FEB]Painting The Barn

    题目传送门 解题思路: 二维差分的板子题.题解传送门 AC代码: #include<iostream> #include<cstdio> using namespace std ...

  3. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  4. Storyboards Tutorial 03

    这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...

  5. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  6. [USACO17DEC] Barn Painting

    题目描述 Farmer John has a large farm with NN barns (1 \le N \le 10^51≤N≤105 ), some of which are alread ...

  7. [USACO17DEC] Barn Painting - 树形dp

    设\(f[i][j]\)为\(i\)子树,当\(i\)为\(j\)时的方案数 #include <bits/stdc++.h> using namespace std; #define i ...

  8. 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】

    看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...

  9. [USACO 2017DEC] Barn Painting

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5141 [算法] 树形DP 时间复杂度 : O(N) [代码] #include< ...

随机推荐

  1. 【linux】gpio子系统

    目录 前言 linux子系统 gpio子系统 gpio子系统实战-系统调用 前言 目前不涉及驱动源码 参考链接 linux子系统 在 Linux 系统中 绝大多数硬件设备都有非常成熟的驱动框架 驱动工 ...

  2. 用rsync备份一台linux服务器上的数据

    rsync是安装完linux后都会自带的,在机器上运行rsync命令看是否有安装即可 备份到远程服务器 这里介绍的rsync的用途是备份一台linux服务器上的数据到另外一台机器 环境 将需要备份机器 ...

  3. 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据

    1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...

  4. 一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?

    摘要:近日,华为云数据库业务总裁苏光牛在ACMUG中国MySQL用户组主办的 "华为云专场" 技术沙龙中分享了华为云数据库重磅新品GaussDB的核心能力与竞争优势.那么, Gau ...

  5. 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?

    前言 昨天在整理粉丝给我私信的时候,发现了一个挺有意思的事情.是这样的,有一个粉丝朋友私信问我Java 的 Exception 和 Error 有什么区别呢?说他在面试的时候被问到这个问题卡壳了,最后 ...

  6. 思维导图iMindMap怎么做大型项目管理

    在大型企业中,有许多大型而复杂的项目,你要考虑内外部因素.期限以及你要达成的目标等等,所以我们要进行项目管理.下面小编教你怎么用iMindMap思维导图进行项目管理. iMindMap有一个工作区,以 ...

  7. 【基于Puppeteer前端自动化框架】【二】PO模式,断言(如何更简便逻辑的写测试代码)

    一.概要 前面介绍了Puppeteer+jest+TypeScript做UI自动化,但是这知识基础的,我们实现自动化要考虑的很多,比如PO模式,比如配置文件,比如断言等等.下面就来一一实现我是怎么用p ...

  8. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  9. 这几个很实用的Linux命令,千万别忘记了!

  10. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...