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,aby,a+bz,许愿池会认为这个愿望是力所能及的,并返回 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 行输出一个字符串 YESNO 表示第 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 z2×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 1Q105,1x,y109,1z2×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;
} 
posted @ 2026-03-02 16:49  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源