当前位置: 首页 > 编程日记 > 正文

【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

题面

在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接。
对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么它们就会被认为是一对友好城市。
Byteland 的交通系统十分特殊,第i 天只有编号在[li, ri] 的单向公路允许通行,请写一个程序,计算每天友好城市的对数。
注意:(a, b) 与(b, a) 没有区别。
1146820-20170418111834009-2093271390.png

70

Kosarajo算法

这是一个区别于tarjan算法的求强连通分量的算法。

流程

1.在逆图上进行一次dfs,然后记录下每个点的后序编号(?)。
e.g.

void dfs(int v){dfs(next(v));  //先往后继递归st[++st[0]]=v; //再在这记录后序编号
}

2.按后序编号从大到小在原图上再进行一次dfs,所能走到的就是与这个点处于同一强连通分量的点。
3.时间复杂度为\(O(n+m)\)

正文

我们看到给出的区间的左端点和右端点都是不减的,就有边只会进出一次。
所以我们可以用邻接矩阵维护边,然后就可以使用Kosarajo算法统计答案。
这样的时间复杂度为\(O(n^2*q)\),然而这还是过不了70分。

bitset优化

由于边不存在权值,所以我们用bitset来存储邻接矩阵。
然后Kosarajo算法统计答案时,也要用到bitset的位运算优化。
于是就能把复杂度优化到\(O(\frac{1}{32}n^2*q)\)

可能会用到的bitset函数

.reset(),归零;
._Find_next(int v),查找第v为的第一个1,返回位置。
Warning:bitset的下标是从0开始算,所以如果要从头开始找,就用._Find_next(-1)。

100

100分与70分的区别就是,边可能会重复加入。
注意到,如果对于两个已有的边集(邻接矩阵),那么我们可以利用bitset来优化合并,达到\(O(\frac{n^2}{32})\)的复杂度,是很优秀的。
我们给\(m\)条边分块,共\(\sqrt m\)块,每个块考虑使用bitset来存储邻接矩阵;
按照一般的分块套路,我们确实可以用\(O(q*(\sqrt m*\frac{n^2}{32}+\sqrt m))\)来维护邻接矩阵。
但是仍然无法被题目苛刻的条件所接受。
于是我们考虑对块建立ST表,那么就能把维护的时间降到\(O(q*(log_{\sqrt m}*\frac{n^2}{32}+\sqrt m))\)
就能通过本题。

为什么不用tarjan,而用Kosarajo代替

对于tarjan而言,他需要遍历一些已经被访问的点,所以不能使用bitset优化;
而Kosarajo,每个点只会被遍历一次,所以能使用bitset优化。

为什么不用线段树,而用ST表和分块代替

