BZOJ4643 卡常大水题 【Tarjan】
题目分析:
给所有边按A排序,依次加入再按B递增排序,势能分析可以发现是O(n^4)的
代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn = ;
- const int maxm = ;
- int n,cl,dfn[maxn],low[maxn];
- struct edge{int u,v,w1,w2;}edges[maxm];
- vector <int> g[maxn];
- int cmp(edge alpha,edge beta){return alpha.w1 < beta.w1;}
- set<pair<int,pair<int,int> > > st;
- void Tarjan(int now){
- low[now] = dfn[now] = ++cl;
- for(int i=;i<g[now].size();i++){
- int t = g[now][i];
- if(dfn[t]) low[now] = min(low[now],dfn[t]);
- else{Tarjan(t); low[now] = min(low[now],low[t]);}
- }
- }
- int chk(){// to check if it is Strong Connect Graph
- cl = ;
- for(int i=;i<=n;i++) low[i] = dfn[i] = ;
- Tarjan();
- for(int i=;i<=n;i++) if(low[i] == dfn[i]) return ;
- return ;
- }
- void read(){
- scanf("%d",&n);
- for(int i=;i<=n;i++) for(int j=;j<=n;j++){
- int x; scanf("%d",&x);
- edges[n*(i-)+j]=(edge){i,j,x,};
- }
- for(int i=;i<=n;i++) for(int j=;j<=n;j++) {
- int x; scanf("%d",&x);
- edges[n*(i-)+j].w2 = x;
- }
- sort(edges+,edges+n*n+,cmp);
- }
- void work(){
- int ans = 2e9;
- int flag = ,lstans = ;
- for(int i=;i<=n*n;i++){
- if(edges[i].u == edges[i].v) continue;
- int bb = edges[i].w1;
- if(flag&&lstans < edges[i].w2) continue;
- st.insert(make_pair(edges[i].w2,make_pair(edges[i].u,edges[i].v)));
- g[edges[i].u].push_back(edges[i].v);
- if(!flag){
- if(chk()){
- set<pair<int,pair<int,int> > >::iterator it = st.end();
- it--;
- lstans = (*it).first;
- flag = ;
- ans = min(ans,lstans+bb);
- }
- continue;
- }
- while(true){
- set<pair<int,pair<int,int> > >::iterator it = st.end();
- it--;int u = (*it).second.first,v = (*it).second.second;
- for(int i=;i<g[u].size();i++){
- if(g[u][i] == v){
- swap(g[u][i],g[u][g[u].size()-]);
- g[u].pop_back();
- break;
- }
- }
- if(chk()){
- st.erase(it);
- }else {g[u].push_back(v);break;}
- }
- set<pair<int,pair<int,int> > >::iterator it = st.end();
- it--;lstans = (*it).first;
- ans = min(ans,(*it).first+bb);
- }
- printf("%d\n",ans);
- }
- int main(){
- read();
- work();
- return ;
- }
BZOJ4643 卡常大水题 【Tarjan】的更多相关文章
- BZOJ4643 : 卡常大水题
将边按权值$A$从小到大排序,从小到大枚举$\max(A)$,然后双指针从大到小枚举$\max(B)$. 按权值$B$用大根堆维护所有已经加入的边,每次$\max(B)$减少时,不断取出权值$B$最大 ...
- 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$个叶子节点染色,叶节点染色需要一定的 ...
随机推荐
- JMeter 内置日期(时间)函数总结
JMeter 内置日期(时间)函数总结 by:授客 QQ:1033553122 1. 测试环境 apache-jmeter-3.3 下载地址: http://jmeter.apache.org/c ...
- Spring容器
1.Spring简介: a)Spring春天 b)官网:https://spring.io c)设计理念:轮子理念,不要重复创造轮子: d)Spring可以被理解为一个容器,用于管理其他的框架: e) ...
- ASP.NET没有魔法——ASP.NET MVC IoC代码篇
上一篇文章主要以文字的形式介绍了IoC及其在ASP.NET MVC中的使用,本章将从以下几点介绍如何使用代码在ASP.NET MVC中实现依赖注入: ● AutoFac及安装 ● 容器的创建 ● 创建 ...
- MySQL常用数值函数
数值函数: 用来处理很多数值方面的运算,使用数值函数,可以免去很多繁杂的判断求值的过程,能够大大提高用户的工作效率. 1.ABS(x):返回 x 的绝对值 mysql> select abs(- ...
- 尝试Java,从入门到Kotlin(下)
上篇已提(tu)到(cao)Java中的各种坑.习惯了C#的各种特性和语法糖后,再转到Java感觉比较别扭.最后本着反正Java也不是很熟悉,干脆再折腾折腾其他语言的破罐子破摔的心态,逛了一圈JVM语 ...
- GDB 显示别的文件;在别文件打断点;执行到函数末尾;跳出当前函数
显示别的文件:l "文件名.后缀名":行号 在别文件打断点:b "文件名.后缀名":行号 执行到函数末尾:finish 跳出当前函数(当前位置到函数的末尾不被执 ...
- javascript弹出模态窗体
function openwindow(url,name,iWidth,iHeight){ //获得窗口的垂直位置 var iTop = (window.screen.availHeight-30-i ...
- python3 str(字符串)
__add__函数 (在后面追加字符串) s1 ='Hello' s2 = s1.__add__(' boy!') print(s2) #输出:Hello boy! __contains__(判断是否 ...
- git 命令添加整个文件夹以及文件夹下的内容
对于一个文件夹提交到服务器上,喜欢用 git add .(后面为".") 这种情况对于一个文件夹的还是很有用的,但出现了多个不同文件夹后,要分别提交就不能这么用了, 可以使用如下指 ...
- SQLServer数据库差异备份
差异备份 (differential backup)定义 一种数据备份,基于完整数据库或部分数据库或一组数据文件或文件组(差异基准)的最新完整备份,并且仅包含自确定差异基准以来发生更改的数据. 使用S ...