题目描述

给出坐标系中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. hdu多校第五场1004 (hdu6627) equation 1 计算几何

    题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...

  2. hdu多校第一场 1006 (hdu6583)Typewriter dp/后缀自动机

    题意: 有个打字机,在当前字符串后新加一个字花费p,把当前字符串的一个连续子串拷贝到当前字符串的末尾花费q,给定一个字符串,求用打字机打出这个字符串的最小花费. 题解: 容易想到用dp 记dp[i]为 ...

  3. 转-vector与list的区别

    转自:C++ vector和list的区别 数据结构的区别 vector vector与数组类似,拥有一段连续的内存空间,并且起始地址不变.便于随机访问,时间复杂度为O(1),但因为内存空间是连续的, ...

  4. jsp-解决自写Servlet老是报错404

    写好servlet进行测试老是报404解决方案. 1.确保web.xml配置好 2.Bulid Path项目,在Libraries界面Add External JARs,在tomcat的lib目录下面 ...

  5. 利用DOM节点找对象和直接在标签属性中调函数传值this的书写区别

    同样的功能,不同的书写格式. 1.个人觉得比较繁琐的写法,但是比较常见,特别是在大项目的时候常用的就是这种方法: <div id="mouse" onmouseover=&q ...

  6. Java 核心编程技术干货,2019 最新整理版!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

  7. 关于合并pdf文件出现的问题

    输出端出现以下问题: PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be 解决方案: import ...

  8. wish - 简单的窗口式(windowing) shell

    总览 wish [filename] [arg] [arg ...] 选项 -colormap new 指定窗口使用一个新的私有的调色板(colormap)而不使用给屏幕的缺省的调色板. -displ ...

  9. JS函数 函数的作用,可以写一次代码,然后反复地重用这个代码。

    什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum); sum=7+8 ; alert(sum ...

  10. Java Lambda map返回部分属性

    通过map,返回部分属性. MyUser,作为源数据 MyUserS,作为返回的新数据. @Test public void Test1() { List<MyUser> ulist=ne ...