将边按权值$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. ThinkPHP真正疑难问题笔记

    如何选择线程安全版本还是非线程安全版本: http://www.cnblogs.com/Alight/p/3389113.html(看webserver处理请求时, 使用的是多线程的方式还是 多进程的 ...

  2. PHP系统声明式事务处理

    转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...

  3. UGUI 学习笔记

    1.UGUI中是没有depth的概念,那要怎么在脚本中动态的改变一个UI元素在hierarchy中的排序位置呢? 放到最上面 Transform.SetAsFirstSibling最下面Transfo ...

  4. can't debug windows service in win7 64bit

    if encount below error: Solution: run the command “vsdiag_regwcf.exe -i” as admin in C:\Program File ...

  5. 【C语言入门教程】目录/大纲

    第一章 C语言编程基础 1.1 基本程序结构 1.2 函数库 和 链接 1.3 C语言“32个”关键字 第二章 数据类型.运算符和表达式 2.1 数据类型(5种基本数据类型),聚合类型与修饰符 2.2 ...

  6. 设计模式--5.5 代理模式-通用代码及aop

    1.通用代码 (1)Subjects package com.design.代理模式.通用代码; public interface Subject { void request(); } (2)Rea ...

  7. 2016年11月28日--ADO.Net 增、删、改、查

    数据访问 对应命名空间:System.Data.SqlClient; SqlConnection:连接对象SqlCommand:命令对象SqlDataReader:读取器对象 CommandText: ...

  8. JQuery mobile中按钮自定义属性的改变

    1..ui-mobile-viewport是jquery mobile默认给body加的class,这样的话包含选择符优先级高一点 <style> .ui-mobile-viewport ...

  9. linux下添加mysql用户并授权

    -------------------暂停mysqlservice mysqld stop 忘记密码修改流程1,修改mysql配置文件 /etc/my.cnf,在[mysqld]下添加一行skip-g ...

  10. 一款全兼容的播放器 videojs

    [官网]http://www.videojs.com/ videojs就提供了这样一套解决方案,他是一个兼容HTML5的视频播放工具,早期版本兼容所有浏览器,方法是:提供三个后缀名的视频,并在不支持h ...