【题解】 [GZOI2017]小z玩游戏
\(\text{Solution:}\)
考虑建图。操作可以看作对\(1\)进行的操作,于是有以下运行过程:
\(1\to w[i]\to e[i]\to...\)
考虑倍数,一个数可以走到所有是它的倍数的数。于是这样建图:
\(w[i]\to e[i],i\to i*j.\)
然后发现倍数的边可以只建立质数的倍数即可。
题目本质是将所谓游戏重玩看成环,并将操作抽象为对初始元素\(1\)进行的状态转移,进而建立出模型。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int T,n,w[MAXN],e[MAXN],head[500010],tot,id,p[MAXN];
struct Edge{int nxt,to;}edge[500010];
int dfn[MAXN],inst[MAXN],low[MAXN],vis[MAXN],col[MAXN],c;
int st[MAXN],top,cnt;
void Euler(){
for(int i=2;i<=100000;++i){
if(!vis[i])p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=100000;++j){
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
inline void add(int x,int y){
edge[++tot].to=y;
edge[tot].nxt=head[x];
head[x]=tot;
}
void pre(){
for(int i=0;i<=100000;++i)dfn[i]=low[i]=inst[i]=st[i]=col[i]=0;
for(int i=1;i<=tot;++i)head[i]=0;
tot=0,top=0,id=0,c=0;
}
void Link(){
for(int i=1;i<=n;++i)add(w[i],e[i]);
for(int i=1;i<=100000;++i)
for(int j=1;i*p[j]<=100000;++j)
add(i,i*p[j]);
}
void Tarjan(int x){
st[++top]=x;low[x]=dfn[x]=++id;inst[x]=1;
for(int i=head[x];i;i=edge[i].nxt){
int j=edge[i].to;
if(!dfn[j]){
Tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(inst[j])low[x]=min(low[x],dfn[j]);
}
if(low[x]==dfn[x]){
int y;++c;
while(y=st[top--]){
inst[y]=0;
col[y]=c;
vis[y]=1;
if(x==y)break;
}
}
}
int main(){
scanf("%d",&T);
Euler();p[++cnt]=20060727;
while(T--){
pre();
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&w[i]);
for(int i=1;i<=n;++i)scanf("%d",&e[i]);
Link();
Tarjan(1);
int ans=0;
for(int i=1;i<=n;++i)if(col[w[i]]==col[e[i]])ans++;
printf("%d\n",ans);
}
return 0;
}
【题解】 [GZOI2017]小z玩游戏的更多相关文章
- P5676 [GZOI2017]小z玩游戏【Tarjan】
小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...
- P5676 [GZOI2017]小z玩游戏 Tarjan+优化建图
题目描述 分析 一开始看到这道题,首先想到的就是建好边后跑一个Tarjan缩点,将siz大于1的节点统计一下,输出结果 Tarjan非常显然易得,关键就是怎么建边 比较好想的一种思路就是枚举每一个兴奋 ...
- 神奇的建图方式(Tarjan)——小z玩游戏
原题来自与:洛谷 P5676(GZOI2017) 链接: https://www.luogu.com.cn/problem/P5676 题面: 题意比较明显,如果已经建好了边,那么跑个Tarjan ...
- 2783: 【基础】小 X 玩游戏(game)
2783: [基础]小 X 玩游戏(game) 时间限制: 1 Sec 内存限制: 64 MB 提交: 752 解决: 294 [提交] [状态] [讨论版] [命题人:ghost79] 题目描述 听 ...
- 二分图【洛谷P2175】 小Z的游戏分队
P2175 小Z的游戏分队 小Z受不了寂寞,准备举办一次DOTA比赛,为了能让ACM班全部都参加比赛,他还特制了一张DOTA地图能够支持任意多人打任意多人. 现在问题来了,怎么把这么多人分成两队?小Z ...
- JZOJ 5777. 【NOIP2008模拟】小x玩游戏
5777. [NOIP2008模拟]小x玩游戏 (File IO): input:game.in output:game.out Time Limits: 1000 ms Memory Limits ...
- 【题解】小Z的袜子
期末考试结束了,来写写blog吧 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具 ...
- SCUT - 131 - 小P玩游戏II - 贪心 - 平衡树
https://scut.online/p/131 首先假如钦定了一群人去打怪兽,那么可以把主要的任务都丢给b最大的人去打,这样不会更差.然后考虑枚举这个b最大的人,其他人陪练.一开始就是ai+k*b ...
- CONTEST36 小Z的模拟赛(2)
A.小Z的可恶路障 题目:http://www.luogu.org/problem/show?pid=U126 题解:暴力也可以过吧.我为了保险先求了一次最短路,然后枚举这条最短路上的所有边... 代 ...
随机推荐
- 基于PHP实现CMS识别
最近正在开发一款基于PHP实现的Web安全检测平台,写到了CMS识别这一功能,便写一篇文章总结一下. 首先需要梳理的是CMS识别的几种方法: 1.网页源代码特征:例如源代码中包含CMS的名称或是某种特 ...
- Prometheus监控神器-服务发现篇(二)
本章节讲解服务发现与Relabelling的机制与范例. 通过服务发现的方式,我们可以在不重启Prometheus服务的情况下动态的发现需要监控的Target实例信息. 如上图所示,对于线上环境我们可 ...
- xAxis&yAxis
const option = { color: ['#546570', '#2f4554', '#61a0a8'], xAxis: { type: 'category', data: ['Mon', ...
- 小程序开发-开发模式下关闭http域名校验
小程序开发模式去掉域名校验 我们在开发小程序的时候如果用到其他网络地址,在小程序运行时调试器会输出 : http://www.example.com 不在以下 request 合法域名列表中,请参考文 ...
- day48:django前戏之HTTP协议&自定义web框架
目录 1.HTTP协议 1.HTTP协议简介 2.HTTP协议概述 3.HTTP协议工作原理 4.HTTP协议请求方法 5.HTTP协议状态码 6.URL 7.HTTP请求格式 8.HTTP响应格式 ...
- VMware虚拟中输入ifconfig提示not found解决办法
1. 查看虚拟机是否没有IP地址:命令行中输入ip addr,如图红框所示,若无是需要设置. 2. 进入sbin目录确认ifconfig是否安装:可以通过命令[ls | grep 'if']来看 3. ...
- C#开发PACS医学影像处理系统(二):界面布局之菜单栏
在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并置顶,VerticalAlignment="Top" logo图片和标题 ...
- Java数据类型之Cache模式
1.关于Java数据类型 基本数据类型 基本数据类型有8种,每种基本数据类型都有对应的引用类型. 类型 描述 长度 可表示数据 包装类型 boolean 布尔型 1 true.false Boolea ...
- 二、loadrunner参数化连接数据库
2.连接sqlserver数据库.oracle数据库或mysql数据库(只有mysql数据库驱动需要先手动安装) 2.1.新建一个参数,随便设置file还是table类型之类的 2.2.点击Data ...
- 测试软件—禅道BUG管理工具
入禅 目录 入禅 1.禅道的基本使用 1.禅道的基本使用 admin(管理员) 部门:创建部门(需求部门,开发部门,测试部门,项目部门,产品部门) 组织:创建用户(产品经理,项目经理,开发人员,测试人 ...