并不对劲的复健训练-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太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...
随机推荐
- Leetcode题目98.验证二叉搜索树(递归-中等)
题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...
- MySQL所谓的脏页和“抖”一下是什么联系?
在我们平时经常用到的sql更新语句,之前是认为只要sql执行,当前sql的操作会立马执行到服务器磁盘上并返回,但是后来我才知道,事实并非如此,在了解事实之前,首先可能需要先了解什么是redo log, ...
- Flutter打开第三方应用
在flutter中打开第三方应用可以使用url_launcher插件 打开https://pub.dartlang.org/,然后搜索url_launcher,然后点击进入该插件界面 大家在insta ...
- 安装wls报(主清单位置 "/u01/app/oracle/inventory" 无效 (无法读取/写入/执行))
安装出现的错误: [weblogic@localhost ~]$ java -jar fmw_12.1.3.0.0_wls.jar 启动程序日志文件为/tmp/OraInstall2019-07-31 ...
- laravel-5.6路由命名
1.第一种:通过route路由中的as关键字来实现 1 Route::get('api/user',['as'='web.user'],'messageController@userInformati ...
- Mac下mysql服务端密码重置及环境配置
一 停止mysql服务 关闭MySQL服务的操作: 苹果->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop mysql server) 二 进入终端,命 ...
- JavaScript中字符串,数组的基本操作
JavaScript的字符串就是用”或”“括起来的字符表示. js中操作字符串: 1.获得字符串的长度 var s = 'Hello, world!'; s.length; // 132.获取指定字符 ...
- python之NLP词性标注
1.知识点 包括中文和英文的词性标注主要使用的库是nltk和jiaba 2.代码 # coding = utf-8 import nltk from nltk.corpus import stopwo ...
- 数位dp作业
dp东西实在太多,昨天开了个树形dp入门,还没入呢,今天就要写数位dp,也不知道这种学习状态对不对啊? A - 不要62 题意: 输入n到m内,符合条件的数的个数.条件:不含62和4. 这里直接学习q ...
- 二叉树实例学习(四)——获取节点的高度函数getHight()
树T中所有节点深度的最大值称为该树的高度(height),实际上每个节点与其所有子节点都可以看做一颗树,也就是说除了根结点,所有子结点都可以看做是一颗子树,因此每个结点都有树高.在本程序中约定,仅含单 ...