【题解】 [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 题解:暴力也可以过吧.我为了保险先求了一次最短路,然后枚举这条最短路上的所有边... 代 ...
随机推荐
- LuaProfiler
Lua Profiler机制的源码解析 https://www.jianshu.com/p/f6606b27e9de
- 【jmespath】—3. 进阶 Object Projections
继续,来看Object Projections. 一.Object Projections 上面说的是列表投影,只适用于列表.那么对于json对象,可以用对象投影. 投影最终返回的仍然是个列表,只不过 ...
- Zabbix-4.0-设置钉钉报警脚本
问题:当服务器发生报错时,有一个信息能实现自动发送到我的手机或者应用上,以达到对服务器的实时的监控与处理.邮件与短信不能满足实时性,于是想到了钉钉的通知. 思路:在钉钉里面建一个群,群里面拉个机器人. ...
- Just an Old Puzzle(2019多校1007)
Problem Description You are given a 4 × 4 grid, which consists of 15 number cells and an empty cell. ...
- ASP.NET Core 3.x Razor视图运行时刷新实时编译
前言: 很长一段时间没有写过ASP.NET Core Razor(.cshtml)视图开发WEB页面了,今天刚好把之前做的一个由ASP.NET Core 2.2+Razor开发的项目升级到ASP.NE ...
- 【原创】经验分享:一个Content-Length引发的血案(almost....)
前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...
- Activiti7 获取资源信息及其查询流程历史信息
获取资源信息 /** * 获取资源信息 * * @throws IOException */ @Test public void getProcessResources() throws IOExce ...
- [Java]取得当前代码所在函数的函数名
要取得当前运行代码的函数名,可以用: Thread.currentThread().getStackTrace()[1].getMethodName(); 但是,这行代码有些过长,嵌入业务代码稍显突兀 ...
- RocketMQ生产部署架构如何设计
前言 看了我们之前的文章,相信小伙伴们对RocketMQ已经有了一个初步的了解,那么今天我们就来聊一聊具体如何来设计一套高可用的生产部署架构. 在聊如何设计这套架构的同时,我们再补充一些之前没提到的知 ...
- TP6.0 获取请求对象的五种方式
目录 1. 门面类 2. 依赖注入 3. 框架提供的基础控制器的 request 属性 4. request() 助手函数 5. app() 超级助手函数 think\Request.think\fa ...