[loj3501]图函数
$f(i,G)_{x}$为$x$对$i$是否有贡献,即在枚举到$x$时,$i$与$x$是否强连通
事实上,$f(i,G)_{x}=1$即不经过$[1,x)$中的点且$i$与$x$强连通
首先,当存在这样的路径,即使$[1,x)$中的点全部删除两者也仍然强连通(有贡献)
同时,若不存在这样的路径,考虑任意两条$i$到$x$和$x$到$i$的路径$P_{1}$和$P_{2}$,对于$P_{1}$和$P_{2}$中编号最小的点$y$,即证明若$y<x$,则其在枚举到$x$时必然被删去
不妨假设$y$在$P_{1}$中,当枚举到$y$时显然存在走$P_{1}$从$i$到$y$的路径,以及$y$到$i$的路径(先走$P_{1}$从$y$到$i$,再走$P_{2}$从$x$到$i$),那么$y$即会被删除
综上,也就证明了前面的结论
考虑对于确定的$i$和$x$,满足$f(i,G_{j})_{x}=1$的$j$必然是一个前缀,下面求出这个前缀——
令$d(i,x,y)$表示从$i$到$x$不经过$[1,y]$的所有路径中,经过的编号最小值的最大值,那么这个前缀的范围即$[0,\min(d(i,x,x-1),d(x,i,x-1)))$,差分统计即可
(特别的,为了方便,定义$d(i,i,x)$为$m+1$)
下面考虑如何求出$d(i,x,y)$,显然其与最短路类似,且定义又与Floyd的过程相同,即从大到小枚举中转点来转移即可,复杂度为$o(n^{3}+m)$
也可以暴力计算,即枚举$x$并删去这些点,以$x$为起点对原图和反图分别求一次,同样可以用dijkstra等最短路算法,即可做到$o(nm\log n)$的复杂度
上述两种算法复杂度并不正确,但常数优秀都可以通过
下面给出两份被卡常数的代码,分别是44(Floyd)和80(Dijkstra)
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define M 300005
5 int n,m,x,y,tot[M],f[N][N];
6 int main(){
7 scanf("%d%d",&n,&m);
8 memset(f,-1,sizeof(f));
9 for(int i=1;i<=n;i++)f[i][i]=m+1;
10 for(int i=1;i<=m;i++){
11 scanf("%d%d",&x,&y);
12 f[x][y]=i;
13 }
14 for(int i=n;i;i--){
15 for(int j=1;j<=n;j++)
16 for(int k=1;k<=n;k++)
17 if ((f[j][i]>0)&&(f[i][k]>0))f[j][k]=max(f[j][k],min(f[j][i],f[i][k]));
18 for(int j=i;j<=n;j++)
19 if ((f[i][j]>0)&&(f[j][i]>0))tot[min(f[i][j],f[j][i])-1]++;
20 }
21 for(int i=m;i;i--)tot[i-1]+=tot[i];
22 for(int i=0;i<=m;i++)printf("%d ",tot[i]);
23 }
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define M 200005
5 struct Edge{
6 int nex,to,len;
7 }edge[M<<1];
8 priority_queue<pair<int,int> >q;
9 int E,n,m,x,y,head[2][N],d[2][N],vis[N],tot[M];
10 void add(int p,int x,int y,int z){
11 edge[E].nex=head[p][x];
12 edge[E].to=y;
13 edge[E].len=z;
14 head[p][x]=E++;
15 }
16 void calc(int p,int st){
17 memset(d[p],-1,sizeof(d[p]));
18 memset(vis,0,sizeof(vis));
19 d[p][st]=m+1;
20 q.push(make_pair(d[p][st],st));
21 while (!q.empty()){
22 int k=q.top().second;
23 q.pop();
24 if (vis[k])continue;
25 vis[k]=1;
26 for(int i=head[p][k];i!=-1;i=edge[i].nex)
27 if ((edge[i].to>=st)&&(d[p][edge[i].to]<min(d[p][k],edge[i].len))){
28 d[p][edge[i].to]=min(d[p][k],edge[i].len);
29 q.push(make_pair(d[p][edge[i].to],edge[i].to));
30 }
31 }
32 }
33 int main(){
34 scanf("%d%d",&n,&m);
35 memset(head,-1,sizeof(head));
36 for(int i=1;i<=m;i++){
37 scanf("%d%d",&x,&y);
38 add(0,x,y,i);
39 add(1,y,x,i);
40 }
41 for(int i=1;i<=n;i++){
42 calc(0,i),calc(1,i);
43 for(int j=i;j<=n;j++)
44 if ((d[0][j]>0)&&(d[1][j]>0))tot[min(d[0][j],d[1][j])-1]++;
45 }
46 for(int i=m;i;i--)tot[i-1]+=tot[i];
47 for(int i=0;i<=m;i++)printf("%d ",tot[i]);
48 }
事实上,还可以做到更优秀的复杂度,回到最初的结论
考虑先枚举$x$,并倒序加边,之后维护有多少个点$i$与$x$强连通即可
强连通即分为两部分,即$x$能到达$i$与$i$能到达$x$,且对于每一个具有单调性,即至多修改一次,因此只需要每一次能够快速找到修改的点即可(以下先考虑前者)
假设加入边$(a,b)$,若$a<x$或$b<x$显然无意义,否则分类讨论:
1.若$x$不能到达$a$或$x$能到达$b$,即目前不影响答案,但其会在以后影响答案,即加入边集
2.若$x$能到达$a$但不能到达$b$,从$b$开始dfs搜索,且在经过一条边后删除其
(关于这一做法的正确性:当一条边被经过后,若其内部没有加边显然没有再搜索的意义,而加边不妨直接对其子树内部搜索即可)
对于$i$能否到达$x$,对其反图做同样的过程即可
此时,对于每一条边仅被搜索一次,复杂度即为$o(nm)$,可以通过
另外由于常数问题,建议使用bfs,且这份代码也只能在洛谷上通过(常数问题)
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define M 200005
5 struct Edge{
6 int nex,to,len;
7 }edge[M<<1];
8 priority_queue<pair<int,int> >q;
9 int E,n,m,x,y,head[2][N],d[2][N],vis[N],tot[M];
10 void add(int p,int x,int y,int z){
11 edge[E].nex=head[p][x];
12 edge[E].to=y;
13 edge[E].len=z;
14 head[p][x]=E++;
15 }
16 void calc(int p,int st){
17 memset(d[p],-1,sizeof(d[p]));
18 memset(vis,0,sizeof(vis));
19 d[p][st]=m+1;
20 q.push(make_pair(d[p][st],st));
21 while (!q.empty()){
22 int k=q.top().second;
23 q.pop();
24 if (vis[k])continue;
25 vis[k]=1;
26 for(int i=head[p][k];i!=-1;i=edge[i].nex)
27 if ((edge[i].to>=st)&&(d[p][edge[i].to]<min(d[p][k],edge[i].len))){
28 d[p][edge[i].to]=min(d[p][k],edge[i].len);
29 q.push(make_pair(d[p][edge[i].to],edge[i].to));
30 }
31 }
32 }
33 int main(){
34 scanf("%d%d",&n,&m);
35 memset(head,-1,sizeof(head));
36 for(int i=1;i<=m;i++){
37 scanf("%d%d",&x,&y);
38 add(0,x,y,i);
39 add(1,y,x,i);
40 }
41 for(int i=1;i<=n;i++){
42 calc(0,i),calc(1,i);
43 for(int j=i;j<=n;j++)
44 if ((d[0][j]>0)&&(d[1][j]>0))tot[min(d[0][j],d[1][j])-1]++;
45 }
46 for(int i=m;i;i--)tot[i-1]+=tot[i];
47 for(int i=0;i<=m;i++)printf("%d ",tot[i]);
48 }
[loj3501]图函数的更多相关文章
- matlab读图函数
最基本的读图函数:imread imread函数的语法并不难,I=imread('D:\fyc-00_1-005.png');其中括号内写图片所在的完整路径(注意路径要用单引号括起来).I代表这个图片 ...
- JavaScript思维导图—函数基础
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/
- Django--视图函数views
1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...
- django3-视图函数进阶
1.视图函数的分类 FBV(fucntion base view) CBV(class base view) ,CBV根据定义的方法名 ,判断什么请求执行什么函数 2.FBV转换CBV (不太对劲) ...
- Django--视图函数
目录 视图函数 HttpRequest对象 request属性 request常用方法 HttpResponse对象 render() redirect() JsonResponse 视图函数 一个视 ...
- Django-05-视图函数
http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...
- Django-视图函数view
目录 1.Django的视图函数view 1.1一个简单的视图 2.CBV和FBV 3.使用Mixin(了解) 4.给视图加装饰器 4.1使用装饰器装饰FBV 4.2使用装饰器装饰CBV 5.requ ...
- Django-视图函数/模板渲染/过滤器
一.Django的视图函数 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个 ...
- MATLAB 颜色图函数(imagesc/scatter/polarPcolor/pcolor)
2维的热度图 imagesc imagesc(x, y, z),x和y分别是横纵坐标,z为值,表示颜色 imagesc(theta,phi,slc); colorbar xlabel(); ylabe ...
随机推荐
- NOIP模拟74
前言 我就想说一句,T3 给了一个什么牛马大样例!!!!!!!!,气\(^{TM}\)死我!!!!!!! 我的 \(\mathcal{O}(n)\) 算法始终过不掉大样例我 TM ,要不然我就直接上矩 ...
- 题解「BZOJ4310」跳蚤
题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...
- allure报告中allure.title 如何去掉后方的参数化显示
1.解决方法如下 listener.py 文件位置:Lib\site-packages\allure_pytest\listener.py (第三方包所在的LIb目录) 将下图中红色部分test_re ...
- GIS应用|快速开发REST数据服务
随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...
- MC-BE基岩版服务器搭建与日常维护
有部分内容被csdn和谐,强烈建议移步我的个人博客以获得更好的排版和阅读体验: xzajyjs.cn. 目录 环境搭建 开始部署 日常维护 服务器的白名单机制 定时备份 服务器升级 服务器模组安装 搭 ...
- Python学习系列之一: python相关环境的搭建
前言 学习python和使用已经一年多了,这段时间抽空整理了一下以前的笔记,方便日后查阅. Python介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Pytho ...
- 6月6日 Scrum Meeting
日期:2021年6月6日 会议主要内容概述: 删除模板选择页面,画图页面新增模板选择 保存时后端判重 后端要新增数据分享url 主题色->lxd:画图教程->lsp:表格数据分析-> ...
- [no_code团队]项目介绍 & 需求分析 & 发布预测
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 团队项目选择 我们在这个课程的目标是 在团队合作中提升软件开发水平 这个作业在哪个具体方面帮助我们实现目标 进行项目 ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- hdu 1856 More is better(并查集)
题意: Mr Wang wants some boys to help him with a project. Because the project is rather complex, the m ...