题目传送门:https://loj.ac/problem/6299


题目分析:一道不难的题目,然而比赛的时候只有90pts。由于所有克劳德斯(clouds)一开始都不相交,所以答案不是1就是2。用O(n2)O(n2)O(n^2)暴力判断两朵云是否能相交,就有80pts了。

接下来可以直接把判断相交的式子化开,用一些数据结构维护一下,就可以做到O(nlog(n))O(nlog⁡(n))O(n\log(n)),然而有一种更好的方法。令横向移动的云不动,纵向移动的云看成向左上方移动,我们发现这和原问题的移动方式等价。也就是说如果向左上方斜着看的话,每一朵云其实就是一个区间[x+y+2,x+W+y+H]。用map离散化一下,然后打标记做两次前缀和即可(第一次前缀和是为了正确得出每个位置的云朵数量,再做前缀和则是为了判断一个区间内有没有非0的数)。

这里还有一个很坑的地方:令所有云大小都是1*1,假设某个时刻一朵横向移动的云在(x,y)处,另一朵纵向移动的云在(x,y+1)处,那么在接下来的不到1s内,它们是能相交的,只不过相交部分面积小于1。1s后它们又分开了,这个时候也要算答案为2。故对于所有用来查询答案的云,一开始要先将斜坐标区间左端点-1,右端点+1。


CODE:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<map>
using namespace std;#define MP(x,y) make_pair(x,y)const int maxn=100100;struct data
{int lx,rx,dy,uy,id;
} ;
data a[maxn];
data b[maxn];
int na,nb;multimap <int,int> mp;int val[maxn<<2];
int sum[maxn<<2];int t,n;bool Judge()
{mp.clear();for (int i=1; i<=na; i++)mp.insert( MP(a[i].lx+a[i].dy,i) ),mp.insert( MP(a[i].rx+a[i].uy,na+i) );for (int i=1; i<=nb; i++)mp.insert( MP(b[i].lx+b[i].dy,2*na+i) ),mp.insert( MP(b[i].rx+b[i].uy,2*na+nb+i) );int num=0,last=-2e9;for (multimap <int,int> :: iterator p=mp.begin(); p!=mp.end(); p++){if (p->first>last) num++;last=p->first;val[p->second]=num;}num+=2;for (int i=0; i<=num; i++) sum[i]=0;for (int i=1; i<=na; i++) sum[ val[i] ]++,sum[ val[na+i]+1 ]--;for (int i=1; i<=num; i++) sum[i]+=sum[i-1];for (int i=1; i<=num; i++) sum[i]+=sum[i-1];for (int i=1; i<=nb; i++)if (sum[ val[2*na+nb+i] ]-sum[ val[2*na+i]-1 ]>0) return true;return false;
}int main()
{freopen("B.in","r",stdin);freopen("B.out","w",stdout);scanf("%d",&t);while (t--){scanf("%d",&n);na=nb=0;for (int i=1; i<=n; i++){data p;int x,y;scanf("%d%d%d%d%d",&p.lx,&p.dy,&x,&y,&p.id);p.rx=p.lx+x;p.uy=p.dy+y;p.lx++;p.dy++;if (p.id) a[++na]=p;else p.dy--,p.uy++,b[++nb]=p;//考虑擦过去的情况,即移动的时候覆盖重叠面积!!! //故询问的b数组,斜坐标可以+1-1}if ( Judge() ) printf("2\n");else printf("1\n");}return 0;
}

LOJ6299:「CodePlus 2018 3 月赛」白金元首与克劳德斯 (离散化+前缀和)相关推荐

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

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

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

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

  3. 【线段树】「CodePlus 2018 3 月赛」白金元首与克劳德斯

    题意: 分析: 题意好鬼扯... 非常傻逼的线段树动态开点题. 横向移动的矩形和纵向移动的矩形,看起来非常麻烦. 由于速度均相等,所以可以以所有纵向移动的矩形为参考系,那么所有纵向移动的矩形都是相对静 ...

  4. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

  5. loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计

    link 题意: A和B玩游戏,每轮A赢的概率为p.现在有T组询问,已知A赢了n轮输了m轮,没有平局,赢一局A得分+1,输一局得分-1,问A得分期望值? $n+m,T\leq 2.5\times 10 ...

  6. 「CodePlus 2017 11 月赛」可做题

    题目描述 qmqmqm 希望给 sublinekelzrip 出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai​​,你需要计算其异或前缀和bi,满足条件b1=a1​​,bi=b ...

  7. 「CodePlus 2017 12 月赛」火锅盛宴

    n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食, ...

  8. [NOIP2019模拟赛]LuoguP4261白金元首与克劳德斯

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

  9. 「JOISC 2018 Day 3」比太郎的聚会

    「JOISC 2018 Day 3」比太郎的聚会 题意: ​ 给你一个\(DAG\),若干组询问,每次给出一个终点和若干个点,问从给出点以外的点出发,到达终点的最长路.(\(|V|\leq 1e5 | ...

最新文章

  1. 算法每日学打卡:java语言基础题目打卡(19-21)
  2. IDEA 设置自动导入包,以及手动导入包
  3. c语言递归算法实验报告,递归算法实验报告.docx
  4. Redis学习总结(18)——Redis 常见的使用场景汇总
  5. Java定时器quartz停止
  6. Command对象应用--增加问卷调查
  7. 面向对象编程时,十条原则:
  8. 计算点到SVM超平面的距离
  9. 初级程序员如何写项目周报和月报
  10. arm交叉编译工具链的选择
  11. docker容器怎么设置开机启动
  12. 压力传感器的制作材料
  13. 在线直播系统搭建的功能包含哪些?
  14. 深入浅出SQLITE3
  15. E3亮点:StudioMDHR的《茶杯头》
  16. Python自动化测试详解
  17. 【PCL】.asc文件转换为.pcd文件
  18. 离散型随机变量及其分布律2
  19. 兼职跑网约车能赚钱吗?
  20. Docker基础镜像操作系统基础镜像对比(参考官方文档),优化docker镜像

热门文章

  1. c语言指针引用数组元素,c语言——数组指针和通过指针引用数组元素的方法总结...
  2. java实现班级分座位,高校图书馆座位预订系统的设计与实现(JSP,MySQL)(含录像)
  3. Re: 爱情物语(经典)
  4. 将数字转换为汉字方法
  5. Css display 详解
  6. 使用JSP技术实现百万富翁猜数字游戏
  7. php发牌判断哪个玩家对子多,PHP判断一个数组是另一个数组子集的方法详解
  8. 南京计算机培训机构推荐十大金股,南京十大考研集训营排名
  9. [原创]K8一句话密码爆破工具{秒破10万} 支持ASP/PHP/ASPX/JSP/CFM/DIY
  10. 谓词逻辑中量词的符号化