题目链接:点击查看

题目大意:二维平面给出 nnn 个矩形,现在要求找到一个点 (x+0.5,y+0.5)(x+0.5,y+0.5)(x+0.5,y+0.5),满足对于任意的 (x+0.5+k1d,y+0.5+k2d)(x+0.5+k_1d,y+0.5+k_2d)(x+0.5+k1​d,y+0.5+k2​d) 都不会出现在任意一个矩形中

题目分析:假设我们找到的目标点为 (x,y)(x,y)(x,y),不难每次移动目标点,对于每个矩形来说,对 ddd 取模后的相对坐标都是不变的,所以我们不妨将每个矩形都对 ddd 取模

矩形取模的话,可以先对坐标取模,再根据取模后的大小分类讨论,一个矩形取模后至多会分成四个矩形

然后就是需要在 [0,d−1]×[0,d−1][0,d-1] \times [0,d-1][0,d−1]×[0,d−1] 的坐标系中找到一个满足条件的点,其不属于任意一个矩形之中

翻译一下就在矩形并的补集中找到一个点即可,关于矩形并问题的求解直接用扫描线来写就好啦

有一个细节就是关于区间与点的问题,扫描线维护的是区间而不是端点,两者之间的转换有好多种方法,可以根据自己的喜好选择,这里给出三种可行方案:

  1. 在线段树中令叶子节点的判断条件为 l+1=rl+1=rl+1=r
  2. 端点统一乘以 222 ,这样题目中的 +0.5+0.5+0.5 就变成了 +1+1+1
  3. 令所有区间左闭右开

这里我选择了第三种方法,然后用扫描线维护区间内所有点被覆盖的最小次数,当且仅当这个最小次数等于 000 时,说明了至少有一个点是没有被覆盖的,直接 nlognnlognnlogn 扫描所有的点,找到答案后退出即可

代码:

