原题来自与:洛谷 P5676(GZOI2017)  链接: https://www.luogu.com.cn/problem/P5676

题面:

题意比较明显,如果已经建好了边,那么跑个Tarjan 就完了。

但是问题在于建边的复杂度,比较好想的是n 的建边方式。

但是时间肯定不允许。

那么我们就要想一种时间复杂度较小的建边方式。

可以考虑引入中间变量兴奋程度

那么如何建边,

首先将点开多一些

把中间变量兴奋程度也当作点

然后建边

1.建一个由 有趣程度 到 点 的边

2.建一个由 点 到 兴奋程度 的边

3.重点:建一个兴奋程度整数倍的边。

然后就跑一边tarjan就完了,

下面是代码(加注释):

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=500005*4;
int n;
int Max=0;
struct edge{
int to,next;
}e[maxn];int head[maxn],cnt=0;
void add(int x,int y){
e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;
}
int w[maxn],b[maxn];
int dfn[maxn],low[maxn],dfs_clock,sta[maxn],top,belong[maxn],siz[maxn],vis[maxn],dcc;
void dfs(int u){
dfn[u]=low[u]=++dfs_clock;
sta[++top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(!belong[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){//特殊的出栈方式
dcc++;
belong[u]=dcc;
siz[dcc]++;
while(sta[top]!=u){
int x=sta[top--];
belong[x]=dcc;
siz[dcc]++;
vis[x]=1;
}
if(siz[dcc]>1)vis[u]=1;
top--;
}
}
void clear(){
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
cnt=0;Max=0;
memset(w,0,sizeof(w));
memset(b,0,sizeof(b));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
dfs_clock=0;
memset(sta,0,sizeof(siz));
top=0;
memset(belong,0,sizeof(belong));
memset(siz,0,sizeof(siz));
memset(vis,0,sizeof(vis));
dcc=0;
}
int main(){
//freopen("a.in","r",stdin);
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
add(n+w[i],i);
Max=max(Max,w[i]);//建第一种边
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
add(i,n+b[i]);//见第二种边
}
for(int i=1;i<=Max;i++){
for(int j=2;j*i<=Max;j++){//第三种边
add(i+n,j*i+n);
}
}
if(n==1){//数据特判,详见样例1
printf("1\n");clear();continue;
} for(int i=1;i<=n;i++){//tarjan
if(!dfn[i])dfs(i);
}
int ans=0;
for(int i=1;i<=n;i++){//判断答案,注意只要1——n的点
if(vis[i])ans++;
}
printf("%d\n",ans);
clear();
}
return 0;
}

希望大家能学会这种神奇的建边方式

神奇的建图方式(Tarjan)——小z玩游戏的更多相关文章

  1. P5676 [GZOI2017]小z玩游戏【Tarjan】

    小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...

  2. 【题解】 [GZOI2017]小z玩游戏

    题目戳我 \(\text{Solution:}\) 考虑建图.操作可以看作对\(1\)进行的操作,于是有以下运行过程: \(1\to w[i]\to e[i]\to...\) 考虑倍数,一个数可以走到 ...

  3. P5676 [GZOI2017]小z玩游戏 Tarjan+优化建图

    题目描述 分析 一开始看到这道题,首先想到的就是建好边后跑一个Tarjan缩点,将siz大于1的节点统计一下,输出结果 Tarjan非常显然易得,关键就是怎么建边 比较好想的一种思路就是枚举每一个兴奋 ...

  4. 二分图【洛谷P2175】 小Z的游戏分队

    P2175 小Z的游戏分队 小Z受不了寂寞,准备举办一次DOTA比赛,为了能让ACM班全部都参加比赛,他还特制了一张DOTA地图能够支持任意多人打任意多人. 现在问题来了,怎么把这么多人分成两队?小Z ...

  5. JZOJ 5777. 【NOIP2008模拟】小x玩游戏

    5777. [NOIP2008模拟]小x玩游戏 (File IO): input:game.in output:game.out Time Limits: 1000 ms  Memory Limits ...

  6. 2783: 【基础】小 X 玩游戏(game)

    2783: [基础]小 X 玩游戏(game) 时间限制: 1 Sec 内存限制: 64 MB 提交: 752 解决: 294 [提交] [状态] [讨论版] [命题人:ghost79] 题目描述 听 ...

  7. poj1149 PIGS 最大流(神奇的建图)

    一开始不看题解,建图出错了.后来发现是题目理解错了.  if Mirko wants, he can redistribute the remaining pigs across the unlock ...

  8. Fire Net(HDU-1045)(匈牙利最大匹配)(建图方式)

    题意 有一个 n*n 的图,. 代表空白区域,X 代表墙,现在要在空白区域放置结点,要求同一行同一列只能放一个,除非有墙阻隔,问最多能放多少个点 思路 只有在墙的阻隔情况下,才会出现一行/列出现多个点 ...

  9. SCUT - 131 - 小P玩游戏II - 贪心 - 平衡树

    https://scut.online/p/131 首先假如钦定了一群人去打怪兽,那么可以把主要的任务都丢给b最大的人去打,这样不会更差.然后考虑枚举这个b最大的人,其他人陪练.一开始就是ai+k*b ...

随机推荐

  1. java实现第四届蓝桥杯有理数类

    有理数类 题目描述 有理数就是可以表示为两个整数的比值的数字.一般情况下,我们用近似的小数表示.但有些时候,不允许出现误差,必须用两个整数来表示一个有理数. 这时,我们可以建立一个"有理数类 ...

  2. .NET Core技术研究系列-索引篇

    随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...

  3. 链家网 + gevent

    import gevent from gevent import monkey monkey.patch_all() from gevent.queue import Queue import tim ...

  4. office2016专业增强版激活密匙 (shell激活版)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_42642945/article/d ...

  5. [xDebug] 服务器端的配置参数

    [Xdebug] ;load xdebug extensionzend_extension_ts = path/tp/xdebug;是否开启自动跟踪xdebug.auto_trace = On;是否开 ...

  6. Apache(httpd)详解

    httpd详解(思维导图) 1. httpd服务 ASF 服务器类型 http服务器 应用程序服务器 httpd的特性 高度模块化 DSO机制 MPM httpd的并发响应模型 prefork wor ...

  7. 13.Django-分页

    使用Django实现分页器功能 要使用Django实现分页器,必须从Django中导入Paginator模块 from django.core.paginator import Paginator 假 ...

  8. 为什么启动线程是start方法?

    为什么启动线程是start方法 十年可见春去秋来,百年可证生老病死,千年可叹王朝更替,万年可见斗转星移.   凡人如果用一天的视野,去窥探百万年的天地,是否就如同井底之蛙? 背景:启动线程是start ...

  9. Jmeter服务器监控技术

    meter-plugins.org推出了全新的Plugins Manager,对于其提供的插件进行了集中的管理, 将 ServerAgent-xxx.jar上传被测服务器解压 进入目录 ServerA ...

  10. WeChair项目Alpha冲刺(8/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第八天 昨日进展: 前端:安排页面美化,设计实名认证 后端:用户信息通过dao层存储数据库 数据库:修改数据表属性,与后端部署数据库交互 2.今日安 ...