JZOJ 5490. 【清华集训2017模拟11.28】图染色
Description
Input
第一行包括两个整数N,M。
接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边。可能存在重边自环。
Output
降序输出所有不为0的F(i) 。保留6位小数输出。
Sample Input
输入1:
5 5
1 2
2 5
3 4
4 5
3 5
输入2:
5 4
1 2
2 5
5 4
4 3
Sample Output
输出1:
3.000000
2.000000
输出2:
2.800000
2.200000
Data Constraint
对于20%的数据,n,m<=100
对于40%的数据,n,m<=5000
另外有20%的数据,保证图为一个连通的简单环,且当且仅当|u-v|=1 ,存在u到v的边。
对于100%的数据,n,m<=500000
Solution
我们可以愉快的发现这种染色很快就会进入一个循环……
听说可以证明循环的次数,可是我不会,就只做个十几二十轮。
用哈希判断一下当前状态出现过没,出现了就说明出现了循环节!
由于 F 数组的是通过取极限得到的,我们只需要保存循环节的答案即可。
统计循环节的答案时要打一下标记就能均摊 O(1)O(1) 计算了。
要注意一下精度问题~~。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=500001,mo=1e9+7,M=1e6+1;
int n,m,tot,sum,pos;
int first[N],next[N<<1],en[N<<1];
int a[N],p[M];
long long h[M],b[N],c[N],g[17][N],ans[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline int hash(int x)
{int y=x%M;while(h[y] && h[y]^x) y=(y+1)%M;return y;
}
int main()
{n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read();insert(x,y);insert(y,x);}for(int i=1;i<=n;i++) a[i]=i;for(int j=1,k=1;j<=n*16;j++,k=k+1>n?1:k+1){for(int i=first[k];i;i=next[i]){c[a[en[i]]]+=k-b[en[i]];b[en[i]]=k;a[en[i]]=a[k];}//for(int i=1;i<=n;i++) c[a[i]]++;if(k==n){for(int i=1;i<=n;i++) c[a[i]]+=k-b[i];memset(b,0,sizeof(b));long long key=0;for(int i=1;i<=n;i++) key=(key*10+a[i])%mo;int k=hash(key);if(h[k]){pos=p[k];break;}else{h[k]=key,p[k]=++sum;memcpy(g[sum],c,sizeof(g[sum]));}}}for(int i=1;i<=n;i++) b[i]=c[i]-g[pos][i];tot=0;double num=1.0/(1.0*n*(sum-pos+1)),ext=1e-6;for(int i=1;i<=n;i++)if(b[i]>=ext) ans[++tot]=b[i];sort(ans+1,ans+1+tot);for(int i=tot;i;i--) printf("%.6lf\n",1.0*ans[i]*num);return 0;
}
JZOJ 5490. 【清华集训2017模拟11.28】图染色相关推荐
- JZOJ 5489. 【清华集训2017模拟11.28】海明距离
Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...
- JZOJ 5484. 【清华集训2017模拟11.26】快乐树
Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
Description 给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大. Input 第一行一个数n表示点数,点的编号是0到n-1. 接下 ...
- jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥
分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...
- JZOJ5498. 【清华集训2017模拟12.10】大佬的难题
Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...
- [JZOJ5498]【清华集训2017模拟12.10】大佬的难题
Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...
- 【清华集训2017模拟】Catalan
Description 求Cnmod3814697265625(518)C_n \mod 3814697265625(5^{18})其中CnC_n为卡特兰数第n项 n<=10^18,T<= ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
最新文章
- Activity的知识
- Thymeleaf——使用模板动态生成JavaScript脚本文件
- Qt文档阅读笔记-写一个简单的单元测试
- java中factory_Java后台面试--Spring中FactoryBean与BeanFactory的使用及区别
- ThinkPHP实现注册功能
- ubuntu搜狗拼音输入法选词框乱码
- window下内网远程控制工具
- DDR3内存频率标识对应
- 2.3.4nbsp;《孙子兵法》的基本原则
- NLP,能辅助法官判案吗? | CCF C³
- Hilt Test 短篇:插入辅助测试,插这插那,操家伙,看飞刀。——对面那位接着:memory 做的 *……()……*
- 强力推荐90个优秀外国英文网站
- xenserver 备份和还原
- react项目中实现打印预览功能
- python手机触屏代码_JS移动客户端--触屏滑动事件及js手机拖拽效果
- http://www.dewen.net.cn/q/16042/jquery fadeIn和fadeOut问题
- python的数据类型包括内置的_python基础(三)-数据类型与内置方法1
- java定时数据同步_java 定时同步数据的任务优化
- 程序员发展路线及特定书籍推荐-摘自图灵社区
- 自动驾驶感知——激光雷达物体检测算法
热门文章
- 40岁后学编程(1)
- Linux /dev目录详解和Linux系统各个目录的作用
- Sublime Text2使用ctex
- Fill in blank -Thermal experiment theory and technology2018-01-06
- [我的1024开源程序]30元写的广义误差分布函数
- java获取异常的数据_Java(8题):异常,通过try catch进行处理,登录,商品,使用jdbc进行读取,详细图析...
- python怎么输出结果_python中打印输出date信息
- Qt修炼手册3_VS建立的Qt工程(或项目)生成pro文件
- VTK修炼之道60:体绘制_体绘制管线图形渲染管线
- [OS复习]操作系统综述1