神奇的建图方式(Tarjan)——小z玩游戏
原题来自与:洛谷 P5676(GZOI2017) 链接: https://www.luogu.com.cn/problem/P5676
题面:

题意比较明显,如果已经建好了边,那么跑个Tarjan 就完了。
但是问题在于建边的复杂度,比较好想的是n2 的建边方式。
但是时间肯定不允许。
那么我们就要想一种时间复杂度较小的建边方式。
可以考虑引入中间变量兴奋程度
那么如何建边,
首先将点开多一些
把中间变量兴奋程度也当作点
然后建边
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玩游戏的更多相关文章
- P5676 [GZOI2017]小z玩游戏【Tarjan】
小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...
- 【题解】 [GZOI2017]小z玩游戏
题目戳我 \(\text{Solution:}\) 考虑建图.操作可以看作对\(1\)进行的操作,于是有以下运行过程: \(1\to w[i]\to e[i]\to...\) 考虑倍数,一个数可以走到 ...
- P5676 [GZOI2017]小z玩游戏 Tarjan+优化建图
题目描述 分析 一开始看到这道题,首先想到的就是建好边后跑一个Tarjan缩点,将siz大于1的节点统计一下,输出结果 Tarjan非常显然易得,关键就是怎么建边 比较好想的一种思路就是枚举每一个兴奋 ...
- 二分图【洛谷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 ...
- 2783: 【基础】小 X 玩游戏(game)
2783: [基础]小 X 玩游戏(game) 时间限制: 1 Sec 内存限制: 64 MB 提交: 752 解决: 294 [提交] [状态] [讨论版] [命题人:ghost79] 题目描述 听 ...
- poj1149 PIGS 最大流(神奇的建图)
一开始不看题解,建图出错了.后来发现是题目理解错了. if Mirko wants, he can redistribute the remaining pigs across the unlock ...
- Fire Net(HDU-1045)(匈牙利最大匹配)(建图方式)
题意 有一个 n*n 的图,. 代表空白区域,X 代表墙,现在要在空白区域放置结点,要求同一行同一列只能放一个,除非有墙阻隔,问最多能放多少个点 思路 只有在墙的阻隔情况下,才会出现一行/列出现多个点 ...
- SCUT - 131 - 小P玩游戏II - 贪心 - 平衡树
https://scut.online/p/131 首先假如钦定了一群人去打怪兽,那么可以把主要的任务都丢给b最大的人去打,这样不会更差.然后考虑枚举这个b最大的人,其他人陪练.一开始就是ai+k*b ...
随机推荐
- 纯正中文版本pi-star系统下载
基于3.4.17修改(稳定,发热量少) 不支持RPI 4 a/b+ 完美支持树莓派0,1,2,3 默认刷好卡,启动已经设置好所有参数(选好TFT屏幕,调制解调器类型GPIO,打开了DMR服务器(460 ...
- 启动appium server时打印日志时间
在调试脚本的时候想看查找元素和执行命令花了多少时间,我们可以在启动appium server的时候加上启动参数,实现我们的需求. 1)输入:appium h,可以查看appium提供的启动参数有哪些. ...
- 总结梳理:webpack中如何使用vue
1. 安装vue的包 cnpm i vue -S 2. 由于在webpack中,推荐使用 .vue这个组件模板文件定义的组件,所以,需要安装, 能解析这个文件的loader: cnpm i vu ...
- MIPI CSI-2
目录 1 MIPI简介 2 MIPI CSI-2简介 2.1 MIPI CSI-2 的层次结构 2.2 CSI-2协议层 2.3 打包/解包层 2.4 LLP(Low Level Protocol)层 ...
- UniRx精讲(一):UniRx简介&定时功能实现
1.UniRx 简介 UniRx 是一个 Unity3D 的编程框架.它专注于解决时间上异步的逻辑,使得异步逻辑的实现更加简洁和优雅. 简洁优雅如何体现? 比如,实现一个"只处理第一次鼠标点 ...
- 01 . Docker原理部署及常用操作命令
Docker的来源及构造: 容器是一种基础工具:泛指任何用于容纳其他物品的工具,可以部分或完全封闭,被用于容纳,储存,运输物品: 物品可以被放置在容器中,而容器可以保护内容物: 人类使用容器的历史有十 ...
- @atcoder - AGC002E@ Candy Piles
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 堆糖果,第 i 堆包含 ai 个糖果. 现在两人进行博 ...
- qt解决release后数据库连接不上的问题
问题 : 明明已经设置了 "./xxx" , 为什么release之后数据库还是连不上呢 解决 : 项目中建立一个plugins文件夹 将qt安装目录下的sqldrivers复制到 ...
- Elasticsearch原理入门
这是一篇拼接贴,我是缝合怪 项目中用到了es,使用方法是挺简单的,封装了基本api以后,把查询条件封装一下传给client执行就可,但是光使用比较肤浅,研究一下原理和本质,更利于以后开发使用 扫盲贴 ...
- Android学习笔记StateListDrawable文件
SateListDrawable,可包含一个 Drawable 数组,让目标组件在不同状态显示不同 Drawable.对应的 xml 文件的根节点 示例 edittext_focused.xml &l ...