牛客练习赛 66B题解
前言
当初思路
开始没想到异或这么多的性质,于是认为对于每个点\(u\),可以和它连边的点\(v\)的点权 \(a_v=a_u \oplus k\)(证明:\(\because\) \(a_u\oplus a_v =k\) \(\therefore\) \(a_u\oplus a_v \oplus a_u=a_u \oplus k\) 即\(a_v=a_u \oplus k\)),于是每次将同一个点权的点放在一起,跑一遍dijkstra
,然后超时了……(赛后重新提交,显示case通过率为32.00%
)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=1e6+10,MAXLIMIT=1048577;
int n,q,a[MAXN],ans,k,x,y;
std::vector<int> m[MAXLIMIT];
bool vis[MAXN];
int dis[MAXN];
int main(){
scanf("%d %d",&n,&q);
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
m[ a[i] ].push_back(i);
}
while(q--){
scanf("%d %d %d",&k,&x,&y);
memset(dis,~0xcf,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[x] = 0;
vis[x] = 1;
ans = MAXN + 10;
priority_queue <pair<int, int> > q;
q.push(make_pair(0,x));
while(!q.empty() && ans > n){
int t = q.top().second; q.pop();
int togo = a[t]^k;
for(int i=0;i < m[togo].size();i++){
if(!vis[m[togo][i]]){
dis[m[togo][i]] = dis[t]+1;
if(m[togo][i] == y){
ans=dis[t] + 1;
break;
}
vis[m[togo][i]] = 1;
q.push( make_pair( dis[m[togo][i]],m[togo][i] ) );
}
}
}
if(ans <= n) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
思路
实际上很简单,答案只有 -1,1,2 三种,我们注意到:对于每个点\(u\),和它连边的只有一种点权\(a_u \oplus k\),假设这种点为 \(v\) ,则能和\(v\) 连边的点权为 \(a_v \oplus k=a_u \oplus k \oplus k=a_u\) ,这意味着,对于每两个点 \(x\) , \(y\) , 要不是 \(a_x \oplus a_y =k\)则答案为1 就是 \(a_x==a_y\) 且存在 \(z\) 使 \(a_x \oplus k=a_z\) 则答案为 2 (先通过中转到 \(z\) ,再去 \(y\)),否则,答案为-1。
代码
一下子变简单了。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1e6+10;
int n,q,a[MAXN],k,x,y,times[(1<<20) + 10];
int main(){
scanf("%d %d",&n,&q);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]),times[ a[i] ]++;//记录每个权值出现次数
while(q--){
scanf("%d %d %d",&k,&x,&y);
if((a[x] ^ a[y]) == 0 && times[(a[x] ^ k)]>0) printf("2\n");//注意,必须要有中转的点才可输出2
else if( (a[x]^a[y]^k)==0 ) printf("1\n"); //可以直接连边
else printf("-1\n");//不能到达
}
return 0;
}
牛客练习赛 66B题解的更多相关文章
- 牛客练习赛24题解(搜索,DP)
A题,C题不讲,基础题(但是我要抨击一下这次比赛,卡cin,cout,卡的太狠了,根本就不让过的那种,QAQ) 链接:https://www.nowcoder.com/acm/contest/157/ ...
- 牛客练习赛66A题解
思路 令 \(sq=\sqrt x\) ,则答案必然在 $ sq^2$ 和 $ (sq+1)^2 $ 之间,两者比较一下谁离 \(x\) 最近,就是答案了. 代码 #include <bits/ ...
- 牛客练习赛26:D-xor序列(线性基)
链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 牛客练习赛64 D【容斥+背包】
牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A
牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...
- 最小生成树--牛客练习赛43-C
牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...
随机推荐
- Jmeter Response Data 乱码问题解决方法
1. 进入jmeter\apache-jmeter-4.0\bin,打开jmeter.properties 2. 搜索“sampleresult.default.encoding” 设置sampler ...
- python3.6 + django2.0.6 + xadmin0.6
django2.0集成xadmin0.6报错集锦 http://www.lybbn.cn/data/bbsdatas.php?lybbs=50 1.django2.0把from django.core ...
- Spring Cloud面试题万字解析(2020面试必备)
1.什么是 Spring Cloud? Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Tas ...
- ArrayList类的使用
ArrayList常用类方法 (1)添加元素 public boolean add(E element) 在集合末端添加一个元素 public void add(int index,E element ...
- git和github入门指南(4)
4.分支管理 4.1.什么是分支? 分支可以简单的理解为分叉,在主干上长出一条枝干出来,主干分支通常叫做master,在主分支上可以开很多分支出来,不同的人在不同的分支上做开发,最后合并到主分支,这样 ...
- 计算机组成原理Day-1
- Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心
1. 前言 相信参与使用Oracle数据库进行项目开发.运维的同学常常被Oracle JDBC驱动的Maven依赖折磨.现在这一情况在今年二月份得到了改变,甲骨文这个老顽固终于开窍了. 一位甲骨文的工 ...
- Pop Sequence 题解
Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...
- 使用Visual Studio 开发SharePoint项目时的快捷键
组合键:ctrl+c,alt+c,Shift+ctrl+c,可以快速的将文件拷贝到对应的部署目录下.
- 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之php-fpm配置及其与Nginx的通信
一.php-fpm的配置 1. php-fpm的配置,首先要关注进程数量. php-fpm的进程管理方式有三种:static.dynamic.ondemand. static方式,开启固定数量(pm. ...