J - Symmetrical Painting

题意

给你\(n\)个矩形, 左下角\((i-1,\ L_i)\), 右上角\((i,\ R_i)\), 找一条线\(l\)平行于\(x\)轴, 让这些矩形根据\(l\)对称,不对称的部分删去,问最大的对称图形的面积是多少?

思路

主要就是要枚举对称轴啦,从小到大枚举\(L_i、(L_i+R_i)/2、R_i\),这三种位置为对称轴。

那枚举的时候要怎么维护矩形面积。

  • 首先可以把\(L_i*2、R_i *2\),这样取中间不会出现误差。
  • 然后分别标记三种位置为\(1:L_i、\ \ \ 2:(L_i+R_i)/2、\ \ \ 3:R_i\)
  • 根据位置从小到大排序
  • 用\(a和b\)标记加还是减, \(ans\):当前对称图形的面积

    1、如果碰到标记\(1, a++\)

    2、如果碰到标记\(2, a--, b++\)

    3、如果碰到标记\(3, b--\)

    \(ans =ans + ( w_i - w_{i-1})*(a-b)*2\), 下面只针对一个矩形进行分析

    • \(L_i \le w_i \le (L_i+R_i)/2\):对称面积变大, \(ans =ans + ( w_i - w_{i-1})*2\)
    • \((L_i+R_i)/2\le w_i \le R_i\):对称面积变小, \(ans =ans - ( w_i - w_{i-1})*2\), 因为之前加过\((L_i+R_i)/2\)~\(L_i\)的面积, 现在需要的面积是\(w_i\)~\(R_i\)的面积,那么就前面的减去\(( w_i - w_{i-1})*2\)
    • \(R_i \le w_i\)L:面积等于\(0\),再把\(b--\)就可以了。
  • 最后的答案要记得\(Max/2\)

    比赛的时候想的到枚举对称轴之类的,但是一直想不明白怎么维护,后来看到一些大佬的代码,简洁又巧妙。。。反正我想不出来。。继续努力吧。

代码

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 3e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T;
struct Node{
ll w;
int id;
bool operator < (Node const & a){
return w < a.w;
}
}node[maxn*4]; int main() {
scanf("%d", &n);
ll l, r;
int cnt = 0;
for(int i = 1; i <= n; i++){
scanf("%lld%lld", &l, &r);
l *= 2;
r *= 2;
node[++cnt] = {l, 1};
node[++cnt] = {(l+r)/2, 2};
node[++cnt] = {r, 3};
}
sort(node+1, node+cnt+1);
ll a = 0, b = 0, ans = 0, Max = 0;
for(int i = 1; i <= cnt; i++){
ans += (node[i].w - node[i-1].w)*(a-b)*2; \\也可以这边不乘,最后就不用除了
if(node[i].id == 1)
a++;
if(node[i].id == 2){
a--;b++;
}
if(node[i].id == 3)
b--;
Max = max(Max, ans);
}
printf("%lld\n", Max/2);
return 0;
}

牛客多校训练营第九场 J - Symmetrical Painting (排序)的更多相关文章

  1. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  2. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

    链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...

  4. 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线

    题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...

  5. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  6. 18牛客多校训练第二场 J farm

    题意:一个n×m的农田, 每个小格子都有一种作物, 现在喷t次农药,每次农药覆盖一个矩形, 该矩形里面与农药类型不同的植物都会死掉, 求最后植物的死亡数是多少. 题解:二维树状数组. 每次喷农药的时候 ...

  7. 2019牛客多校第四场J free——分层图&&最短路

    题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...

  8. 牛客多校第10场J Wood Processing 分治优化/斜率优化 DP

    题意:你有n块木头,每块木头有一个高h和宽w,你可以把高度相同的木头合并成一块木头.你可以选择一些木头消去它们的一部分,浪费的部分是 消去部分的高度 * 木头的宽度,问把n块木头变成恰好m块木头至少要 ...

  9. 2019 牛客多校第六场 J Upgrading Technology

    题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> u ...

随机推荐

  1. Ubuntu 18.04 截图工具 Shutter(可以标记重点)-安装及使用

    Shutter 是一个功能丰富的屏幕截图程序.您可以屏幕的某个特定区域.特定的窗口. 或者是整个屏幕,甚至一整个网站截图.可以对截图应用各种效果,标记重点,然后上 传到一个图片托管网站——所有的任务在 ...

  2. Jenkins使用四:Jenkins创建任务,实现代码有改动时,自动构建

    新建任务 指定在哪台节点运行 添加要监控的git地址和使用账号,此账号为设置节点时配置公私钥时设置的ssh登录账号 设置检查代码是否有变更的频率,每三分钟检查一次,如果检查到有变更就构建 修改文件再提 ...

  3. Jenkins使用三:管理slave节点(配置SSH公钥和私钥)

    添加slave 给节点起个名字 1.远程工作目录:/test/workspace--这个地址是测试机的 jenkins 的 workspace 工作目录,自己随便写个本机的路径2.用法--尽可能的使用 ...

  4. Dapper - a simple object mapper for .Net

    Dapper - a simple object mapper for .Net Release Notes Located at stackexchange.github.io/Dapper Pac ...

  5. HTML-字符实体,平方米(㎡)m²

    转载自:https://blog.csdn.net/hangGe0111/article/details/80983250

  6. Mac005--VS&webstorm前端开发工具安装

    Mac--Visual studio Code工具安装(企业常用) 安装网址:https://code.visualstudio.com/download 设置格式: 1.配置工作区与终端字体大小 常 ...

  7. JavaScript Tre

    function BinarySearchTree() { var Node = function(key) { this.key = key; this.left = null; this.righ ...

  8. 《JAVA设计模式》之适配器模式(Adapter)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...

  9. 手模手配置Eslint,看懂脚手架中的Eslint

    使用ESLint前:eslint是干嘛的,我这样写有什么问题,怎么还报错了,太麻烦想去掉这个插件,脚手架中关于eslint文件里的配置是什么意思?怎么设置配置项和规则达到自己想要的检测效果呢?怎么集成 ...

  10. windows使用ubuntu启动linux服务

    有些服务只能在linux中策马奔腾,但是公司配置windows电脑,因此在windows中安装ubuntu服务,再在启动的ubuntu中启动linux服务 系统:win10(其他系统没试过) 安装步骤 ...