「FAOI-R8」Jueves题解
题目背景
题目描述
小 A 给了你一张 n 个点的无向完全图,每个点有权值,第 i 个点的权值为 ai。连接 (u,v) 的边的权值为 (auxorav)+(auorav)+(auandav),其中 xor,or,and 分别是二进制下的按位异或、按位或和按位与。
定义一条路径的权值为经过的边的权值和。给出 s,t,求出从 s 出发到 t 的路径的最小权值。
输入格式
本题每测试点内含多组数据。
第一行一个整数 T 代表数据组数。
请用 CaT 变量来表示数据组数。
对于每组测试数据:
- 第一行三个正整数 n,s,t,表示点数、起点与终点。
- 第二行 n 个整数,第 i 个是 ai,表示第 i 个点的权值。
输出格式
对于每组测试数据,输出一行一个整数表示答案。
输入输出样例
输入 #1复制
4 2 1 2 1 2 3 1 3 1 2 3 8 1 7 1 4 0 2 5 8 4 6 7 1 1 2 0 0 4 3 1 1
输出 #1复制
6 6 10 0
说明/提示
【样例解释】
对于第一组数据,唯一的路径是 1→2,权值为 (1xor2)+(1or2)+(1and2)=3+3+0=6。
对于第二组数据,一种最优的路径是 1→3,权值为 (1xor3)+(1or3)+(1and3)=2+3+1=6。
对于第三组数据,一种最优的路径是 1→7,权值为 (1xor4)+(1or4)+(1and4)=5+5+0=10。
【数据范围】
本题开启子任务捆绑测试。
- Subtask 1(40 pts):n≤10,∑n≤103。
- Subtask 2(30 pts):ai≤103。
- Subtask 3(30 pts):无特殊限制。
记 ∑n 为单测试点内每组测试数据 n 之和。
对于所有数据,1≤T≤105,1≤n,∑n≤5×105,0≤ai≤1018,1≤s,t≤n。
思路
(auxorav)+(auorav)+(auandav)=2(auorav),所以直接走到最优。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long tt,n,s,t,a[500005],f[500005];
struct one{
long long a,b;
};
queue<one> q;
int main(){
cin>>tt;
while(tt--){
cin>>n>>s>>t;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=1e18+7;
}
if(s!=t){
cout<<2*(a[s]|a[t])<<endl;
}
else{
cout<<0<<endl;
}
// f[s]=0;
// q.push({s,0});
// while(q.size()!=0){
// one a1=q.front();
// for(int i=1;i<=n;i++){
// }
// }
}
return 0;
}

浙公网安备 33010602011771号