线段树的空间不能被接受,是\(O(m*log_m*\frac{n^2}{32})\)

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bitset>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="friend.in";
const char* fout="friend.out";
const int inf=0x7fffffff;
const int maxn=157,maxm=300007,maxk=557,maxl=10;
int n,m,q,a[maxm][2],ks,num,st[maxn],cnt=0,pre[maxn],ans;
bitset<maxn> b[maxk][maxl][maxn],bb[maxk][maxl][maxn],bz,p[maxn],pp[maxn];
void make(int l,int r){int k=maxl-1;fo(i,1,n) p[i].reset(),pp[i].reset();while (l<=r){if (l+(1<<k)-1<=r){fo(i,1,n) p[i]|=b[l][k][i],pp[i]|=bb[l][k][i];l+=(1<<k);}if (k>0) k--;}
}
void dfs(int v){bz.reset(v);while (1){int k=(pp[v]&bz)._Find_next(0);if (k>n) break;dfs(k);}st[++st[0]]=v;
}
void Dfs(int v){cnt++;bz.reset(v);while (1){int k=(p[v]&bz)._Find_next(0);if (k>n) break;Dfs(k);}
}
void kosarajo(){ans=0;bz.set();st[0]=0;fo(i,1,n)if (bz[i]){dfs(i);}bz.set();fd(i,st[0],1){if (bz[st[i]]){cnt=0;Dfs(st[i]);ans+=cnt*(cnt-1)/2;}}
}
int main(){freopen(fin,"r",stdin);freopen(fout,"w",stdout);scanf("%d%d%d",&n,&m,&q);fo(i,1,m) scanf("%d%d",&a[i][0],&a[i][1]);ks=int(sqrt(m));int j=1,k=ks;fo(i,1,m){if (i>k){k+=ks;j++;}b[j][0][a[i][0]].set(a[i][1]);bb[j][0][a[i][1]].set(a[i][0]);}num=j;fd(i,num,1){fo(j,1,maxl-1){if (i+(1<<(j-1))>num) break;fo(k,1,n){b[i][j][k]=b[i][j-1][k]|b[i+(1<<(j-1))][j-1][k];bb[i][j][k]=bb[i][j-1][k]|bb[i+(1<<(j-1))][j-1][k];}}}fo(i,1,q){int l,r;scanf("%d%d",&l,&r);int tmp=(l-1)/ks+1,tmd=(r-1)/ks+1;make(tmp+1,tmd-1);if (tmp!=tmd){fo(j,l,tmp*ks) p[a[j][0]].set(a[j][1]),pp[a[j][1]].set(a[j][0]);fo(j,(tmd-1)*ks+1,r) p[a[j][0]].set(a[j][1]),pp[a[j][1]].set(a[j][0]);}else fo(j,l,r) p[a[j][0]].set(a[j][1]),pp[a[j][1]].set(a[j][0]);/*fo(i,1,n) cout<<p[i]<<endl;fo(i,1,n) cout<<pp[i]<<endl;*/kosarajo();printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/hiweibolu/p/6727057.html

相关文章:

Python基础16-模块与包基础01

目录 初识模块和包 Python常用的内置模块 关键字import和from import、from查找的路径 如何调用 __name__与模块执行 __name__的用法&#xff08;单元测试&#xff09; 初识模块和包 我们把功能相近或相关的py文件组成模块&#xff0c;这样分开写代码便于维护&#xff0c…

配置用户通过Telnet登录设备的身份认证(AAA本地认证)

背景信息 用户通过Telnet登录设备时&#xff0c;设备上必须配置验证方式&#xff0c;否则用户无法成功登录设备。设备支持不认证、密码认证和AAA认证三种用户界面的验证方式&#xff0c;其中AAA认证方式安全性最高。 采用AAA本地认证方式实现用户通过Telnet登录设备的身份认证&…

【自考】信息系统开发与管理(二)——章节详读

自考的第二阶段结束了&#xff0c;这一阶段是对书的详读过程。每章节读完&#xff0c;画一个导图。将其总结成一张网。织网的过程就是思考的过程。织网不断进行中……&#xff01;宏观方面&#xff1a;&#xff11;&#xff5e;&#xff13;章第一章 管理信息系统导论在研究一…

ios技术篇-CoreData

ios技术篇-CoreData 上一篇: iOS技术篇-CocoaPods 目录 下一篇&#xff1a;

中山大学计算机学院运动会,喜讯!我院获2019中大校运会教工组团体第二名

11月2日&#xff0c;中山大学2019年运动会在南校园举行&#xff0c;来自全校68个院系、附属医院、部门共3200余名师生参加比赛。由37名职工运动员组成的中山七院代表队参加教工组田径赛、趣味田径及球类等全部15项比赛&#xff0c;经过激烈角逐&#xff0c;最终以团体总分173分…

Python基础17-模块与包基础02、常用模块之time、random

目录 名字冲突与避免 设置BASE_DIR保证程序能找到模块位置 time random 名字冲突与避免 在test.py里写下面一段代码&#xff0c;用正则表达式包re进行匹配&#xff0c;匹配出123开头的字符。如果我们在test.py同级写一个re.py&#xff0c;那么Python解释器在进行导入时就会…

Hadoop学习笔记(1) ——菜鸟入门

&#xfeff;&#xfeff;Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么&#xff1f;先问一下百度吧&#xff1a; 【百度百科】一个分布式系统基础架构&#xff0c;由Apache基金会所开发。用户能够在不了解分布式底层细节的情况下。开发分布式程序。充分利用集群的威力进行快…

HTTP协议简介

HTTP协议HTTP协议简介 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在…

计算机组成原理读写周期波形图,第3章存储器层次结构-1讲述.ppt

第3章存储器层次结构-1讲述计算机组成原理 * 计算机组成原理 ——存储器层次结构(1) 2016-3-18 几个基本概念 1、存储器&#xff1a;计算机系统中的记忆设备&#xff0c;用来存放程序和数据。 2、存储元&#xff1a;存储器的最小组成单位&#xff0c;用以存储1位二进制代码。 3…

iOS架构篇-4 架构模式MVVM

iOS架构篇-4 架构模式MVVM MVVM原理MVVM 登录例子View:ViewModel:Model:如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!读者有什么想看的相关技术篇章,欢迎评论留言!QQ交流群:908058499MVVM原理 #mermaid-svg-s6n4t9QkR9OeNy45 .label{fon…

CV00-01-开篇与环境搭建

目录 Intro 环境搭建 TensorFlow搭建 PyTorch搭建 PaddlePaddle搭建 Intro 从今天起学习CV&#xff0c;为期6个月&#xff0c;以三个真实项目为背景学习CV。 目前是第一个项目——车道线检测。时间两个月&#xff08;共8周&#xff09;&#xff0c;每周五、周日晚上在线…

Spring MVC环境中的文件上传功能实现

在实际开发过程中&#xff0c;尤其是web项目开发&#xff0c;文件上传和下载的需求的功能非常场景&#xff0c;比如说用户头像、商品图片、邮件附件等等。其实文件上传下载的本质都是通过流的形式进行读写操作&#xff0c;而在开发中不同的框架都会对文件上传和下载有或多或少的…

iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署)

iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署) CI CI是指持续集成,代码的更新会定期自动构建、测试并合并到公共仓库中,方便多分支时解决冲突问题 CD CD是指持续交付和/或持续部署,开发人员改动代码会自动测试提交到仓库,运维实施人员将其部署到生产环境中,方便部…

