P15445 「IXOI R1」永远在一起! 题解
P15445 「IXOI R1」永远在一起!
题目背景
“大家要长长久久地在一起哇。”
题目描述
连续 Q Q Q 天,你来到了许愿池旁,每天你手中持有一个正整数 x x x 来表示你的愿望。
愿望能否实现并不是个人所能完全左右的,所以每天许愿池会给你两个参数 y y y 和 z z z。
如果存在两个不相等的自然数
a
a
a 和
b
b
b,满足
a
or
b
=
x
,
∣
a
−
b
∣
≤
y
,
a
+
b
≤
z
a\operatorname{or}b=x,|a-b|\le y,a+b\le z
aorb=x,∣a−b∣≤y,a+b≤z,许愿池会认为这个愿望是力所能及的,并返回 YES,否则她会认为过于困难无法实现,返回 NO。
其中
a
or
b
a\operatorname{or}b
aorb 表示
a
a
a 和
b
b
b 的按位或,你也可以理解为 C++ 中的 | 运算符,
∣
m
∣
|m|
∣m∣ 表示
m
m
m 的绝对值。
你迫切的想知道每天的许愿结果。
输入格式
第 1 1 1 行一个整数 Q Q Q,表示你许愿的天数。
第 2 2 2 行到第 Q + 1 Q+1 Q+1 行每行三个整数 x , y , z x,y,z x,y,z,其意义已经在题目描述中给出。
输出格式
输出共
Q
Q
Q 行,第
i
i
i 行输出一个字符串 YES 或 NO 表示第
i
i
i 次许愿的结果。
输入输出样例 #1
输入 #1
2
5 2 9
3 9 2
输出 #1
YES
NO
说明/提示
样例解释
当 x = 5 , y = 2 , z = 9 x=5,y=2,z=9 x=5,y=2,z=9 时,取 a = 5 , b = 4 a=5,b=4 a=5,b=4 满足要求。
当 x = 3 , y = 9 , z = 2 x=3,y=9,z=2 x=3,y=9,z=2 时,不存在满足要求的 a , b a,b a,b 取法。
数据范围
本题采用捆绑测试。
| 子任务编号 | Q ≤ Q\leq Q≤ | x ≤ x\leq x≤ | 特殊性质 | 分值 |
|---|---|---|---|---|
| 0 0 0 | 10 10 10 | 5000 5000 5000 | 无 | 20 20 20 |
| 1 1 1 | 10 5 10^5 105 | 10 9 10^9 109 | 有 | 30 30 30 |
| 2 2 2 | 10 5 10^5 105 | 10 9 10^9 109 | 无 | 50 50 50 |
特殊性质:保证 z ≥ 2 × x z\ge 2\times x z≥2×x。
对于所有数据,保证:
1 ≤ Q ≤ 10 5 , 1 ≤ x , y ≤ 10 9 , 1 ≤ z ≤ 2 × 10 9 1\le Q\le 10^5,1\le x,y\le 10^9,1\le z\le2\times10^9 1≤Q≤105,1≤x,y≤109,1≤z≤2×109。
思路
直接写即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long q,x,y,z,p2[200005],ap[200005],bp[200005],aa=0,bb=0,od=0,wd=0,we=0,bo=0;
struct one{
long long h,c;
}b[200005];
int main(){
cin>>q;
p2[0]=1;
for(int i=1;i<=63;i++){
p2[i]=p2[i-1]*2ll;
}
while(q--){
cin>>x>>y>>z;
bb=0;
aa=-1;
we=x;
while(x!=0){
ap[++aa]=x%2;
if(x%2==1){
bp[++bb]=aa;
}
x/=2;
}
wd=0;
for(int i=bb;i>=1;i--){
b[i]=(one){wd+we,wd+p2[bp[i]]-(we-p2[bp[i]])};
wd+=p2[bp[i]];
}
bo=0;
for(int i=1;i<=bb;i++){
if(b[i].h<=z&&b[i].c<=y){
bo=1;
break;
}
}
if(bo==1){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号