CF1956F Nene and the Passing Game 解题报告

假设 \(j>i\) ,则:\(i+l_i\le j-l_j,i+r_i\le j-r_j\)

所以相当于看区间 \([i+l_i,i+r_i]\) 和区间 \([j-r_j,j-l_j]\) 是否有交集

可以将这些区间放在数轴上,考虑建虚点,将数轴上的每个点向包含它的区间连边

但是这样会有一个问题,记加为右区间,减为左区间,此时就无法判断是哪种区间在相交

所以可以只保留既有左区间又有右区间覆盖的点,这样就能保证一定是符合条件的

但是依次对每个点连边显然会T,考虑优化

先用 \(pre\)\(ne\) 记录前/后满足条件的最近的点

对于区间 \([l,r]\),操作就应在 \([ne_l,pre_r]\)

利用差分的思想,统计数轴上每个点被覆盖且不为末端点的次数

因为作为末端点,后面没有与之相邻的点,就无法向后合并

如果次数不为0,就向后连边,最后看有多少连通块即可

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int T,n,l[2000006],r[2000005],pre[2000005],ne[2000006];
int cntl[2000006],cntr[2000006],f[4000006],tot;
int v[2000005];
int find(int x)
{if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);tot=0;for(int i=0;i<=n;i++){cntl[i]=cntr[i]=0;pre[i]=ne[i]=v[i]=0;}for(int i=1;i<=n;i++){scanf("%d%d",&l[i],&r[i]);cntl[max(1,i-r[i])]++;cntl[max(1,i-l[i]+1)]--;cntr[min(n,i+l[i])]++;cntr[min(n,i+r[i]+1)]--;f[i]=i;}for(int i=1;i<=n;i++){cntl[i]+=cntl[i-1];cntr[i]+=cntr[i-1];if(cntl[i]&&cntr[i]){pre[i]=ne[i]=++tot;f[n+tot]=tot+n;}else{pre[i]=pre[i-1];}}ne[n+1]=1e9;for(int i=n;i>0;i--){if(!ne[i]) ne[i]=ne[i+1];}for(int i=1;i<=n;i++){int ql=ne[max(1,i-r[i])];int qr=pre[max(0,i-l[i])];if(ql<=qr){v[ql]++,v[qr]--;f[find(i)]=find(qr+n);}ql=ne[min(n+1,i+l[i])];qr=pre[min(n,i+r[i])];if(ql<=qr){v[ql]++,v[qr]--;f[find(i)]=find(qr+n);}
//			printf("%d",i);}for(int i=1;i<=tot;i++){v[i]+=v[i-1];}for(int i=1;i<=tot;i++){if(v[i]){f[find(i+n)]=find(n+i+1);}}int ans=0;for(int i=1;i<=n+tot;i++){if(f[i]==i) ans++;}printf("%d\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869476.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevExpress gridControl 绑定数据源之后添加非绑定列

using (DevExpress.Utils.WaitDialogForm dlg = new DevExpress.Utils.WaitDialogForm("请稍等", "查询中......", new System.Drawing.Size(100, 50))){string sqlString = "SELECT ITEM ,DESCRIPTION ,CATEGORY3 FROM WIPDBA.TIME_IMA x WHERE x.…

Gitlab搭建npm仓库

由于图片和格式解析问题,为了更好阅读体验可前往 阅读原文:::warning 使用gitlab的仓库注册表特性需要版本14.0+,如果你的版本比较低,请先根据自己的需求合理升级后再使用 ::: npm私有仓库的搭建方式有很多种,比如使用docker(阅读此篇),这里讲述如何使用gitlab作为npm仓库…

k8s~控制deamonset中pod的数量

DaemonSet 是 Kubernetes 中的一种控制器,用于确保集群中的每个节点(或特定标签选择器匹配的节点)运行一个 Pod 的副本。DaemonSet 通常用于运行集群守护进程,如日志收集、监控代理、存储卷插件等。以下是如何控制 DaemonSet 中 Pod 数量的方法:使用节点选择器(Node Sele…

读量子霸权04量子计算机的黎明

量子计算机的黎明1. 晶体管的诞生 1.1. 1956年,三位物理学家因发明了这种神奇的装置而获得诺贝尔奖:贝尔实验室的科学家约翰巴丁、沃尔特布拉顿和威廉肖克利1.1.1. 巴丁、布拉顿和肖克利使用了一种新的量子形式的物质,即半导体1.1.2. 金属是允许电子自由流动的导体1.1.3. 玻…

Arch Linux默认中文输入法设置输入关键字直接给出日期和时间

自定义词组就行,关键字如下#$year年$month月$day日 星期$weekday $fullhour:$minute:$second如下图, 设置里-输入法,进入输入法菜单界面,选择你的输入法设置进入到你的中文输入法设置界面后,拉到中间的位置,有一个【管理自定义词组】,点进去 添加一个词组,把上面的词组…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库编写驱动控制两个屏幕

前言 从.NET IoT入门开始这篇文章想必大家应该都看过了,也有很多人都该着手购买树莓派Zero 2W进行上手体验了,那么我们这篇文章就开始真正的实践了,玩硬件肯定是要亲自操作得出成果才会开心,由于牵扯到硬件,所以有的时候软件没问题,但是硬件接线错误或者接触不良都会结果…

openGauss训练营第二期结营!一百个QA和PPT合辑大放送

2021年9月11-12日,由openGauss内核项目研发经理、openGauss社区Maintainer、openGauss布道师朱金伟老师领衔,联合openGauss社区、Gauss松鼠会、云和恩墨的专家们组织的第二期“8小时玩转openGauss训练营”活动通过线上直播的方式举办,获得圆满成功。本次参与学员超千人,最终…

我们一起聊聊数据库的可观测性

我们一起聊聊数据库的可观测性作者:白鳝2022-08-16 07:49:48 数据库其他数据库 云原生应用来是更为复杂和无序的,而对于数据库来说,相对来说要简单一些。因为数据库系统是按照某种客观规律组织起来的,其内在规律可以被数字化。因此也有一些运维专家认为数据库不需要搞什么可…

Ansible模块使用指南

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.ansible模块概述1.ansible模块数量井喷式增长2.模块分类二.Ansible常用模块1.command模块1.1 command模块概述1.2 command模块示例2.shell模块2.1 shell模块概述2.2 shell模块示例3.script模块3.1 scr…

【Linux搭建教程】Linux 安装多个jdk版本并进行快速切换、以jdk8和jdk17为例【测试成功】

一、问题背景 由于项目需要,环境分别使用到jdk 8版本和jdk 17版本,故需要共存并配置快速切换。 二、具体实现 1、正常配置俩个jdk环境变量; 2、修改环境变量alias配置快速切换 vim /etc/profile #编辑以下内容信息alias java17=export JAVA_HOME=/usr/java/jdk-17.0…

【Redis源码】轻松看懂 rdb 文件

一、数据存储格式二、查看rdb文件 查看文件16进制编码 #od -A x -t x1c -v dump.rdbRDB文件格式如下: 0000000 52 45 44 49 53 30 30 30 38 fa 09 72 65 64 69 73R E D I S 0 0 0 8 372 \t r e d i s 0000010 2d 76 65 72…