题解:P6898 [ICPC 2014 WF] Metal Processing Plant

news/2025/3/26 16:15:56/文章来源:https://www.cnblogs.com/Kenma/p/18790006

前言

来自山西队爷的分享题。

思路分析

首先有一个朴素的想法,能否枚举两个集合的边权,判断是否合法。

发现是可以的。

具体地,我们设 \(D(A)=w_1,D(B)=w_2\),不失一般性,假设 \(w_1 \ge w_2\)

这样,我们可以把图上的边 \((x,y,w)\) 分成三类:

  • \(w \le w_2\):没有影响;

  • \(w2<w\le w_1\)\(x,y\) 不能同时在 \(B\) 集合中;

  • \(w>w_1\)\(x,y\) 不能同时在一个集合中。

发现限制很像一个 2-sat 问题,考虑将 \(x\) 拆成 \(x',x\),分别表示在 \(A,B\) 集合中。

  • 对于不能同时在 \(B\) 集合的点,\(x\to y'\)\(y \to x'\)

  • 对于不能同时在一个集合中的点,\(x\to y'\)\(y\to x'\)\(x' \to y\)\(y' \to x\)

然后直接 tarjan 判定是否合法。

复杂度 \(O(n^6)\)

能不能再给力一点啊?

大胆猜测单调性,也就是 \(w_1\) 递增时,合法的 \(w_2\) 递减,这样可以双指针维护。

复杂度 \(O(n^4)\)

能不能再给力一点啊?

考虑对于不能在同一个集合的限制,实际上也太严苛了。

考虑从大到小枚举 \(w_1\),二分求出 \(w_2\) 的过程中,我们在线维护 \(w \ge w_1\) 的边的连通性,如果当前边连上出现环,分类讨论:

  • 如果是奇环,那么以后所有的边都加不进去了,考虑做完这次直接终止;

  • 如果是偶环,那么图的联通性并没有改变,二分出的 \(w_2\) 结果不会改变,直接更新答案就行。

判断环的奇偶性可以带权并查集。

分析我们的复杂度,我们本质不同的 \(w_1\) 只有 \(O(n)\) 个。

复杂度 \(O(n^3 \log n)\),常数不大,可以通过。

代码实现

要特别注意 \(0\) 的问题。

#include<bits/stdc++.h>
using namespace std;
const int inf=2e9+10;
int n,m,cnt,p,ans,v;
struct node{int x,y,w;
}h[40005];
bool cmp(node a,node b){return a.w<b.w;
}
int fa[205],w[205];
void init(){for(int i=1;i<=n;i++){fa[i]=i;}
}
int find(int x){if(fa[x]==x) return x;int y=find(fa[x]);w[x]^=w[fa[x]];fa[x]=y;return y; 
}
void merge(int x,int y){int fx=find(x),fy=find(y);if(fx==fy) return;fa[fy]=fx;w[fy]=w[x]^w[y]^1;
}
int head[405],nxt[400005],target[400005],tot;
void add(int x,int y){tot++;nxt[tot]=head[x];head[x]=tot;target[tot]=y;
} 
int dfn[405],low[405],vis[405],col[405],dcnt,ccnt;
stack<int> s;
void tarjan(int x){dfn[x]=low[x]=++dcnt;vis[x]=1;s.push(x);for(int i=head[x];i;i=nxt[i]){int y=target[i];if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(vis[y]) low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){ccnt++;col[x]=ccnt;vis[x]=0;while(s.top()!=x){int y=s.top();s.pop();col[y]=ccnt;vis[y]=0;}s.pop();}
}
bool check(int w1,int w2){for(int i=1;i<=(n<<1);i++){head[i]=dfn[i]=low[i]=vis[i]=col[i]=0;}dcnt=ccnt=tot=0;for(int i=1;i<=cnt;i++){if(h[i].w<=w2){continue;}else if(h[i].w>w1){add(h[i].x,h[i].y+n);add(h[i].y+n,h[i].x);add(h[i].y,h[i].x+n);add(h[i].x+n,h[i].y);}else{add(h[i].x,h[i].y+n);add(h[i].y,h[i].x+n);}}for(int i=1;i<=(n<<1);i++){if(!dfn[i]) tarjan(i);}for(int i=1;i<=n;i++){if(col[i]==col[i+n]) return false;}return true;
}
int find(int l,int r,int w){if(l==r){if(check(w,h[l].w)) return l;else return -1;}int mid=(l+r)>>1;if(check(w,h[mid].w)) return find(l,mid,w);else return find(mid+1,r,w); 
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n; for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){cin>>v;h[++cnt]=(node){i,j,v};}}sort(h+1,h+1+cnt,cmp);if(check(0,0)){cout<<0;return 0;}p=0,ans=inf;init();for(int i=cnt;i>=1;i--){if(find(h[i].x)==find(h[i].y)){if(w[h[i].x]==w[h[i].y]){p=find(p,cnt,h[i].w);if(p!=-1) ans=min(ans,h[i].w+h[p].w);break;}else ans=min(ans,h[i].w+h[p].w);}else{merge(h[i].x,h[i].y);p=find(p,cnt,h[i].w);if(p==-1) break;ans=min(ans,h[i].w+h[p].w);}}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904924.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XDA论坛打不开的解决办法

