首页 > 其他分享 >CF817F - MEX Queries

CF817F - MEX Queries

时间:2023-02-24 17:36:18浏览次数:47  
标签:++ sum Queries len int CF817F tg sg MEX

题意:现在有无穷多个位置(从 \(1\) 开始),一开始都是 \(0\),每次用 \(1/0\) 覆盖一个区间或翻转一个区间的 \(0/1\)。现在给出操作,求每次操作结束后第一个 \(0\) 的位置。

我们发现值域过大,不方便用数据结构维护,则考虑离散化。注意为了给可能存在的区间之间的空隙留下位置,例如 \([1,2]\) 和 \([4,5]\),离散化之后变成 \([1,2][3,4]\),\(3\) 的存在失去了。则将 \(l\pm 1\) 和 \(r\pm 1\) 一起离散化进去,但是注意如果 \(r-1\) 和 \(l-1\) 是 \(0\),不能加入。

然后考虑用线段树维护。我们在线段树上维护 \(sum,len,tg\),分别表示当前区间的 \(1\) 的总和、当前区间的总长度、当前区间面临的操作种类。

操作的过程,就是给区间打标记。

考虑如何打上或下传标记。

假设当前节点的标记种类是 \(tg\),新加入 \(d\),如果 \(tg=0\),直接用 \(d\) 覆盖。如果 \(d=1\) 或 \(2\),也直接用 \(d\) 覆盖。如果 \(d\) 是 \(3\),更改为 \(3-d\)。这样,原来的 \(1\) 和 \(2\) 交换,原来是 \(3\) 则相当于没做。

然后考虑处理标记。若 \(tg=1\),令 \(sum=len\)。若 \(tg=2\),令 \(sum=0\)。若 \(tg=3\),令 \(sum=len-sum\)。

最后考虑如何查询,我们从根节点开始递归,先递归左节点,如果左边满了(\(len=sum\)),就去右边,直到找到答案。因为我们离散化的时候离散化了 \(r_{max}+1\),所以一定会找到答案的。

还有一个问题,就是我们查询之后要上传答案。如果我们在左子树找到答案就返回,是不能正确得到答案的。正确的做法是即使左子树有答案了,也在右儿子 \(push\) 一下 \(tg\),从而正确的合并答案。

int n,t[100005];
ll l[100005],r[100005],v[600005],m;
struct node{
	int l,r,sum,tg,len;
}sg[2400005];
inline void init(int i,int l,int r){
	sg[i].l=l,sg[i].r=r,sg[i].tg=0,sg[i].sum=0,sg[i].len=(sg[i].r-sg[i].l+1);
	if(l==r)return;
	init(i<<1,l,l+r>>1);
	init(i<<1|1,(l+r>>1)+1,r);
}
inline void addtg(int i,int d){
	if(!sg[i].tg||d<=2)sg[i].tg=d;
	else sg[i].tg=3-sg[i].tg;
}
inline void psh(int i){
	if(!sg[i].tg)return;
	if(sg[i].tg==1)sg[i].sum=sg[i].len;
	else if(sg[i].tg==2)sg[i].sum=0;
	else sg[i].sum=sg[i].len-sg[i].sum;
	if(sg[i].l!=sg[i].r){
		addtg(i<<1,sg[i].tg);
		addtg(i<<1|1,sg[i].tg);
	}sg[i].tg=0;
}
inline void add(int i,int d,int l,int r){
	psh(i);
	if(sg[i].l>r||sg[i].r<l)return;
	if(sg[i].l>=l&&sg[i].r<=r){
		addtg(i,d);
		psh(i);
		return;
	}
	add(i<<1,d,l,r);
	add(i<<1|1,d,l,r);
	sg[i].sum=sg[i<<1].sum+sg[i<<1|1].sum;
}
inline int qry(int i,bool p){
	psh(i);
	if(sg[i].sum==sg[i].len||p)return -1;
	if(sg[i].l==sg[i].r)return sg[i].l;
	int res=qry(i<<1,0);
	if(res==-1)res=qry(i<<1|1,0);
	else qry(i<<1|1,1);
	sg[i].sum=sg[i<<1].sum+sg[i<<1|1].sum;
	return res;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	v[++m]=1;
	rp(i,n){
		cin>>t[i]>>l[i]>>r[i];
		if(l[i]!=1)v[++m]=l[i]-1;
		v[++m]=l[i],v[++m]=l[i]+1;
		v[++m]=r[i],v[++m]=r[i]+1;
		if(r[i]!=1)v[++m]=r[i]-1;
	}
	sort(v+1,v+1+m);
	m=unique(v+1,v+1+m)-v-1;
	init(1,1,m);
	rp(i,n){
		l[i]=lower_bound(v+1,v+1+m,l[i])-v;
		r[i]=lower_bound(v+1,v+1+m,r[i])-v;
	}
	rp(i,n){
		add(1,t[i],l[i],r[i]);
		cout<<v[qry(1,0)]<<'\n';
	}
	return 0;
}
//Crayan_r

