将边按权值$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)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #define N 155
  5. using namespace std;
  6. typedef unsigned int U;
  7. typedef pair<int,int>P;
  8. typedef pair<int,P>PI;
  9. int n,i,j,k,m,b[N][N],eb[N*N],q[N],t,ans=~0U>>1;priority_queue<PI>Q;
  10. struct E{int x,y,w;E(){}E(int _x,int _y,int _w){x=_x,y=_y,w=_w;}}ea[N*N];
  11. inline bool cmp(const E&a,const E&b){return a.w<b.w;}
  12. struct BIT{
  13. U v[5];
  14. void flip(int x){v[x>>5]^=1U<<(x&31);}
  15. int get(int x){return v[x>>5]>>(x&31)&1;}
  16. }g0[N],g1[N],v;
  17. inline void addedge(int x,int y){
  18. if(x==y||b[x][y]>eb[j])return;
  19. Q.push(PI(b[x][y],P(x,y)));
  20. g0[x].flip(y);
  21. g1[y].flip(x);
  22. }
  23. inline void deledge(int x,int y){
  24. g0[x].flip(y);
  25. g1[y].flip(x);
  26. }
  27. void dfs1(int x){
  28. v.flip(x);
  29. for(int i=0;i<5;i++)while(1){
  30. U o=v.v[i]&g0[x].v[i];
  31. if(!o)break;
  32. dfs1(i<<5|__builtin_ctz(o));
  33. }
  34. q[++t]=x;
  35. }
  36. void dfs2(int x){
  37. v.flip(x);
  38. for(int i=0;i<5;i++)while(1){
  39. U o=v.v[i]&g1[x].v[i];
  40. if(!o)break;
  41. dfs2(i<<5|__builtin_ctz(o));
  42. }
  43. }
  44. inline bool check(){
  45. int i;
  46. for(i=0;i<5;i++)v.v[i]=0;
  47. for(i=0;i<n;i++)v.flip(i);
  48. for(t=i=0;i<n;i++)if(v.get(i))dfs1(i);
  49. for(i=0;i<n;i++)v.flip(i);
  50. dfs2(q[t]);
  51. for(i=0;i<5;i++)if(v.v[i])return 0;
  52. return 1;
  53. }
  54. void solve(){
  55. sort(ea+1,ea+m+1,cmp);
  56. sort(eb+1,eb+m+1);
  57. for(i=1,j=m;i<=m;i++){
  58. addedge(ea[i].x,ea[i].y);
  59. while(ea[i].w+eb[j]>=ans||check()){
  60. ans=min(ans,ea[i].w+eb[j]);
  61. if(!(--j))return;
  62. while(!Q.empty()){
  63. PI t=Q.top();
  64. if(t.first<=eb[j])break;
  65. Q.pop();
  66. deledge(t.second.first,t.second.second);
  67. }
  68. }
  69. }
  70. }
  71. int main(){
  72. scanf("%d",&n);
  73. for(m=i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&k),ea[++m]=E(i,j,k);
  74. for(m=i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&b[i][j]),eb[++m]=b[i][j];
  75. solve();
  76. return printf("%d",ans),0;
  77. }

  

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. diff 比较两个文件的差异

    功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...

  2. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  3. 使用safari对webview进行调试

    在web开发的过程中,抓包.调试页面样式.查看请求头是很常用的技巧.其实在iOS开发中,这些技巧也能用(无论是模拟器还是真机),不过我们需要用到mac自带的浏览器Safari.所以,本文将讲解如何使用 ...

  4. 再谈 $* 和 $@ 在 Bash 中的表现

    除非特别说明,本文中出现的 Shell 均指 Bash 4.3.首先说一个基础知识:Shell 中的变量在展开成值(Parameter Expansion)之后,这个值在某些上下文(Context)中 ...

  5. Qt、VTK配置常见问题

    QVTKWidget undefined reference to 问题,一定要在pro文件中添加库 libvtkGUISupportQt-6.3. 2. CMAKE_MAKE_PROGRAM     ...

  6. 初次使用并安装express

    安装 Nodejs 去Nodejs官网根据自己的操作系统下载对应的安装包并安装.我们就有了NodeJS和npm环境.npm是Node的包管理工具,会在安装NodeJS时一并安装.可以用以下命令查看版本 ...

  7. JavaScript——基本的瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  8. 守护神 Supervisor

    参考: http://linbo.github.io/2013/04/04/supervisor/ http://www.restran.net/2015/10/04/supervisord-tuto ...

  9. ABAP 客户报表

    *&---------------------------------------------------------------------* *& Report  ZSDR014 ...

  10. jwplayer播放器停止 单页内多个jwplayer对象停止问题

    单页内多个jwplayer对象停止问题,一直没有找到单页内多个jwplayer播放器停止问题,点击其中一个停止其他播放器; 整个播放代码Remove(),这样就可以停止了,也在ie下防止暂停不了.重音 ...