CF1567B 题解

题目传送门

思路

最小值为 aa,说明从 00a1a-1 一定必须选。

所以答案最小为 aa

pip_i 为从 00ii 所有的数的异或(即 0xor1xor2xor...xori0 \operatorname{xor} 1 \operatorname{xor} 2 \operatorname{xor} ... \operatorname{xor} i)。

pa1=bp_{a-1}=b,则直接输出 aa0xor1xor2xor...xora10 \operatorname{xor} 1 \operatorname{xor} 2 \operatorname{xor} ... \operatorname{xor} a-1)。

否则,由于异或具有已知 axorb=ca \operatorname{xor} b=c,则 cxorb=ac \operatorname{xor} b=aaxorc=ba \operatorname{xor} c=b 的性质,可以推算出最后一个需要添加到序列中的数 kk,然后根据情况:

  1. kak\neq a,输出 a+1a+1

  2. k=ak=a,输出 a+2a+2。(序列中不能有 aa

写出来之后,有些代码出现了 UKE\operatorname{UKE}(实际上是 TLE\operatorname{TLE})的现象,原因是这些代码有这一行:

for(int i=1;i<a;i++)p^=i;

这一行的时间复杂度是 O(a)\operatorname{O}(a),再加上前面 tt 次询问,则总时间复杂度是 O(at)\operatorname{O}(at)

1t5×105,1a3×1051\leq t\leq5\times10^5,1\leq a\leq3\times10^5 代入,则总时间复杂度是 O(1.5×1011)\operatorname{O}(1.5\times10^{11}),严重超时。

所以我们需要寻求更快的解法:

a=1,p1=1a=1,p_1=1

a=2,p2=3a=2,p_2=3

a=3,p3=0a=3,p_3=0

a=4,p4=4a=4,p_4=4

a=5,p5=1a=5,p_5=1

a=6,p6=7a=6,p_6=7

a=7,p7=0a=7,p_7=0

a=8,p8=8a=8,p_8=8

k(k0)\forall k(k\geq0),则

a=4k+1,pa=1a=4k+1,p_a=1

a=4k+2,pa=a+1a=4k+2,p_a=a+1

a=4k+3,pa=0a=4k+3,p_a=0

a=4k,pa=aa=4k,p_a=a

则求 pip_i 的函数显而易见:

long long y(int k){
	if(k%4==1)return 1;
	if(k%4==2)return k+1;
	if(k%4==3)return 0;
	if(k%4==0)return k;
}

依此写出代码,此题终。

#include<iostream>
using namespace std;
long long a,b,t,ans,p;
long long y(int k){
	if(k%4==1)return 1;
	if(k%4==2)return k+1;
	if(k%4==3)return 0;
	if(k%4==0)return k;
}
int main(){
	cin>>t;
	while(t--){
		cin>>a>>b;p=0;
		if(y(a-1)==b){
			cout<<a<<endl;
		}
		else{
			if((y(a-1)^b)!=a)cout<<a+1<<endl;
			else cout<<a+2<<endl;
		}
	}
	return 0;
}
posted @   Weslie_qwq  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示