标签:++,sum,Queries,len,int,CF817F,tg,sg,MEX
From: https://www.cnblogs.com/jucason-xu/p/17152281.html

相关文章

  • CF245H Queries for Number of Palindromes
    对字符串s,多次询问,给你两个数L和R,问在字符串区间l到r的字串中,包含多少回文串。 #include<iostream>#include<queue>#include<cstring>#defineIOSstd::ios::syn......
  • Leetcode 2569 Handling Sum Queries After Update
    2569. HandlingSumQueriesAfterUpdatYouaregiventwo 0-indexed arrays nums1 and nums2 anda2Darray queries ofqueries.Therearethr......
  • CF825G - Tree Queries
    现在有\(n\)次操作,每次将一个点设为黑色,或者查询:从当前点到任意黑点路径上最小值的最小值。保证第一次操作是设置黑点。强制在线。我们考虑这样一个过程,我们把第一次操......
  • java.security.NoSuchAlgorithmException: Error constructing implementation (algor
    服务器迁移,在新服务器上发现邮件发送或者使用httpClient会报出下面的异常,问题可谓是惊人的相似。javaMail发送邮件异常:  使用httpClient异常: 先开始排查问题。......
  • Substring XOR Queries
    SubstringXORQueriesYouaregivenabinarystring  s ,anda2D integerarray queries where queries[i]=[firsti,secondi] .Forthe ith query,fi......
  • Codeforces Round #851 (Div. 2)-F. XOR, Tree, and Queries-树、异或、并查集
    题目:https://codeforces.com/contest/1788/problem/F题解:(首先他和线性基没什么瓜系)想这个问题大概可以分成几个部分:1、很自然地考虑记\(p_x\)表示从根节点走到x路径......
  • 【题解】CF1093G Multidimensional Queries
    记一下这种有趣的trick.思路线段树。绝对值按照惯例是可以拆的,并且可以拆出一正一负两个数。考虑到维数很小,可以考虑状压表示拆除绝对值之后每一维值的正负。并且因......
  • coderforces E - AND-MEX Walk
    很好的题[观察样例发现只有0,1,2大胆猜测是不是也只会有0,1,2如果不是的话说明某条路径上出现过0,1,2,且是以2,1,0的情况出现的但是2的末尾是0,和1&不可能得到1,所以假设不成立]......
  • Codeforces Round #838 (Div. 2)-D. GCD Queries-GCD、交互
    题目:https://codeforces.com/problemset/problem/1762/D有一个0~n-1的排列,你要在至多2n次询问中找到两个位置x,y,使得\(p_x,p_y\)至少有一者为0.每次询问可以问两个不同的i......
  • 「解题报告」ARC142C Tree Queries
    \(2n\)次询问,那就考虑直接问出来\(d_{1,i},d_{2,i}\)。首先显然有:\(|d_{1,i}-d_{2,i}|\led_{1,2}\led_{1,i}+d_{2,i}\)那么我们可以求出\(d_{1,i}+d_......