首页 > 其他分享 >F. Equal XOR Segments

F. Equal XOR Segments

时间:2024-07-20 13:39:56浏览次数:4  
标签:x1 XOR int Segments Equal include it2 id it1

链接

https://codeforces.com/problemset/problem/1968/F

题目

思路

感觉这是一道非常好的区间异或结论题!

思路参考大佬题解

值得总结的:

1.区间异或的可加性:^[la,ra] == ^[ra+1,rb]--> ^[1,ra] == ^[1,rb]

2.aaa = a,用来消除过长的异或.

虽然刚开始想用线段树,但是没法实现判断

如何实现选取的见代码,以及复习下lower_bound()的用法

代码

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#define IOS ios::sync_with_stdio(false), cin.tie(0) ,cout.tie(0)
using namespace std;
#define int long long
const int N = 2e5 + 10;
int a[N];

signed main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

	int t; cin >> t;
	while (t--)
	{
		int n, q; cin >> n >> q;
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i];
			a[i] = a[i] xor a[i - 1];
		}
		map<int, vector<int>>id;
		for (int i = 0; i <= n; i++)
		{
			id[a[i]].push_back(i);
		}
		for (int i = 0; i < q; i++)
		{
			bool la = false;
			int l; int r;
			cin >> l >> r;
			if (a[l - 1] == a[r])la = true;
			while (!la)
			{
				vector<int>::iterator it1, it2;
				it1 = lower_bound(id[a[r]].begin(), id[a[r]].end(), l);//先选取id[a[r]]中第一个大于等于l的作为x1
				int x1;
				if (*it1!=r)x1 = *(it1);
				else break;
				it2 = lower_bound(id[a[l - 1]].begin(), id[a[l - 1]].end(), x1);//再选取id[a[l-1]]中第一个大于等于x1的作为x2
				int x2;
				if (it2 != id[a[l - 1]].end() and *it2<r)x2 = *it2;//判断在r区间内
				else break;
				la = true;
			}
			if (la)cout << "YES";
			else cout << "NO";
			cout << '\n';
		}
		cout << '\n';
	}

	return 0;
}

标签:x1,XOR,int,Segments,Equal,include,it2,id,it1
From: https://www.cnblogs.com/zzzsacmblog/p/18313015

相关文章

  • [ARC173E] Rearrange and Adjacent XOR 题解
    题目链接点击打开链接题目解法太牛了!!!这道题我的第一反应是从高位往低位确定,但这样就全错了换个角度考虑,找最后的答案可以由那些数异或而成这里给出结论:答案一定是偶数个数的异或和(在\(n\%4=2\)且\(n\neq2\)时,不能由全集构成)证明:选出的数非全集的情况用数学归纳法......
  • Java基础:= =和equals有什么区别?
    “==”是操作符,在比较时,根据所比较的类的类型不同,功能也有所不同:对于基础数据类型,如int类型等,比较的是具体的值;而对于引用数据类型,比较的是引用的地址是否相同。equals是超类Object中的方法,默认是用==来比较的。也就是说,对于没有重写equals方法的子类,equals和==......
  • [GWCTF 2019]xxor
    64位,进ida第一个for循环,输入六个32位字符串,转换成整数,存到v6数组第二个for循环,函数是把低位和高位分成了两个dword,就是在一个循环中一下处理了两个数据(两个32位数据在64位数组中)然后看看这个unk_601060,32位对齐,所以里面的数据就是(2,2,3,4)接下来就是sub_400686这个加密函数可......
  • [CF1616H] Keep XOR low
    Lastdance。最后一篇文章,就写我两年前就看过但不敢尝试的题目吧。首先,两数异或\(\lex\)的条件看起来是好维护的,显然可以Trie树上跑一跑,但我们发现当\(x\)某一位是\(1\)的时候非常难受,情况变得非常复杂。此时我进行了一些尝试,尝试直接刻画合法的\(S\)的结构,未果。把......
  • 深入剖析hashCode和equals的区别及大厂面试题
    关于作者:毕业半年被裁,一个月斩获大厂offer,面试经验50+。“跟着周哥走,offer手里有”。文末免费领取周哥50+场面试总结出的必背面试题。首先我们要知道,equals()和hashCode()都属于Object类,而Object类是所有类(包括Class)的父类。搞清楚这一点,再分别解析equals和hashCode,......
  • 解决equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序规则冲
    背景:在语句执行过程中碰到equalto运算中"Chinese_PRC_CI_AS"和"Chinese_PRC_CS_AS"之间的排序规则冲突的报错时,可以用COLLATE定义和控制字符数据排序规则。在SQLServer中,COLLATE是用于定义和控制字符数据排序规则(collation)的关键字。排序规则影响字符串比较和排序的行......
  • Equal Cut (AtCoder - arc100_b)(前缀和,思维)
    题目来源:https://atcoder.jp/contests/abc102/tasks/arc100_b?lang=en//题意:将一串数字分为四段,求出每段的总和,怎么分,才能让这四段的各自总和的极差最小?//思路:“实在是想不出来好的算法,只会暴力,当时想的枚举中间的那一刀,然后左右二分,但是感觉也不太好写,毕竟我总是被二分的边界......
  • CF1261F Xor-Set
    一个不太复杂的做法。首先我们可以考虑将每一段区间拆成\(\logV\)级别的形如\([p,p+2^q)\)个段,其实就是可以理解为一段前缀加上一段自由段,然后我们考虑将\(A,B\)进行合并合并完之后的每一段也是长成刚刚那样,但是这样子合并我们得到的段有\(\mathcal{O}(n^2\log^2V)\)个......
  • E. Tracking Segments
    链接https://codeforces.com/problemset/problem/1843/E题面思路二分加树状数组。关键点在于看出来单点修改和区间查询,然后离线+二分:令l=1(1次操作),r=q(最多q次操作)。二分判断能不能行。以及树状数组的板子要记得。代码#define_CRT_SECURE_NO_WARNINGS#include<iostream>......
  • 【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}\)。......