首页 > 其他分享 >CF1261F Xor-Set

CF1261F Xor-Set

时间:2024-07-14 22:41:59浏览次数:21  
标签:pii Set Xor int eb rd bl CF1261F define

一个不太复杂的做法。

首先我们可以考虑将每一段区间拆成 \(\log V\) 级别的形如 \([p,p+2^q)\) 个段,其实就是可以理解为一段前缀加上一段自由段,然后我们考虑将 \(A,B\) 进行合并合并完之后的每一段也是长成刚刚那样,但是这样子合并我们得到的段有 \(\mathcal{O}(n^2\log^2V)\) 个级别的段,无法通过。

合并时我们产生了很多的空间浪费。观察到在合并 \([p_A,p_A+2^{q_A})\) 和 \([p_B,p_B+2^{q_B})\) 两段时,只有满足 \(p_A=p_B\),或 \(\min(p_A,p_B)=0\) 时,这个合并才是有意义的,为什么呢?

观察拆段时的过程,每当我们在加入一个区间后,我们会改变一下当前的位并往后继续加入新的区间,这提醒我们,在 \(q_A,q_B\) 都大于零的时候,\(\left|q_A-q_B\right|\ge1\) 时我们的合并是无意义的。因为我们显然可以让自由段更短的段继续缩减自由段并与自由段较长的合并,所以这样子我们得到的答案段数量级只有 \(\mathcal{O}(n^2\log V)\) 级别了。

但是我们最后还需要去重,观察到这些段显然要么包含要么不交,所以直接排序然后去重即可,常数不是很大就可以通过。

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
#define rrp(i, l, r) for (int i = r; i >= l; -- i)
#define eb emplace_back
#define inf 1000000000
#define linf 100000000000000
#define pii pair <int, short>
using namespace std;
constexpr int N = 2e5 + 5, P = 998244353;
inline int rd ()
{
	int x = 0, f = 1;
	char ch = getchar ();
	while (! isdigit (ch)) { if (ch == '-') f = -1; ch = getchar (); }
	while (isdigit (ch)) { x = (x << 1) + (x << 3) + ch - 48; ch = getchar (); }
	return x * f;
}
int n, m;
vector <pii> v1, v2, v3;
signed main ()
{
//	freopen ("1.in", "r", stdin);
//	freopen ("1.out", "w", stdout);
	n = rd ();
	rep (t, 1, n)
	{
		int l = rd (), r = rd ();
		if (l == r)
		{
			v1.eb (pii (l, 0));
			continue;
		}
		int x = 0, d;
		rrp (j, 0, 60)
		{
			int bl = l >> j & 1, br = r >> j & 1;
			if (bl == br) d = j;
			else break;
			x |= bl; x <<= 1;
		}
		int y = x;
		y |= 1; y <<= 1;
		rrp (j, 0, d - 2)
		{
			int b = r >> j & 1;
			if (b) v1.eb (pii (y, j));
			y |= b; y <<= 1;
		}
		v1.eb (pii (y >> 1, 0));
		y = x; y <<= 1;
		rrp (j, 0, d - 2)
		{
			int a = l >> j & 1;
			if (! a) v1.eb (pii (y | 1, j));
			y |= a; y <<= 1;
		}
		v1.eb (pii (y >> 1, 0));
	}
	m = rd ();
	rep (t, 1, m)
	{
		int l = rd (), r = rd ();
		if (l == r)
		{
			v2.eb (pii (l, 0));
			continue;
		}
		int x = 0, d;
		rrp (j, 0, 60)
		{
			int bl = l >> j & 1, br = r >> j & 1;
			if (bl == br) d = j;
			else break;
			x |= bl; x <<= 1;
		}
		int y = x;
		y |= 1; y <<= 1;
		rrp (j, 0, d - 2)
		{
			int b = r >> j & 1;
			if (b) v2.eb (pii (y, j));
			y |= b; y <<= 1;
		}
		v2.eb (pii (y >> 1, 0));
		y = x; y <<= 1;
		rrp (j, 0, d - 2)
		{
			int a = l >> j & 1;
			if (! a) v2.eb (pii (y | 1, j));
			y |= a; y <<= 1;
		}
		v2.eb (pii (y >> 1, 0));
	}
	for (auto u : v1)
	{
		for (auto v : v2)
		{
			int x = u.first, y = u.second, xx = v.first, yy = v.second;
			if (y > yy) swap (y, yy), swap (x, xx); 
			if (! y || yy == y)
			{
				int g = ((x << y) ^ (xx << yy)) >> yy << yy;
				v3.eb (pii (g, - yy));
			}
		}
	}
	sort (v3.begin (), v3.end ());
	int ans = 0, cnt = 0;
	int w = -1;
	for (int i = 0; i < v3.size (); ++ i)
	{
		int p = v3[i].first, q = - v3[i].second;
		
		if (w >= p) continue;
		w = p + (1ll << q) - 1; ++ cnt;
		int x = 1ll << q;
		(ans += x % P * (p % P) % P + ((x >> 1) % P) * ((x - 1) % P) % P) %= P;
	}
	printf ("%lld\n", ans); 	
}

