【uoj#175】新年的网警 结论题+Hash
给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1。对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 $k$ 的最短路与 $j$ 到 $k$ 的最短路之差为定值。求所有满足条件的点 $i$ 。
$n\le 100000,m\le 200000$
题解
结论题+Hash
结论:$i$ 满足条件,当且仅当满足三个条件之一:
1. 点 $i$ 的度数为1;
2. 点 $i$ 与一个度数为1的点相连;
3. 存在某个点 $j$ ,使得 $i$ 与 $j$ 和所有除 $i,j$ 以外的点是否有边 相同。
证明参考 这里 。
对于条件1、2很容易判断。
对于3条件我们可以将所有与 $i$ 点相连的点Hash一下即可判断出 $i$ 与 $j$ 没有边的 $j$ 。
再把 $i$ 自己加进去Hash一下即可判断书 $i$ 与 $j$ 有边的 $j$ 。
其中Hash的模数要设成 $10^{18}$ 级别。
时间复杂度为使用map判断的 $O(m+n\log n)$
#include <map>
#include <cstdio>
#include <cstdlib>
#define N 100010
using namespace std;
typedef long long ll;
map<ll , int> mp1 , mp2;
int px[N << 1] , py[N << 1] , c[N] , flag[N] , ans[N];
ll v[N] , a[N] , b[N];
int main()
{
srand(20011011);
int T;
scanf("%d" , &T);
while(T -- )
{
mp1.clear() , mp2.clear();
int n , m , i , tot = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) v[i] = a[i] = ((ll)rand() << 45) + ((ll)rand() << 30) + (rand() << 15) + rand() , flag[i] = c[i] = b[i] = 0;
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &px[i] , &py[i]) , c[px[i]] ++ , c[py[i]] ++ ;
for(i = 1 ; i <= m ; i ++ )
{
if(c[px[i]] == 1) flag[py[i]] = 1;
if(c[py[i]] == 1) flag[px[i]] = 1;
a[px[i]] ^= v[py[i]] , b[px[i]] ^= v[py[i]];
a[py[i]] ^= v[px[i]] , b[py[i]] ^= v[px[i]];
}
for(i = 1 ; i <= n ; i ++ ) mp1[a[i]] ++ , mp2[b[i]] ++ ;
for(i = 1 ; i <= n ; i ++ )
if(c[i] == 1 || flag[i] || mp1[a[i]] > 1 || mp2[b[i]] > 1)
ans[++tot] = i;
printf("%d\n" , tot);
for(i = 1 ; i <= tot ; i ++ ) printf("%d " , ans[i]);
puts("");
}
return 0;
}
【uoj#175】新年的网警 结论题+Hash的更多相关文章
- uoj175 【Goodbye Yiwei】新年的网警
题目 胡乱分析 不妨定谣言的源头得到谣言的时刻为\(1\),那么其他人听到谣言的时间就是源头到这个点的最短路 假设\(i\)是谣言的源头,那么如果存在一个点\(j\)满足\(\forall k\in[ ...
- 【uoj#282】长度测量鸡 结论题
题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...
- 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组
题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...
- [codevs5578][咸鱼]tarjan/结论题
5578 咸鱼 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...
- BZOJ_1367_[Baltic2004]sequence_结论题+可并堆
BZOJ_1367_[Baltic2004]sequence_结论题+可并堆 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 ...
- [BZOJ3609][Heoi2014]人人尽说江南好 结论题
Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏. 在过去,人们是要 ...
- 【bzoj4401】块的计数 结论题
题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...
- 【bzoj3997】[TJOI2015]组合数学 Dilworth定理结论题+dp
题目描述 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...
- [UOJ#351]新年的叶子
[UOJ#351]新年的叶子 试题描述 躲过了AlphaGo 之后,你躲在 SingleDog 的长毛里,和它们一起来到了AlphaGo 的家.此时你们才突然发现,AlphaGo 的家居然是一个隐藏在 ...
随机推荐
- Lite OS学习之事件EVENT
1. Lite OS的事件EVENT,就是一个任务向另外一个任务通知事件的,不能数据传输.看下有的函数,实际比较复杂 2. 具体还是看编程,先全局结构体整个事件变量 /*事件控制结构体*/ EVENT ...
- XAF.web.NewUI:如何自定义主题
一.使用主题制作工具导出主题: 修改主题生成器工具导出的主题.改完后,导出到 App_Themes 文件夹.例如,更改 ASPxGridView 组面板和Pager面板背景色并保存更改. 使用Them ...
- QT在子窗口外单击关闭子窗口
网上查到了好多种方法,1.添加过滤器(eventFilter),2.重写鼠标单击事件,这两种方法都要判断鼠标单击位置是不是在子窗口上.而且在可编辑控件上如(下拉框.文本编辑框等),父窗口会直接传递到可 ...
- JAVA验证码识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本
JAVA验证识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本 工具准备: jTessBoxEditorFX下载:https://github.com/nguyenq/jT ...
- 【Jmeter测试】如何使用CSV Data Set Config获取参数
Jmeter提供CSV Data Set Config作为参数获取的一种方式 1.文件名:csv文件的绝对路径2.文件编码:根据运行环境设置,个人常用的是mac和linux,所以这里选择UT ...
- 廖雪峰git笔记
查看本地机子的在Git上的名字和邮箱:git config user.namegit config user.email 对所有仓库指定相同的用户名和Email地址:git config --glob ...
- while read读取文本内容
读取文件给 while 循环 方式一: exec <FILE while read line do cmd done 方式二: cat FILE_PATH |while read line do ...
- Fast R-CNN学习总结
Fast R-CNN是R-CNN的改良版,同时也吸取了SPP-net中的方法.在此做一下总结. 论文中讲到在训练阶段,训练一个深度目标检测网络(VGG16),训练速度要比R-CNN快9倍左右,比SPP ...
- NodeJS实现同步的方法
NodeJS被打上了单线程.非阻塞.事件驱动…..等标签. 在单线程的情况下,是无法开启子线程的.经过了很久的研究,发现并没有thread函数!!!但是有时候,我们确实需要“多线程”处理事务.node ...
- is-A继承?Has-A?
教程把is-A和Has-A放在一起,我还以为java支持简单的方法能把Has对象的方法导出呢.. extents implements 要试一下. 不知道狗和汽车为什么总是被选出来举例. p ...