首页 > 其他分享 >P8648 [蓝桥杯 2017 省 A] 油漆面积

P8648 [蓝桥杯 2017 省 A] 油漆面积

时间:2023-12-26 12:56:26浏览次数:41  
标签:ch P8648 重合 差分 蓝桥 坐标 矩形 2017 include

1.首先想到的错解

看到数据范围,就想先写个n^2的暴力:先把所有矩形的面积都算出来,然后再把所有重合的部分挨个减去,把每个重合的部分当成一个个小矩形,用set来判重。

画一个稍复杂些的样例,就会发现,在这些由重合部分产生的小矩形之间,仍有重合,所以这种算法,会导致算出来的重合部分偏大,而导致最后的答案偏小。

2.正解

扫描线,但是暂时不会。

3.因为这道题的n小于等于10000,所有的坐标也都小于等于10000,所以可以直接用差分和前缀和来做,时间复杂度为n^2(这里面还有个小技巧,开10^8的数组可能太大了,但是注意到,最后的答案不会超过10^4,因此可以不开int,开short来省空间)

同时注意到,全局变量下y1会有冲突,但是局部变量不会。

同时还要注意:是对角点的坐标,不是格子的坐标

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define For(i, j, n) for (int i = j; i <= n; ++i)
using namespace std;

const int N = 10005;

short n;

inline short read()
{
    short x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')
        ch = getchar();
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x;
}

short a[N][N];

short mx, my;

void insert(short x1, short y1, short x2, short y2)
{
    /*a[x1][y1]++;
    a[x1][y2 + 1]--;
    a[x2 + 1][y1]--;
    a[x2 + 1][y2 + 1]++;*/
    ++a[x1][y1];
    --a[x1][y2];
    --a[x2][y1];
    ++a[x2][y2];
}

int main()
{
    n = read();
    for (short i = 1; i <= n; i++)
    {
        short x1 = read() + 1, y1 = read() + 1, x2 = read() + 1, y2 = read() + 1;
        mx = max(mx, x2);
        my = max(my, y2);
        insert(x1, y1, x2, y2); // 矩阵差分
    }
    int ans = 0;
    for (short i = 1; i <= mx; i++)
        for (short j = 1; j <= my; j++)
        {
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
            if (a[i][j] >= 1)
                ans++; // 以每个格子为单元来进行答案的统计
        }
    printf("%d\n", ans);
    return 0;
}

因此这里的差分和差分模板略有不同,没有那些加一

 

标签:ch,P8648,重合,差分,蓝桥,坐标,矩形,2017,include
From: https://www.cnblogs.com/smartljy/p/17927892.html

相关文章

  • HNOI2017影魔题解
    HNOI2017影魔对于两种贡献,都只用考虑左边第一个比自己大的,和右边第一个比自己大的数,分别记为\(l_i、r_i\)对于询问一,每个数对\((l_i,r_i)\)构成全部情况对于询问二,可以拆分成\(x=l_i\)时,\(y\in[i+1,r_i-1]\),以及\(y=r_i\)时,\(x\in[l_i+1,i-1]\)我们考虑用扫描线......
  • P8647 [蓝桥杯 2017 省 AB] 分巧克力
    二分#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intn,k,upb;inth[N],w[N];inlineintread(......
  • P8646 [蓝桥杯 2017 省 AB] 包子凑数
    根据裴蜀定理可得INF的情况是所有数的最大公约数非1而我们的完全背包的上限是多少呢?设置为Σai即可,因为把每一个ai用上之后的集合,和ai可以重复使用的集合,只差了整数倍个ai,因此可达性是完全一致的,这里N<=100,ai<=100,所以我们把这个背包的上限设置为10000.#include<bits/stdc+......
  • 【每周例题】蓝桥杯 C++ 区间最大和
    区间最大和题目蓝桥杯区间最大和题目分析  这道题涉及到了区间问题,我们首先要了解规定的该区间范围:1<p且p+k一1<n,我们将其转化:1<p<n-k+1,当我们得到这个区间的时候,需要求该区间的最大和可以用双重for循环搞定。代码 #include<iostream>usingnamespacestd;int......
  • cpp环境搭建 - vs2017编译CMakeLists项目(Box2dLite)
    box2dlite地址:GitHub-erincatto/box2d-lite:Asmall2Dphysicsengine vs2017不支持utf-8withoutbom问题box2dlite的源码文件是utf-8withoutbom的,如果在里面写了中文注释,就会出现编译错误解决办法:将文件编码改成utf-8带bom的(这边没有在附加选项加/utf-8貌似也没问题......
  • IDE之VS:Visual Studio的简介(包括 VS2013、VS2015、VS2017、VS2019、VS2022)、安装、
    原文链接:https://blog.csdn.net/qq_41185868/article/details/81052119最近开始使用vs2019,应该是最新的版本。之前都是vs2015,感觉19更智能,兼容性更好,速度也更快。详细了解下这几个版本。1、简介:MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品,功能完备的I......
  • [SDOI2017] 树点涂色
    [SDOI2017]树点涂色题目描述Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。Bob可能会进行这几种操作:1x表示把点\(x\)到根节点的路......
  • 计概杂烩2017
    2017计概期末探险家丁丁#include<stdio.h>/*C语言初始模板程序*/intmain(void){doublef;scanf("%lf",&f);printf("%.5lf",5.0*(f-32)/9); return0;}摘礼物#include<stdio.h>inta[2000];intmain(void){intn,k,ans......
  • 蓝桥杯 矩形拼接
    题目位置让我想起了2019四川省赛的一道题。如果三个矩形中有两个矩形各有一条边相等,则至少6条边;若3个矩形都有一条边相等,则至少4条边。如果有一个矩形的一条边是另外两个矩形的某条边之和,则至少6条边;若再次基础上,另外两个矩形的另外一条边相等,则至少4条边用全排列+循环,反正枚......
  • 蓝桥杯 消除游戏
    题目位置主要需要用到模拟链表。做法是先整体扫一遍,将要删除的位置存下来。然后在删除这些位置的过程中,判断该位置的左右是否需要在下一轮删除,如果需要,就存下来。这样循环,直到没有位置需要删除。细节看代码N=int(1e6)+10pre=[i-1foriinrange(N)]nxt=[i+1fori......