「FAOI-R8」Jueves题解

题目背景

题目描述

小 A 给了你一张 n 个点的无向完全图,每个点有权值,第 i 个点的权值为 ai​。连接 (u,v) 的边的权值为 (au​xorav​)+(au​orav​)+(au​andav​),其中 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。

思路

(au​xorav​)+(au​orav​)+(au​andav​)=2(au​orav​),所以直接走到最优。

代码见下

#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;
}

posted @ 2025-10-08 07:59  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源