并不对劲的复健训练-CF1205B Shortest Cycle
题目大意
有\(n\)(\(n\leq 10^5\))个数\(a_1,...,a_n\)(\(a\leq 10^{18}\))。有一个图用这个方法生成:若\(a_i\)按位与\(a_j\)不为0,则在\(a_i,a_j\)间连一条无向边。求这个图的最小环,若无环输出-1。
题解
首先发现当有\(i,j,k\in[1,n]\)满足\(a_i,a_j,a_k\)在同一二进制位上为1时,最小环一定为3。
排除掉这种情况后,发现同一二进制位上为1的至多只有两个数,这两个数之间一定连边。
因为\(a\leq10^{18}\)所以只有\(2^0,...,2^{60}\)这61个二进制位可能会连边,至多涉及122个点。
只保留边涉及的点,就可以用邻接矩阵存这个图。
在这个图上求最小环,就可以枚举每条边求删掉该边后起点到终点的最短路+1。
代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define maxn 100007
using namespace std;
LL read()
{
LL x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
int n,to[65][2],num[65],rd[127][127],cnt,vis[maxn],inf[5],e[65][2],cnteg;
int dis[127],ans,q[127],hd,tl;
LL a[maxn];
int main()
{
n=read();
rep(i,1,n)a[i]=read();
rep(i,0,62)
{
rep(j,1,n)if(a[j]&(1ll<<i))
{
if(num[i]==2){puts("3");return 0;}
to[i][num[i]]=j,num[i]++;
}
}
memset(inf,0x7f,sizeof(inf)),ans=inf[0];
rep(i,0,62)if(num[i]==2)
{
if(!vis[to[i][0]])vis[to[i][0]]=++cnt;
if(!vis[to[i][1]])vis[to[i][1]]=++cnt;
if(!rd[vis[to[i][0]]][vis[to[i][1]]])
rd[vis[to[i][0]]][vis[to[i][1]]]=rd[vis[to[i][1]]][vis[to[i][0]]]=1,
cnteg++,e[cnteg][0]=vis[to[i][0]],e[cnteg][1]=vis[to[i][1]];
}
rep(i,1,cnteg)
{
rd[e[i][0]][e[i][1]]=rd[e[i][1]][e[i][0]]=0;
rep(j,1,cnt)dis[j]=inf[0];
dis[e[i][0]]=0,hd=1,q[tl=1]=e[i][0];
while(hd<=tl)
{
int u=q[hd++];
rep(j,1,cnt)if(rd[u][j]&&dis[j]==inf[0])
{
dis[j]=dis[u]+1;
if(j==e[i][1])break;
q[++tl]=j;
}
if(dis[e[i][1]]!=inf[0])break;
}
if(dis[e[i][1]]!=inf[0])ans=min(dis[e[i][1]]+1,ans);
rd[e[i][0]][e[i][1]]=rd[e[i][1]][e[i][0]]=1;
}
if(ans==inf[0])write(-1);
else write(ans);
return 0;
}
并不对劲的复健训练-CF1205B Shortest Cycle的更多相关文章
- 并不对劲的复健训练-CF1187D
题目大意 有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) ).一次操作是选取 \([l,r]\ ...
- 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击
题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...
- 并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎
题目大意 题目链接 题解 先将\(a\)排序. \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上:而当\(a_m= ...
- 并不对劲的复健训练-p5212 SubString
题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...
- 并不对劲的复健训练-bzoj5249:loj2472:p4364[2018多省联考]IIIDX
题目大意 给出\(n,k,d_1,...,d_n\)(\(n\leq 5\times 10^5,1<k\leq 10^9,d\leq 10^9,k\in R\)).有一个满足 对于每个点\(i\ ...
- 并不对劲的复健训练-bzoj5253:loj2479:p4384:[2018多省联考]制胡窜
题目大意 给出一个字符串\(S\),长度为\(n\)(\(n\leq 10^5\)),\(S[l:r]\)表示\(S_l,S_{l+1}...,S_r\)这个子串.有\(m\)(\(m\leq 3\t ...
- 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列
题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...
- 并不对劲的复健训练-p3674
题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...
- 2019NOIP算法复健+学习
前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...
随机推荐
- 在linux环境下使用icepdf或pdfbox将pdf转化成图片是乱码解决
在linux环境下使用icepdf或pdfbox将pdf转化成图片是出现乱码,网上查发下是itextpdf生成pdf引用"STSong-Light"字体而linux环境下没有这个字 ...
- pwn学习日记Day5 基础知识积累
知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...
- 微信小程序 图片裁剪
微信小程序 图片裁剪 分享一个微信小程序图片裁剪插件,很好用,支持旋转 文档:https://github.com/wyh19931106/image-cropper 1.json文件中添加image ...
- Kafka Eagle 安装
Kafka Eagle 是一款开源的 Kafka 集群监控系统. 一.下载 https://download.kafka-eagle.org/ 二.安装 # 解压 .tar.gz -C /opt/ / ...
- SQL-W3School-基础:SQL 语法
ylbtech-SQL-W3School-基础:SQL 语法 1.返回顶部 1. 数据库表 一个数据库通常包含一个或多个表.每个表由一个名字标识(例如“客户”或者“订单”).表包含带有数据的记录(行) ...
- C# 程序的关闭 讲究解释
程序的关闭是很讲究的,处理的不好的话,将软件连续开启和关闭,当数次后在启动软件后程序会崩溃.或者程序退出很慢.细节决定成败,一款好的软件应该从各方面都要做严格地反复地推敲,力争做到无可挑剔. 有 ...
- [spring]@Resource和@Autowired区别对比
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Sprin ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-01分布式核心知识之熔断、降级
笔记: 第五章 互联网架构服务降级熔断 Hystrix 实战 1.分布式核心知识之熔断.降级讲解 简介:系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案 1.熔断: ...
- Linux 上svn使用http访问设置
https://blog.csdn.net/wobuxingfang/article/details/70835414https://blog.csdn.net/u010487568/article/ ...
- Linux系统管理_主题02 :管好文件(1)_2.2 列出文件和文件属性_chmod_ls
用户(user)是能够获取系统资源的权限的集合.Linux 中的用户可 以分为三类: 1. 根用户(root):具有系统全部权限的用户: 2. 普通用户:其使用系统的权限受到一定限制: 3. 系统 ...