首页 > 其他分享 >CF817F MEX Queries

CF817F MEX Queries

时间:2024-01-05 17:01:06浏览次数:32  
标签:Node int auto Queries Cht split CF817F 集合 MEX

题意

一个集合,初始为空。

请你维护以下 \(3\) 种操作。

  • 把 \([l, r]\) 中在集合中没有出现过的数添加到集合中。
  • 把 \([l, r]\) 中在集合中出现过的数从集合中删掉。
  • 把 \([l, r]\) 中在集合中没有出现过的数添加到集合中,并把 \([l, r]\) 中在集合中出现过的数从集合中删掉。

每次操作后输出集合的 \(mex\)。

\(l, r \le 10 ^ {18}\)

Sol

不难发现,我们可以用一棵动态开点权值线段树维护这个东西。

前两个操作直接区间赋值,第三个操作区间翻转即可。

查询直接在权值线段树上二分。

然后你花不到 \(10min\) 码出了代码。

然后 RE on test14。

你急了,不断地在 MLE 和 RE 中徘徊。

索性花了不到 \(1min\) 码了棵珂朵莉,过了。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <set>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
#define fi first
#define se second

namespace Chtholly {

class Node {

public:

	int l, r;
	mutable int v;

	Node (int _l, int _r, int _v) : l(_l), r(_r), v(_v) {}

	bool operator <(const Node &t) const { return l < t.l; }

};

set <Node> Cht;

auto split(int x, int n) {
	if (x > n) return Cht.end();
	auto it = --Cht.upper_bound(Node(x, 0, 0));
	if (it -> l == x) return it;
	int l = it -> l, r = it -> r, v = it -> v;
	Cht.erase(it), Cht.insert(Node(l, x - 1, v));
	return Cht.insert(Node(x, r, v)).fi;
}

void assign1(int l, int r, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	Cht.erase(itl, itr), Cht.insert(Node(l, r, 1));
}

void assign2(int l, int r, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	Cht.erase(itl, itr), Cht.insert(Node(l, r, 0));
}

void revers(int l, int r, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	for (auto it = itl; it != itr; it++)
		it -> v ^= 1;
}

int query() {
	for (auto it = Cht.begin(); it != Cht.end(); it++)
		if (!it -> v) return it -> l;
	return -1;
}

}

using namespace Chtholly;

signed main() {
	Cht.insert(Node((int)1e18 + 1, (int)1e18 + 1, 0));
	Cht.insert(Node(1, 1e18, 0));
	int q = read(), n = (int)1e18 + 1;
	while (q--) {
		int op = read(), l = read(), r = read();
		if (op == 1) assign1(l, r, n);
		if (op == 2) assign2(l, r, n);
		if (op == 3) revers(l, r, n);
		write(query()), puts("");
	}

	return 0;
}

标签:Node,int,auto,Queries,Cht,split,CF817F,集合,MEX
From: https://www.cnblogs.com/cxqghzj/p/17947637

相关文章

  • CF1254D Tree Queries
    TreeQueriesLuoguCF1254D题面翻译给定一棵\(N\)个节点的树,有\(Q\)次操作。\(1\v\d\)给定一个点\(v\)和一个权值\(d\),等概率地选择一个点\(r\),对每一个点\(u\),若\(v\)在\(u\)到\(r\)的路径上,则\(u\)的权值加上\(d\)(权值一开始为\(0\))。\(2\v\)查......
  • Maximum And Queries (hard version)
    题目传送门感觉这题比\(\rmF\)难啊,\(\rmF\)就是个板子,但为啥这题是蓝的,\(\rmF\)是紫的。思路首先考虑\(nq\)怎么做。发现很简单,按位贪心就行了。具体地说,从大到小枚举二进制位,判断答案中能否出现这一位,若\(i\)当前这一位没有值,那么必须被补全到这个值,否则无所谓,然......
  • AtCoder Regular Contest 168 F Up-Down Queries
    洛谷传送门AtCoder传送门貌似是第三道问号题?感觉前面这个转化不是人能想到的。。。考虑维护\(y\)的差分序列。更进一步地,我们类比slopetrick,维护一个可重集,里面有\(y_{i+1}-y_i\)个\(i\)(为了方便我们让每次操作时\(y_{m+1}\)加\(1\))。那么一次操作就相当于,插......
  • 无涯教程-PostgreSQL - SubQueries(子查询)
    子查询或内部查询或嵌套查询是另一个PostgreSQL查询中的查询,并嵌入在WHERE子句中。子查询可与SELECT,INSERT,UPDATE和DELETE语句以及=,<,>,>=,<=,IN等运算符一起使用。SELECT子查询子查询最常与SELECT语句一起使用。基本语法如下-SELECTcolumn_name[,column_name]FROMtable......
  • org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis
    Requestprocessingfailed;nestedexceptionisorg.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter'keyWord'notfound.Availableparametersare[keyword,param1] 错误原因:我在mapper里加......
  • CF1861C-Queries-for-the-Array-题解
    title:CF1861CQueriesfortheArray题解date:2023-09-0607:53:53categories:-题解因为插入和删除操作都在队尾,所以对序列前缀分析一下:若一个序列的答案为YES,那么它前缀的答案也为YES。(对于没检查过的序列)若一个序列的答案为NO,那么它前缀的答案不确定。(对于没......
  • Queries for the Array 题解
    前言这场CF是我赛后打的,vp赛时没做出来,后来发现是有个地方理解错了,有一些细节没有考虑到。现在换了一种思路来写,感觉更清晰了。做法首先需要动态维护三个变量,\(cnt\)和\(finishsort\)和\(unfinishsort\)。这三个变量分别表示当前数字的个数,已经排好序的最后一个位置,和没......
  • CF1902D Robot Queries 题解
    题意:有一个二维平面直角坐标系,给定一串向某个方向移动\(1\)个单位的操作。有\(q\)个询问,对于每个询问给定\(x,y,l,r\),问如果倒着做\(l\)到\(r\)这段区间中的操作,是否会经过\((x,y)\)。ds题。先预处理出\(sx_i,sy_i\)表示执行完操作\(i\)后的位置,如果在\([l,r]\)......
  • D. Cyclic MEX
    D.CyclicMEXForanarray$a$,defineitscostas$\sum_{i=1}^{n}\operatorname{mex}^\dagger([a_1,a_2,\ldots,a_i])$.Youaregivenapermutation$^\ddagger$$p$oftheset$\{0,1,2,\ldots,n-1\}$.Findthemaximumcostacrossallcyclicshiftsof......
  • abc 330E mex
    题意:对单个固定序列多次操作,输出每次操作后的mex函数值。E-MexandUpdate(atcoder.jp)不能用博弈论求sg函数那种直接枚举(TLE),因为最差可能达到O(n2),就算每次基于上一次的mex来剪枝也会被卡到这个复杂度,因为每次都只能线性枚举,所以这个方法不合适。因为mex可能取值的情况最......