/*

*/

标签:pii,Set,Xor,int,eb,rd,bl,CF1261F,define
From: https://www.cnblogs.com/lalaouyehome/p/18302147

相关文章

  • WPF Canvas ZoomIn ZoomOut via set Background="Transparent"
    <CanvasGrid.Column="1"Background="Transparent"x:Name="cvs"ClipToBounds="True"MouseWheel="cvs_MouseWheel"MouseDown="cvs_MouseDown"MouseUp="cvs_MouseUp"MouseMove="cvs_......
  • Python数据容器(dict字典、set集合)
    dic字典dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。字典的创建使用大括号{}包含键值对,并用冒号:分隔键和值,形成键:值对。字典的特性唯一键:字典中的每个键都必须是唯一的。值可以取任何数据类型,如字符串,数字,元组。无序(Python......
  • Java中的Set系列集合超详解
     Set List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2,使得e1.equals(e2),并且最多一个空元素。  使用Set存储的特点与List相反:元素无序、不可重复。常用的实现方式:HashSet、LinkedHashSet和TreeSet。......
  • 13-TreeSet和TreeMap基本介绍
    13-TreeSet和TreeMap基本介绍介绍汇总:TreeSet基本介绍TreeMap基本介绍1-TreeSet基本介绍TreeSet类用于存储一组对象,并将对象按照自然规则(实现Comparator接口的)或者指定Comparator对象的比较器进行排序。TreeSet类中的底层是TreeMap。key值不可以为null,也不......
  • 7-LinkedHashSet底层结构和源码分析
    7-LinkedHashSet底层结构和源码分析介绍汇总:LinkedHashSet全面说明LinkedHashSet底层机制说明1-LinkedHashSet全面说明LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表。由于LinkedHashMap是继承HashMap的所有特性的,其双向链表是在原本的数......
  • Maven的setting.xml镜像和私服配置.md
    <repository>和<mirror>在Maven中,和配置项分别出现在不同的配置文件中,并且它们有各自的作用和执行顺序。以下是这些配置项的详细说明和它们之间的关系:<repository>inpom.xml位置:位于项目的pom.xml文件中。作用:定义了特定项目构建时使用的远程仓库,通常用于解决项目依赖的......
  • 5-Set接口和常用方法
    5-Set接口和常用方法介绍汇总:Set接口基本介绍Set接口的常用方法Set接口的遍历方式实践练习1-Set接口基本介绍无序(添加和取出的顺序不一致),没有索引不允许重复元素,所以最多包含一个null2-Set接口的常用方法和List接口一样,Set接口也是Collection的子接口。因此,......
  • 【CF1656H】Equal LCM Subsets
    【CF1656H】EqualLCMSubsets题意给定集合\(A\)和\(B\),从中选择两个子集\(A'\subseteqA,B'\subseteqB\)满足\(\operatorname{lcm}(A')=\operatorname{lcm}(B')\)。满足\(\lvertA\rvert,\lvertB\rvert\le10^3,A,B\le4\times10^{35}\)。......
  • 流媒体资源 (Streaming Assets)
    Unity中的大多数资源在构建时都会合并到项目中。但是,将文件放入目标计算机上的普通文件系统以使其可通过路径名访问有时会很有用。这方面的一个例子是在iOS设备上部署电影文件;原始电影文件必须位于文件系统中的某个位置以便由 PlayMovie 函数进行播放。放置在Unity项目中......
  • D1. XOR Break — Solo Version
    原题链接题解,构造太难想了当\(x\)在二进制表示下,只有一个1时,肯定不行如果有两个1呢?在这种情况下,如果\(m\)最大的一位,位于\(x\)最大的一和第二大的一之间,一定失败为什么?分类讨论即可反之是否成立?设\(x\)最大的一位\(a\),第二大的位\(b\)\(m\)最大的一位\(c\)......