开了梯子反而进不去,关掉全局代理 v2 可以添加两行 https://xdaforums.com/; https://www.xda-developers.com/;

国内首个HR智能体平台:开启人力资源管理智能化征程

在当今数字化飞速发展的浪潮中,人工智能已不再是一个遥远的概念,而是实实在在地渗透到了各个领域,深刻改变着我们的工作与生活方式。人力资源管理,这一关乎企业核心竞争力的关键环节,也正经历着AI技术带来的前所未有的变革。HR智能体作为这一变革中的重要成果,正逐渐成为…

爆火开源库!20K星标,一键让网页设计秒变手绘风

今天必须给大伙说说一个超有意思的开源库,在GitHub上已经斩获20K星标啦,它能轻松给网页设计加上手绘风格的“滤镜”,让页面瞬间告别千篇一律,充满艺术感!一、Rough.js是什么?这个名为Rough.js轻量级的图形库,大小才8KB,能赋予网页元素自然又独特的手绘质感。通过一套特…

易路iBuilder智能体平台:AI+HR、全场景、深融合,7大创新应用引领HR管理变革

从国产AI大模型DeepSeek发布至今,国内外人工智能的热度持续居高不下。AI Agent(智能体)作为人工智能领域的重要概念与产品形态,也被广泛提起、认识并应用于千行万业中。本文将基于人力资源领域首个AI Agent垂直应用——易路iBuilder智能体平台的创新实践应用,对智能体在人…

Gitee DevOps 实践指南:本土团队效率提升的新范式

在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,通过深度融合代码托管、CI/CD、项目管理等核心功能,为企业提供了本土化的 DevOps 解决方案。一、Gitee DevOps 的核心价值定位 在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,…

那些正常的动态规划

目录前言动态规划到底是啥?线性dp最长上升子序列子集和子序列和子串的区别内容分析最大上升子序列例题1——[NOIP2004 提高组] 合唱队形分析最长公共子序列最长公共子串平面dp例题2——[NOIP2000 提高组] 方格取数分析例题3——[NOIP2008 提高组] 传纸条分析例题4——最大加权…

3月24日刷题笔记-第六章 流量特征分析-常见攻击事件 tomcat

1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag 我们查看流量包,可以发现有一个外部IP在对常见端口进行SYN扫描,判断出为恶意IPflag{14.0.0.120} 2、找到攻击者IP后请通过…

如何在云效中使用 DeepSeek 等大模型实现 AI 智能评审

除了代码智能补全外,AI 代码智能评审是 DevOps 领域受开发者广泛关注的另一场景了。本文,我们将结合云效代码管理 Codeup、流水线 Flow 和 DeepSeek,分享一种企业可快速自主接入,即可实现的 AI 智能评审解决方案,希望给大家一些启发。作者:崔力强、黄博文 除了代码智能补…

T+0量化:JAVA接入Level2高频行情(附Python代码)

去年在知乎分享过一个网格策略,评论区全是"代码能跑通但实盘不敢用"的留言。当时我也一样——用第三方平台回测美滋滋,一到实盘就怂:行情延迟3秒、API调用次数受限、策略逻辑被平台规则卡脖子…直到把整套系统搬回本地,才发现自建交易系统的快感就像从合租屋搬进…

制作一个简单的带有3D打印部件的四足蜘蛛机器人

在这个项目中,我将向您展示如何使用3D打印部件制作一个简单的4腿行走蜘蛛机器人。该设计主要由上下板、臂接插件、腿和伺服支架五个部分组成。机器人的4条腿由4个手臂部分和4个腿部分组成。机器人的运动总共使用了8个业余伺服电机,4个在手臂上,4个在腿上。在电路方面,首选E…