首页 > 其他分享 >CF1883D In Love

CF1883D In Love

时间:2023-10-27 10:56:28浏览次数:59  
标签:Love CF1883D int 相交 端点 ans 区间 互不

思路

如果每一次加或者删一个区间,再去暴力找有没有互不相交的区间的话,铁定 TLE。

那么,我们考虑维护有多少对互不相交的区间,那么每次加或者删一个区间,就去算这个区间对答案的贡献,然后再看答案是否为 \(0\) 即可快速判断有没有互不相交的区间。

现在考虑如何计算一个新加入或者删去的区间能让互不相交的区间对数变化多少呢?

加入新加入或者删去的区间是 \([l,r]\),那么加入和删去带来的答案变化都应该相同,只是一个是加,一个是减,所以我们没必要分开讨论。

如果两个区间不相交,必须满足其中一个区间的左端点大于另一个区间的右端点,那么对于区间 \([l,r]\),要满足条件,就必须要左端点大于 \(r\),右端点小于 \(l\)。

但是,如果还是全部扫一遍,挨个判断能否对答案造成贡献的话,复杂度高达 \(O(q^2)\),依然会 TLE,所以考虑用个数据结构维护区间加,而每次加或者减一个区间就是单点修改,树状数组和线段树都可以完成,我选择了线段树。

无论是树状数组,还是线段树,就和值域有关系了,观察到值域达到了 \(10^9\),直接做肯定不行,所以还需要离散化。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,a[200005],num,ans;
struct opti{int l,r;char ch[2];}b[200005];
struct node{int l,r,s[2];}t[800005];
inline void pushup(int p){for(int i=0;i<2;++i) t[p].s[i]=t[p<<1].s[i]+t[p<<1|1].s[i];}
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r) return;
	int mid=l+r>>1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
