将边按权值$A$从小到大排序,从小到大枚举$\max(A)$,然后双指针从大到小枚举$\max(B)$。

按权值$B$用大根堆维护所有已经加入的边,每次$\max(B)$减少时,不断取出权值$B$最大的边看看是否需要删除即可。

那么只需要检验这个图是否只有一个强连通分量。

考虑使用Kosaraju算法,维护一个未走过的点的集合,每次与出边表取交之后递归搜索可行后继点。

这显然可以用bitset来并行计算,时间复杂度单次$O(\frac{n^2}{32})$。

总时间复杂度$O(\frac{n^4}{32}+n^2\log n)$。

#include<cstdio>
#include<algorithm>
#include<queue>
#define N 155
using namespace std;
typedef unsigned int U;
typedef pair<int,int>P;
typedef pair<int,P>PI;
int n,i,j,k,m,b[N][N],eb[N*N],q[N],t,ans=~0U>>1;priority_queue<PI>Q;
struct E{int x,y,w;E(){}E(int _x,int _y,int _w){x=_x,y=_y,w=_w;}}ea[N*N];
inline bool cmp(const E&a,const E&b){return a.w<b.w;}
struct BIT{
U v[5];
void flip(int x){v[x>>5]^=1U<<(x&31);}
int get(int x){return v[x>>5]>>(x&31)&1;}
}g0[N],g1[N],v;
inline void addedge(int x,int y){
if(x==y||b[x][y]>eb[j])return;
Q.push(PI(b[x][y],P(x,y)));
g0[x].flip(y);
g1[y].flip(x);
}
inline void deledge(int x,int y){
g0[x].flip(y);
g1[y].flip(x);
}
void dfs1(int x){
v.flip(x);
for(int i=0;i<5;i++)while(1){
U o=v.v[i]&g0[x].v[i];
if(!o)break;
dfs1(i<<5|__builtin_ctz(o));
}
q[++t]=x;
}
void dfs2(int x){
v.flip(x);
for(int i=0;i<5;i++)while(1){
U o=v.v[i]&g1[x].v[i];
if(!o)break;
dfs2(i<<5|__builtin_ctz(o));
}
}
inline bool check(){
int i;
for(i=0;i<5;i++)v.v[i]=0;
for(i=0;i<n;i++)v.flip(i);
for(t=i=0;i<n;i++)if(v.get(i))dfs1(i);
for(i=0;i<n;i++)v.flip(i);
dfs2(q[t]);
for(i=0;i<5;i++)if(v.v[i])return 0;
return 1;
}
void solve(){
sort(ea+1,ea+m+1,cmp);
sort(eb+1,eb+m+1);
for(i=1,j=m;i<=m;i++){
addedge(ea[i].x,ea[i].y);
while(ea[i].w+eb[j]>=ans||check()){
ans=min(ans,ea[i].w+eb[j]);
if(!(--j))return;
while(!Q.empty()){
PI t=Q.top();
if(t.first<=eb[j])break;
Q.pop();
deledge(t.second.first,t.second.second);
}
}
}
}
int main(){
scanf("%d",&n);
for(m=i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&k),ea[++m]=E(i,j,k);
for(m=i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&b[i][j]),eb[++m]=b[i][j];
solve();
return printf("%d",ans),0;
}

  

BZOJ4643 : 卡常大水题的更多相关文章

  1. BZOJ4643 卡常大水题 【Tarjan】

    题目分析: 给所有边按A排序,依次加入再按B递增排序,势能分析可以发现是O(n^4)的 代码: #include<bits/stdc++.h> using namespace std; ; ...

  2. bzoj5210最大连通子块和 (动态dp+卡常好题)

    卡了一晚上,经历了被卡空间,被卡T,被卡数组等一堆惨惨的事情之后,终于在各位大爹的帮助下过了这个题qwqqq (全网都没有用矩阵转移的动态dp,让我很慌张) 首先,我们先考虑一个比较基础的\(dp\) ...

  3. NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

    工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  4. Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)

    题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...

  5. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

  6. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  7. 第三届山西省赛1004 一道大水题(scanf)

    一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...

  8. [luogu T71973]卡常者π酱

    [luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...

  9. 【xsy1120】 支援(assist) dp+卡常

    妙啊算错时间复杂度了 题目大意:给你一棵$n$个节点的二叉树,每个节点要么是叶子节点,要么拥有恰好两个儿子. 令$m$为叶子节点个数,你需要在这棵二叉树中选择$i$个叶子节点染色,叶节点染色需要一定的 ...

随机推荐

  1. php常用数组函数小结

    count函数 作用:计算数组中元素的个数或对象的属性个数 返回值: 数组或者对象, 返回数组的单元个数或者对象的属性个数 Null,返回0 非数组,也非NULL,通通返回1 <?php $ar ...

  2. 获取centos6.5系统信息脚本

    最近想尝试做两件比较重要的事情,第一是用python写个cmdb,第二还是用python写个小型监控系统,下面是获取系统信息的脚本: #!/usr/bin/env python # coding:ut ...

  3. storyboard传值方式

    通过segue传值 在storyboard设置segue的Identifier   segue是连接两个视图控制器交互的线 sender是触发这个方法执行的对象,比如是单击tableView上的cel ...

  4. [NHibernate]HQL查询

    目录 写在前面 文档与系列文章 查询的几种方式 HQL查询 一个例子 总结 写在前面 上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这 ...

  5. postgresql利用pg_upgrade升级数据库(从8.4升级到9.5)

    其他见:http://my.oschina.net/ensn/blog/636766 本文利用pg_upgrade实现将8.4.18版本升级到9.5.0版本,8.4.18版本为RedHat系统自带pg ...

  6. noip2015 运输计划

    描述 公元 2044 年,人类进入了宇宙纪元.L 国有 nn 个星球,还有 n−1n−1 条双向航道,每条航道建立在两个星球之间,这 n−1n−1 条 航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  7. linuxmint 17安装qt5.3.1

    从官方网站上下载的安装包,双击安装即可. 新建项目编译时,出现错误:cannot find -lGL 解决的方法:安装libgl1-mesa-dev,当然在安装时会安装其他的一些依赖包 在命令行中输入 ...

  8. Linux设置Memcached开机启动

    Memcached开机启动方式 方法一: 在 /etc/rc.d/rc.local 文件中追加启动命令 /usr/local/memcached/bin/memcached  -u root -d - ...

  9. what's cloud computing? IaaS

    Cloud computing has changed the ITC industry. Companies like Amazon, Google and Microsoft have built ...

  10. Spring Data JPA @EnableJpaRepositories配置详解

    @EnableJpaRepositories注解用于Srping JPA的代码配置,用于取代xml形式的配置文件,@EnableJpaRepositories支持的配置形式丰富多用,本篇文章详细讲解. ...