// Problem: Hopping Rabbit
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11257/H
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int n,d;
struct Line {int downy,upy,into;
};
vector<Line>node[N];
struct Node {int l,r,mmin,lazy;
}tree[N<<2];
void pushup(int k) {tree[k].mmin=min(tree[k<<1].mmin,tree[k<<1|1].mmin);
}
void pushdown(int k) {if(tree[k].lazy) {int lz=tree[k].lazy;tree[k].lazy=0;tree[k<<1].mmin+=lz;tree[k<<1|1].mmin+=lz;tree[k<<1].lazy+=lz;tree[k<<1|1].lazy+=lz;}
}
void build(int k,int l,int r) {tree[k]={l,r,0,0};if(l==r) {return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
void update(int k,int l,int r,int val) {if(tree[k].l>r||tree[k].r<l) {return;}if(tree[k].l>=l&&tree[k].r<=r) {tree[k].mmin+=val;tree[k].lazy+=val;return;}pushdown(k);update(k<<1,l,r,val);update(k<<1|1,l,r,val);pushup(k);
}
void get_ans(int k,int x) {if(tree[k].l==tree[k].r) {if(tree[k].mmin==0) {puts("YES");cout<<x<<' '<<tree[k].l<<endl;exit(0);}return;}pushdown(k);get_ans(k<<1,x);get_ans(k<<1|1,x);
}
void md(int& x) {x%=d;if(x<0) {x+=d;}
}
void add(int x1,int x2,int y1,int y2) {node[x1].push_back({y1,y2,1});node[x2+1].push_back({y1,y2,-1});
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);read(n),read(d);for(int i=1;i<=n;i++) {int x1,y1,x2,y2;read(x1),read(y1),read(x2),read(y2);x2--,y2--;if(x2-x1+1>=d) x1=0,x2=d-1;if(y2-y1+1>=d) y1=0,y2=d-1;md(x1),md(y1),md(x2),md(y2);if(x1<=x2) {if(y1<=y2) {add(x1,x2,y1,y2);} else {add(x1,x2,y1,d-1),add(x1,x2,0,y2);}} else {if(y1<=y2) {add(0,x2,y1,y2),add(x1,d-1,y1,y2);} else {add(0,x2,y1,d-1),add(0,x2,0,y2),add(x1,d-1,y1,d-1),add(x1,d-1,0,y2);}}}build(1,0,d-1);for(int i=0;i<d;i++) {for(auto it:node[i]) {update(1,it.downy,it.upy,it.into);}if(tree[1].mmin==0) {get_ans(1,i);}}puts("NO");return 0;
}

2021牛客多校6 - Hopping Rabbit(矩形取模+扫描线)相关推荐

  1. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  2. 【2021牛客多校2】F-Girlfriend 计算几何

    2021牛客多校2-F F-Girlfriend 题目大意 给出四个点 A , B , C , D A, B, C, D A,B,C,D 另有两点 P 1 , P 2 P_1, P_2 P1​,P2​ ...

  3. K-Stack 2021牛客多校2

    链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...

  4. 2021牛客多校第八场补题 D-OR

    链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...

  5. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

  6. 2021牛客多校9 - Cells(推公式+NTT)

    题目链接:点击查看 题目大意:初始时给出 nnn 个点,分别为 {(0,a0),(0,a1),⋯,(0,an)}\{(0,a_0),(0,a_1),\cdots,(0,a_n)\}{(0,a0​),( ...

  7. (2021牛客多校一)A.Alice and Bob(博弈)

    样例输入: 5 2 3 3 5 5 7 7 5 7 7 Bob Alice Bob Bob Alice 题意:有两堆石子,石子数目分别为n和m,Alice和Bob轮流进行以下操作: 从一堆石子中取出k ...

  8. 【多校训练】2021牛客多校5

    [前言] 很久没有时间整理题解了,补题和打游戏的时间居多(doge) 这场其实主要F出题人数据有锅,花太多时间了(赛后重测是一血),然后后面G想歪了爆搜剪枝没过,I的回滚莫队队友前一天写了结果今天写不 ...

  9. FFT ---- 2021牛客多校第一场 H Hash Function

    题目链接 题目大意: 解题思路: 首先我们知道任意两个数%seed\%seed%seed都不相同→\rightarrow→(aj−ai)%seed≠0(∀ai≤aj)(a_j-a_i)\%seed\n ...

最新文章

  1. mysql多实例实现以及主从同步
  2. gradle 查看依赖类库版本_使用Gradle命令查看项目中库的依赖关系
  3. 神策数据丨7 大分析云案例,揭开 232 亿美元市场的秘密
  4. 【Python】感觉是全网最详细Pandas合并数据集操作总结
  5. Docker使用中遇到的问题
  6. xampp mysql创建表_xampp怎样创建数据表和删除数据表 来学习吧
  7. JMetro版本11.6.5和8.6.5发布
  8. OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置
  9. mysql的服务器编号_mysql主从服务器配置.doc
  10. 2007年度工作总结
  11. 洛谷P1130 红牌 动态规划
  12. vuecli3 引入全局scss变量_利用scss公共库实现样式和业务组件解耦, 快速提高开发效率!...
  13. mybatis中关联关系,一对多,一对一,多对多,数据库建立方式,怎么体现这种逻辑关系,嵌套查询,嵌套结果查询,包含测试
  14. 【2022年的STM32】 02-STM32总览
  15. Linux 下 ls -l 命令执行显示结果的每一列含义
  16. 套利[题目][j2]
  17. CSS菜鸟教程自学2,Text文本
  18. com.google.android.material.tabs.TabLayout 选择tab 加粗字体加大
  19. vue使用typescript有什么好处,vuetypescript有啥优势
  20. anyconnect免密码登录

热门文章

  1. 零基础入门 Kubernetes,你需要知道这些
  2. 15个C++项目列表
  3. SpringAMQP--消息转换器
  4. TCC两阶段补偿方案
  5. 上传图片-服务端-Api接口定义
  6. Zuul指定path+serviceid
  7. Spring Schedule配置及初始化
  8. triggered_time
  9. Spring 整合 RocketMQ
  10. 长江大学微型计算机课设报告,长江大学B第一学期计算机基础试卷.doc