void update(int p,int x,int op,int k)
{
	if(t[p].l==t[p].r){t[p].s[op]+=k;return;}
	int mid=t[p].l+t[p].r>>1;
	if(mid>=x) update(p<<1,x,op,k);
	else update(p<<1|1,x,op,k);
	pushup(p);
}
int ask(int p,int l,int r,int k)
{
	if(r<l) return 0;//因为出现了+1和-1,所以可能区间不存在,需要特判
	if(t[p].l>=l&&t[p].r<=r) return t[p].s[k];
	int mid=t[p].l+t[p].r>>1,ans=0;
	if(mid>=l) ans=ask(p<<1,l,r,k);
	if(mid<r) ans+=ask(p<<1|1,l,r,k);
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%s%d%d",b[i].ch,&b[i].l,&b[i].r),a[i*2-1]=b[i].l,a[i*2]=b[i].r;
	sort(a+1,a+2*n+1),num=unique(a+1,a+2*n+1)-a-1;
	build(1,1,num);
	for(int i=1;i<=n;++i)
	{	
		b[i].l=lower_bound(a+1,a+num+1,b[i].l)-a,b[i].r=lower_bound(a+1,a+num+1,b[i].r)-a;
		if(b[i].ch[0]=='+')
		{
			ans+=ask(1,b[i].r+1,num,0)+ask(1,1,b[i].l-1,1),update(1,b[i].l,0,1),update(1,b[i].r,1,1);
			if(ans) printf("YES\n");
			else printf("NO\n");
		}
		else
		{
			ans-=ask(1,b[i].r+1,num,0)+ask(1,1,b[i].l-1,1),update(1,b[i].l,0,-1),update(1,b[i].r,1,-1);
			if(ans) printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
}

标签:Love,CF1883D,int,相交,端点,ans,区间,互不
From: https://www.cnblogs.com/One-JuRuo/p/17791257.html

相关文章

  • CF1523D Love-Hate 题解
    抽象化题意:一共有\(m\)个元素,给定\(n\)个集合,每个集合的元素不超过\(15\)个,求出一个元素个数最多的集合\(S\)是至少\(\lceil\dfrac{n}{2}\rceil\)个集合的子集。其中$p$$(1\len\le2\cdot10^5,1\lep\lem\le60)$我们先假设\(limit=\lceil\dfrac......
  • [CISCN 2019 初赛]Love Math
    原理解题过程首先进入靶场,有代码让我们审计<?phperror_reporting(0);//听说你很喜欢数学,不知道你是否爱它胜过爱flagif(!isset($_GET['c'])){show_source(__FILE__);//如果没有传递c,则高亮显示代码}else{//例子c=20-1$content=$_GET['c'];i......
  • CF553C Love Triangles
    很有意思的一个题,想了一会才发现解题的关键首先我们注意到对于某个大小\(\ge3\)的连通块,其实连通块内的所有边的颜色都会被已知的边唯一确定而不同的连通块间的连边方式有两种,因此设连通块个数为\(tot\),最后的答案就是\(2^{tot-1}\)但还要考虑判掉不合法的情况,注意到不管是\(1......
  • P9290 Luna likes Love 题解
    原题:[洛谷P9310]([P9310EGOI2021]LunalikesLove/卢娜爱磕cp-洛谷|计算机科学教育新生态(luogu.com.cn))题目大意给定一个长度为\(\large2n(n\leq10^5)\)的序列,序列中\(\large1\simn\)的每一个数都恰好出现两次。可进行两种操作:交换两个相邻的数的位置。......
  • [极客大挑战 2019]LoveSQL 1
    原理常规注入解题过程进入登录界面,还是使用万能登录试一试payload:1'or1=1#没想到成功了,说明字符型注入使用的'爆出的密码应该是MD5加密,爆破很麻烦,试试常规注入payload:1'orderby4#payload:1'orderby3#找出列项payload:1'unionselect1,database(),3#找出......
  • P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II 题解
    Description给你一个长为\(n\)的排列,\(m\)次询问,每次查询一个区间的逆序对数,强制在线。link\(1\leqn,m\leq10^5\)。Solution考虑分块。首先如果\(l,r\)在同一个块内,可以对于每个块暴力二维前缀和预处理。如果\(l,r\)在不同的块内。设\(bel[l]=x,bel[r]=y\)。首......
  • F. Vasilije Loves Number Theory
    F.VasilijeLovesNumberTheory前提知识:d(n)表示数字n的正约数个数,gcd(a,b)表示a,b两者的最大公约数要点:问是否存在a,使得d(a*n)=n,gcd(n,a)=1,意思是n与a互质,则可得,d(a*n)=d(a)*d(n)=n则问题转化成n%d(n)==0?尽管d(n)<=1e9,但n可能很大,所以可以利用质因子来求点击查看......
  • 346_黑苹果Clover修改神器其一——设置自动倒计时
    这是一篇原发布于2020-02-0314:38:00得益小站的文章,备份在此处。前言这几日轶哥折腾黑苹果,安装过程倒是挺顺利,只不过这次的四叶草引导并没有自动倒计时功能。简单百度下,发现修改的方法挺简单,一起和轶哥来学习下吧![scodetype="yellow"]操作前请自行准备恢复U盘(推荐微PE),备份efi......
  • KingbaseES V8R3集群运维案例之---主库数据库服务down后failover切换详解
    案例说明:对KingbaseESV8R3集群,主库数据库服务down后,failover切换进行分析,详解其执行切换的过程,本案例可用于对KingbaseESV8R3集群failover故障的分析参考。适用版本:KingbaseESV8R3集群架构:node_id|hostname|port|status|lb_weight|role|select_cnt......
  • KingbaseES V8R3集群运维案例---failover切换故障分析
    案例说明:KingbaseESV8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因。适用版本:KingbaseESV8R3一、集群架构node13----->主库(primary)node25----->管理备库(standby)node58----->备库(standby)二、故障现象1主2备集群,172.31.*......