2019牛客多校第⑨场J Symmetrical Painting(思维,离散化)
原题:https://ac.nowcoder.com/acm/contest/889/J
题意:
二维平面上有n个矩形,每个矩形左下角是(i−1,Li)(i−1,Li), 右上角是(i,Ri)(i,Ri),矩形一开始全是黑色,平面不被矩形覆盖的地方是白色,你要把某些黑色区域涂白(一个矩形可以内部颜色不一样),使得黑色区域是一个轴对称图形并且对称轴平行于x轴,求最大黑色区域面积
思路:
经过分析发现ans关于对称轴y是一个线性的函数,而函数的最大值点只可能在 中线处取到,因此我们只需要从下往上枚举每条中线,但是y在矩形下半部分移动和在上半部分移动,这个矩形的ans关于y的单调性是相反的,因此我们需要把矩形分为上半部分和下半部分,分别维护两个集合的大小down和up(对称轴在移动过程中经过的部分矩形有多少个),下半部分的集合对答案的贡献就是(down * 移动距离 * 2) ,上半部分集合对答案的贡献是(-up * 移动距离 * 2)。
为了down和up能O(1)快速更新,需要预处理每次移动两个集合的变化。可以将每条边(底线,中线,上线)离散化,从下往上枚举离散化后的坐标,记录每次底线、中线、上线的变化数量。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=3e5+5;
int l[maxn],r[maxn],mid[maxn];
int a[maxn*3];
int in[maxn*3],out[maxn*3],change[maxn*3];
int main(){
ll n;
cin>>n;
ll size=0;
for(ll i=1;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);
l[i]=l[i]*2-1;//l[i]<=2e9
r[i]=r[i]*2-1;
mid[i]=((ll)l[i]+r[i])>>1;
a[++size]=l[i];
a[++size]=r[i];
a[++size]=mid[i];
}
sort(a+1,a+1+size);
size=unique(a+1,a+1+size)-(a+1);
for(ll i=1;i<=n;i++){
in[lower_bound(a+1,a+1+size,l[i])-a]++;
change[lower_bound(a+1,a+1+size,mid[i])-a]++;
out[lower_bound(a+1,a+1+size,r[i])-a]++;
}
ll down=0,up=0;//下半矩形个数和上半矩形个数
ll temp=0,ans=0;
down+=in[1];
for(ll i=2;i<=size;i++){//第一条是下线,对答案无贡献
temp+=((ll)(down-up)*(a[i]-a[i-1]));
ans=max(temp,ans);
down+=in[i];
down-=change[i];
up+=change[i];
up-=out[i];
}
printf("%lld\n", ans);
}
2019牛客多校第⑨场J Symmetrical Painting(思维,离散化)的更多相关文章
- 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线
题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- [2019牛客多校第二场][G. Polygons]
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
- 2019牛客多校第二场D-Kth Minimum Clique
Kth Minimum Clique 题目传送门 解题思路 我们可以从没有点开始,把点一个一个放进去,先把放入一个点的情况都存进按照权值排序的优先队列,每次在新出队的集合里增加一个新的点,为了避免重复 ...
- 2019牛客多校第二场H-Second Large Rectangle
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...
- 2019牛客多校第二场F-Partition problem(搜索+剪枝)
Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...
随机推荐
- 终于好了 ipython 里执行dos命令 显示结果却显示在kernel界面里 搞定了
import os cmd = r'type c:\foo.txt' os.system(cmd) import os cmd = r'type c:\foo.txt' os.system(cmd) ...
- 【读书笔记】:MIT线性代数(1):Linear Combinations
1. Linear Combination Two linear operations of vectors: Linear combination: 2.Geometric Explaination ...
- django4-模板,templates
如何使用templates呢? 在views.py文件中,函数或者方法通过return render(request,"userInfor.html",{"info_li ...
- python 装饰器 对类和函数的装饰
#装饰器:对类或者函数进行功能的扩展 很多需要缩进的没有进行缩进'''#第一步:基本函数def laxi(): print('拉屎')#调用函数laxi()laxi() print('======= ...
- 61.Merge k Sorted Lists(合并k个排序链表)
Level: Hard 题目描述: Merge k sorted linked lists and return it as one sorted list. Analyze and descri ...
- Juqery插件编写 基础说明
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- C# 交集 差集 并集
Intersect 交集,Except 差集,Union 并集 , , , , }; , , , , , }; var jiaoJi = oldArray.Intersect(newArray).To ...
- dotNET面试(三)
1.简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问 ,也就是类内部的函数等成员可以访问.prot ...
- linux-tomcat-install
1.解压: tar zxvf xxx.tar.gz 配置JDK的环境变量,在etc/profile文件中添加 2.修改Tomcat启动端口 cd tomcat/conf/server.xml中的con ...
- .net 开源项目地址
https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet 这个下面是asp.net core 框架 ...