BZOJ4643 : 卡常大水题
将边按权值$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 : 卡常大水题的更多相关文章
- BZOJ4643 卡常大水题 【Tarjan】
题目分析: 给所有边按A排序,依次加入再按B递增排序,势能分析可以发现是O(n^4)的 代码: #include<bits/stdc++.h> using namespace std; ; ...
- bzoj5210最大连通子块和 (动态dp+卡常好题)
卡了一晚上,经历了被卡空间,被卡T,被卡数组等一堆惨惨的事情之后,终于在各位大爹的帮助下过了这个题qwqqq (全网都没有用矩阵转移的动态dp,让我很慌张) 首先,我们先考虑一个比较基础的\(dp\) ...
- NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」
工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...
- Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)
题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...
- [CSP-S模拟测试]:卡常题/b(基环树+DP)
题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- 第三届山西省赛1004 一道大水题(scanf)
一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...
- [luogu T71973]卡常者π酱
[luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...
- 【xsy1120】 支援(assist) dp+卡常
妙啊算错时间复杂度了 题目大意:给你一棵$n$个节点的二叉树,每个节点要么是叶子节点,要么拥有恰好两个儿子. 令$m$为叶子节点个数,你需要在这棵二叉树中选择$i$个叶子节点染色,叶节点染色需要一定的 ...
随机推荐
- 【转】精选30个优秀的CSS技术和实例
今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...
- Google Map API V3开发(6) 代码
Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...
- Pjax调用
$.pjax({container:'#content_center',url:href,data:data}); $(document).on('pjax:send', function() {// ...
- Unslider.js Tiny Sample
<!-- The HTML --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&g ...
- Sql Server 分区演练 【转】
Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name ...
- 使用Spring和SpringMVC管理bean时要注意的一个小细节
最近一直在做毕业设计...用到了Shiro和SpringMVC..用过shiro的朋友都知道shiro需要自己去写Realm,然后把Realm注入到SecurityManager中.而Security ...
- Ubuntu下su被拒绝
ubuntu@ubuntu:~$ sudo passwd root输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:已成功更新密码前提是你肯定得知道当前用户的密码. 然后登录: ...
- PHP 连接 MySQL
PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...
- sql中case when语句的使用-来自网摘文章
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- struts2 用if标签判断字符串包含
String testStr = "用来判断是否包含的字符串"; <s:property value="testStr"/> <s:if te ...