题目描述

给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\infty)$时间内一个点被覆盖的最多矩形数量。n<=10^5。

分析

部分分给的可真多,$n^2$就能拿80pts(然而我n==2的特判打错了(不知道为什么我puts("0")了qwq)变成70pts)

首先:我们可以把竖着运动的矩形看成静止不动,把横着运动的矩形看成延斜率k=-1的直线运动的矩形

  因为一开始没有重复矩形,所以最后最多只有两个重复,所以答案不是1,就是2

  所以我们输出rand()%2+1

  考试的时候把这道题当做计算几何做了...

考虑$n^2$做法:

  由上面的分析可以得到,如果答案为2,只有这三种情况:

  分别枚举每一个0的矩形和1的矩形判断有没有重叠就好了

  注意check的时候能不能取等号

考虑优化:

  显然我们可以把这题转换成区间覆盖,每个矩形变成这样的线段:

$$(x_2-x_1-w_1,x_2+w_2-x_1)$$

$$(y_1-y_2-h_2,y_1+h_1-y_2)$$

然后化简一下,用贪心做区间覆盖就好了(比我打的$n^2$还简单。。。)

 #include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int M = 1e5+;
int n,T,n1,n2;
//-----------------------------------n^2暴力做法------------------------------------
struct P{int x,y,w,h;}a[M],b[M];
struct Poi{int x,y;};
struct Line{int a[];}ll[M];
int L[M];
int s[][];
inline bool check_up(Poi x,int l){
int y=-x.x+l;
if(x.y>y) return ;
return ;
}
inline bool check_down(Poi x,int l){
int y=-x.x+l;
if(x.y<y) return ;
return ;
}
inline bool check(Poi x,Poi y,int l1,int l2){
int y1=-x.x+l1,y2=-y.x+l2;
if(x.y>=y1&&y.y<=y2) return ;
return ;
}
inline void Solve_1(){
n=read();n1=,n2=;
for(int i=;i<=n;i++){
int x=read(),y=read(),w=read(),h=read(),d=read();
if(d==)
a[++n1]=(P){x,y,w,h};
else b[++n2]=(P){x,y,w,h};
}
for(int i=;i<=n1;i++){
ll[i].a[]=a[i].x+a[i].y;
ll[i].a[]=a[i].x+a[i].y+a[i].w+a[i].h;
}int ff=;
for(int i=;i<=n2;i++){
Poi A,B;
A=(Poi){b[i].x,b[i].y};
B=(Poi){b[i].x+b[i].w,b[i].y+b[i].h};
for(int j=;j<=n1;j++){
if(check_down(A,ll[j].a[])&&check_up(B,ll[j].a[])||
check_down(A,ll[j].a[])&&check_up(B,ll[j].a[])||
check(A,B,ll[j].a[],ll[j].a[]))
{ff=;break;}
}
}if(!ff) puts("");else puts("");
}
//--------------------------------------------------------------------------------------------
int lst[M],ff;
struct PP{int x,y,type;}seg[M];
bool cmp(const PP&a,const PP&b){return a.x==b.x&&a.y<b.y||a.x<b.x;}
inline void Solve(){
n=read(),ff=;
for(int i=;i<=n;i++){
int x=read(),y=read(),w=read(),h=read(),d=read();
seg[i]=(PP){x+y,x+y+w+h,d};
}sort(seg+,seg+n+,cmp);
memset(lst,-0x3f,sizeof(lst));
for(int i=;i<=n;i++){
if(seg[i].x<lst[seg[i].type^]){
puts("");
ff=;break;
}lst[seg[i].type]=max(lst[seg[i].type],seg[i].y);
}if(!ff)puts("");
}
int main(){
freopen("cloud.in","r",stdin);
freopen("cloud.out","w",stdout);
T=read();
while(T--){
// Solve_1();
Solve();
}
return ;
}

[NOIP2019模拟赛]LuoguP4261白金元首与克劳德斯的更多相关文章

  1. code+3月赛 loj6299 白金元首与克劳德斯

    千里白金雪满天 烽火江山起狼烟 分手竟兵刃相见 1941.7. 苏联军队出乎意料的反抗力量.前线德军的补给困难 —— 元首 Adolf 望着天空的云层陷入沉思…… 在 xyxyxy-直角坐标平面的天空 ...

  2. 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    [题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...

  3. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...

  4. test20190827 NOIP2019 模拟赛

    100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...

  5. test20190826 NOIP2019 模拟赛

    100+100+40=240.我觉得如果没做过第三题考场上却能想出来的都是神仙. 基因突变 [问题描述] 邪恶的 707 刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大 ...

  6. test20190818 NOIP2019 模拟赛

    0+0+20=20,不给大样例,小数据又水,还没有题解的垃圾题. A 题 问题描述: long long ago, Lxhgww 统治的国家里有 n 个城市,其中某一个城市是 capital (首都) ...

  7. test20190816 NOIP2019 模拟赛

    100+100+20=220,T3吐槽:整个考室没有一个人正确地理解了题意. 树上路径(phantasm) Akari 的学校的校门前生长着一排 n 棵树,从西向东依次编号为 1 ∼ n.相邻两棵树间 ...

  8. 题解 noip2019模拟赛Day1T3

    题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...

  9. [NOIP2019模拟赛][AT2381] Nuske vs Phantom Thnook

    题目链接 评测姬好快啊(港记号?)暴力40pts变成60pts 因为题目说了保证蓝色点两两之间只有一条路径,所以肯定组成了一棵树,而对于每次询问的x1,y1,x2,y2的子矩阵中就存在着一个森林 不难 ...

随机推荐

  1. LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)

    传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...

  2. 2019/11/8 CSP模拟

    T1 药品实验 内网#4803 由概率定义,有\[a + b + c = 0\] 变形得到\[1 - b = a + c\] 根据题意有\[p_i = a p _{i - 1} + b p_i + c ...

  3. c++-字符串和时间操作

    C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符 ...

  4. 测试网中用户添加docker yum源

    /etc/yum.repo.d 中新建docker.repo 添加 [docker]name=CentOS-$releasever - Mediabaseurl=ftp://10.191.51.X/d ...

  5. 2018自己的JavaScript开发指南

    这是一个备忘清单,可以让你在不用做太多选择的情况下快速学习.我会列出一些工具来满足大部分场景下的前端开发.当你看完这篇文章,你会有足够的自信来调整你的技术栈. ☉概要 我会将地图划分为你需要解决的问题 ...

  6. 将sparkStreaming结果保存到Redshift数据库

    1.保存到redshift数据库的代码 package test05 import org.apache.log4j.{Level, Logger}import org.apache.spark.rd ...

  7. Winform打包工具SetupFactory 9 的使用 (转)

    写了个WinForm的小程序..以前没打过包..只是直接把Bin里的东西复制出来使用..自己使用是足够.但是发给别人毕竟不太好看(不牛逼)..所以就想着打包.. Vs2012自带的有打包的功能..相信 ...

  8. js倒计时在移动端的应用

    在移动端测试倒计时,将时间转化为毫秒会在苹果手机上出现NaN ``` //在安卓上这样写可以获取到的 var date = '2017-06-12 13:12:13'; var time = new ...

  9. try-with-resources with JDBC

    I realize this was long ago answered but want to suggest an additional approach that avoids the nest ...

  10. 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱

    斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...