生活随笔
收集整理的這篇文章主要介紹了
牛客108D
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
小a有n個數(shù),他提出了一個很有意思的問題:他想知道對于任意的x, y,能否將x與這n個數(shù)中的任意多個數(shù)異或任意多次后變?yōu)閥
第一行為一個整數(shù)n,表示元素個數(shù)
第二行一行包含n個整數(shù),分別代表序列中的元素
第三行為一個整數(shù)Q,表示詢問次數(shù)
接下來Q行,每行兩個數(shù)x,y,含義如題所示
輸出Q行,若x可以變換為y,輸出“YES”,否則輸出“NO”
5
1 2 3 4 5
3
6 7?
2 1
3 8
YES
YES
NO
對于(6,7)來說,6可以先和3異或,再和2異或 對于(2,1)來說,2可以和3異或 對于(3,8)來說,3不論如何都不能變換為8
對于100%的數(shù)據(jù),n,Q<=105 保證所有運算均在int范圍內(nèi)
性質(zhì):x^y=z ?=>x^z=y
?
#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <stdlib.h>
#include <ctime>
using namespace std;
typedef long long ll;
int a[65];
void build(int A)
{for(int x=31; x>=0; --x){if(A>>x&1){if(a[x]==0){a[x]=A;break;}A^=a[x];}}
}
bool query(int A)
{for(int i=31; i>=0; --i){if((A>>i&1)&&a[i])A^=a[i];}return A==0;
}
int main()
{int n;int A;while(scanf("%d",&n)!=EOF){for(int i=0; i<n; ++i){scanf("%d",&A);build(A);}int t,x,y;cin>>t;while(t--){scanf("%d%d",&x,&y);if(query(x^y))cout<<"YES"<<endl;else cout<<"NO"<<endl;}}return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的牛客108D的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。