计算机函数模式的用处是啥,请问怎么理解计算机中的函数?

你的理解有点外行看热闹的意思&#xff0c;呵呵。代码本身就是抽象的&#xff0c;所以“计算机中的函数是一种对代码进行抽象的方式”不能说不对&#xff0c;但是也和没说一样。至于“我们使用抽象出来的函数&#xff0c;而不用关心函数里面的代码是如何组织的”&#xff0c;只…

CV00-03-CV基本操作2

基本操作2 Similarity Transform相似变换 Similarity Transform相似变换&#xff1a;图像形状大小不变&#xff0c;位置发生变化。比如&#xff1a;做平移、旋转。相似变换具有保角性、保比例性&#xff0c;经过相似变换以后原有的角度和比例保持不变。确定一个相似变换矩阵需…

[LeetCode] [C++] 第一轮刷题总结(持续更新~~~)

LeetCode 解题报告 LC_1_解题报告LC_2_解题报告LC_3_解题报告LC_4_解题报告LC_5_解题报告LC_6_解题报告LC_7_解题报告LC_206_解题报告LC_237_解题报告LC_344_解题报告 LeetCode 1. Two Sum 解题思路&#xff1a;两次循环遍历数组&#xff0c;找到两个元素和等于target 注意点&…

Android Studio 在项目中引用第三方jar包

在Android Studio项目中引用第三方jar包的方法&#xff1a; 步骤&#xff1a; 1、在build.gradle文件中添加如下代码&#xff1a; 备注&#xff1a;要添加在Android作用域下 sourceSets {main {jniLibs.srcDirs [libs]}} 点击【Sync Now】&#xff0c;会生成jniLibs文件夹 找到…

android专栏目录

android专栏目录 Android基础篇 android专题-数据库room android专题-蓝牙扫描、连接、读写 Android专题-常用第三方框架 Android高级篇 Android架构篇-1 项目组织架构 Android架构篇-2 国际化多语言 Android架构篇-3 网络接口封装 Android架构篇-4 架构模式MVVM Android架…

东北大学计算机分数线2017,东北大学2017年本科一批录取分数线(全国)

东北大学2017年全国各省各批次集中录取时间为7月6日-27日&#xff0c;在各省录取结束的分批次分科类录取最低分将在本页面持续更新公布&#xff0c;考生录取结果可通过关注东北大学招生办官方微信公众号(neuzs-1923)录取专区查询&#xff0c;最终录取结果请以考生收到的录取通知…

CV00-04-卷积

卷积概念 由于不好进行文字描述&#xff08;懒&#xff09;&#xff0c;我直接推荐一个博客图像卷积&#xff0c;讲解图像卷积的概念。 图像卷积操作&#xff08;convolution&#xff09;&#xff0c;或称为核操作&#xff08;kernel&#xff09;&#xff0c;是进行图像处理的…

unity项目build成webgl时选择生成目录(解决方法)

在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Build不要勾选&#xff1a;点击build后会让你选择生成的目录&#xff0c;此处要慎重选择&#xff0c;否则会报错&#xff01; 不要选择到项目所在目录&#…

STL中的nth_element()方法的使用

STL中的nth_element()方法的使用 通过调用nth_element(start, startn, end) 方法可以使第n大元素处于第n位置&#xff08;从0开始,其位置是下标为 n的元素&#xff09;&#xff0c;并且比这个元素小的元素都排在这个元素之前&#xff0c;比这个元素大的元素都排在这个元素之后&…

Android架构篇-2 国际化多语言

Android架构篇-2 国际化多语言 实现功能: 1.默认采用系统语言 2.语言切换后实时生效 3.支持中英文 4.我的->设置->切换语言 思路:app首次初始设置为系统语言,用户在app内切换语言时发送语言切换事件,刷新所有页面 在AppBaseActivity、AppBaseFragment通过EventB…

齐鲁工业大学计算机读研,齐鲁工业大学考研难吗

齐鲁工业大学考研难吗&#xff1f;1、齐鲁工业大学考研难度算是比较容易。不在大学考研难度排名前100名单之内。2、考研究生难易程度还是看招生院校的地域、名气、排名等因素&#xff0c;生源不同&#xff0c;竞争力度也不同。发达地区特别是像北京&#xff0c;上海这样的大城市…

Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等

目录 os、os.path sys json pickle、shelve、xml、re、logging、configparse、hashlib未完待续…… os、os.path Python的os模块里面定义了常用的路径、文件操作。 os.curdir # curdir相对路径的当前路径“点” os.pardir # pardir相对路径的父目录“点点”。 os.sep …

剑指offer 重建二叉树 python

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 样例 输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} 返回二叉树头节点想法&#xff1a; 使用递归&#xff0c;既…

C#中的Liststring泛型类示例

在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时&#xff0c;List<string>泛型类是一个用于存储一系列字 符串(strings)的极其优秀的解决办法。下面一起有一些List<string>泛型类的示例&#xff0c;一起来看看吧。 List示例 下面是一个使用C#创建一个…

计算机检索的优点,专利检索与分析系统拥有哪些优势?

专利检索与分析系统拥有哪些优势&#xff1f;现在很多朋友都在了解专利检索与分析系统又有哪些优势&#xff0c;因为他们需要使用这些系统&#xff0c;不少朋友都会利用业余时间搞各种发明专利&#xff0c;并申请发明专利&#xff0c;在申请之前&#xff0c;人们就需要对专利进…

Android架构篇-1 项目组织架构

Android架构篇-1 项目组织架构 模块化分层 1.结构清晰,各模块代码分离,符合高内聚低耦合,快速定位查找代码 2.团队协作开发灵活,互不影响,各模块完成后合并即可完成整体app 3.抽离公共层、模块层、业务层,方便维护管理 分层架构图 App下的Home(首页)、Mine(我的)、Log…

Python基础19-面向对象基础

目录 面向对象概述 面向对象的一种实现 类的相关知识 对象的相关知识 面向对象属性的查改增删操作 类属性的查改增删 对象属性的查改增删 关于类、对象属性容易混淆额或忽略的地方的说明 面向对象概述 编程发展至今有面向过程编程、函数式编程、面向对象编程三大流派&…