bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】

时间:2023-01-20 09:17:35

枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min

思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分...

有个优化,就是当不是二分图的时候退出枚举,这个用并查集染色维护

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=405;
int n,a[N][N],tot,has,h[N],cnt,ans=2e9,f[N],d[N],dfn[N],low[N],s[N],top,bl[N],dft,col;
bool v[N];
struct qwe
{
int ne,to,va;
}e[N*N];
struct bian
{
int u,v,w;
}b[N*N];
bool cmp(const bian &a,const bian &b)
{
return a.w>b.w||(a.w==b.w&&a.u>b.u)||(a.w==b.w&&a.u==b.u&&a.v>b.v);
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
inline int zhao(int x)
{
if(f[x]==x)
return x;
int res=zhao(f[x]);
d[x]^=d[f[x]];
return f[x]=res;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void tarjan(int u)
{
low[u]=dfn[u]=++dft;
v[s[++top]=u]=1;
for(int i=h[u];i;i=e[i].ne)
{
if(!dfn[e[i].to])
{
tarjan(e[i].to);
low[u]=min(low[u],low[e[i].to]);
}
else if(v[e[i].to])
low[u]=min(low[u],dfn[e[i].to]);
}
if(dfn[u]==low[u])
{
col++;
while(s[top]!=u)
{
bl[s[top]]=col;
v[s[top--]]=0;
}
bl[s[top]]=col;
v[s[top--]]=0;
}
}
bool ok(int s1,int s2)
{
memset(h,0,sizeof(h));
memset(dfn,0,sizeof(dfn));
cnt=0;dft=0;col=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(a[i][j]>s1)
add(i+n,j),add(j+n,i);
if(a[i][j]>s2)
add(i,j+n),add(j,i+n);
}
for(int i=1;i<=n+n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
if(bl[i]==bl[i+n])
return 0;
return 1;
}
void wk(int c)
{
// int l=c,r=tot,an=0;
// while(l<=r)
// {
// int mid=(l+r)>>1;
// if(ok(b[c].w,b[mid].w))
// l=mid+1,an=mid;
// else
// r=mid-1;
// }
// if(an)
// ans=min(ans,b[c].w+b[an].w);
int l=0,r=b[c].w;
while(l<=r)
{
int mid=(l+r)>>1;
if(ok(b[c].w,mid))
r=mid-1;
else
l=mid+1;
}
ans=min(ans,b[c].w+l);
}
int main()
{
n=read();
if(n<=2)
{
puts("0");
return 0;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
a[i][j]=a[j][i]=read();
b[++tot]=(bian){i,j,a[i][j]};
}
sort(b+1,b+1+tot,cmp);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=tot;i++)
{
int fu=zhao(b[i].u),fv=zhao(b[i].v);
if(fu!=fv)
{
wk(i);
d[fu]=d[b[i].u]^d[b[i].v]^1;
f[fu]=fv;
}
else if(d[b[i].u]==d[b[i].v])
{
wk(i);
break;
}
}
printf("%d\n",ans);
return 0;
}

bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】的更多相关文章

  1. BZOJ 4078&colon; &lbrack;Wf2014&rsqb;Metal Processing Plant

    4078: [Wf2014]Metal Processing Plant Time Limit: 100 Sec  Memory Limit: 128 MBSubmit: 86  Solved: 20 ...

  2. BZOJ 4078&colon; &lbrack;Wf2014&rsqb;Metal Processing Plant &lbrack;放弃了&rsqb;

    以后再也不做$World Final$的题了................ 还我下午 bzoj上TLE一次后就不敢交了然后去uva交 Claris太神了代码完全看不懂 还有一个代码uva上竟然WA了 ...

  3. 【刷题】BZOJ 4078 &lbrack;Wf2014&rsqb;Metal Processing Plant

    Description 定义集合S的价值D(S)为: 现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值 要你将这些元素划分成两个集合A.B. 求min{D(A)+D(B)}. 注:d(i, ...

  4. BZOJ4078 &colon; &lbrack;Wf2014&rsqb;Metal Processing Plant

    设$D(A)\leq D(B)$,从小到大枚举$D(A)$,双指针从大到小枚举$D(B)$. 那么对于权值不超过$D(A)$的边,可以忽略. 对于权值介于$(D(A),D(B)]$之间的边,需要满足那 ...

  5. noip 2010 关押罪犯 二分答案&plus;二分图染色 &vert;&vert; 并查集

    题目链接 题目描述 S 城现有两座*,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值&q ...

  6. Codeforces Gym 101221G Metal Processing Plant(2-SAT)

    题目链接 题意:有 \(n\) 个元素,第 \(i\) 个数与第 \(j\) 个数之间有一个权值 \(d_{i,j}\),\(d(i,j)=d(j,i)\). 定义函数 \(D(S)=\max\lim ...

  7. bzoj 1682&colon; &lbrack;Usaco2005 Mar&rsqb;Out of Hay 干草危机【并查集&plus;二分】

    二分答案,把边权小于mid的边的两端点都并起来,看最后是否只剩一个联通块 #include<iostream> #include<cstdio> using namespace ...

  8. BZOJ 1202 狡猾的商人 差分约束or带权并查集

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 题目大意: 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的 ...

  9. BZOJ 4566 JZYZOJ 1547 &lbrack;haoi2016T5&rsqb;找相同子串 后缀数组 并查集

    http://172.20.6.3/Problem_Show.asp?id=1547 http://www.lydsy.com/JudgeOnline/problem.php?id=4566 单纯后缀 ...

随机推荐

  1. css3新属性object-fit&comma;对页面img处理

    1.http://my.xueh5.com/xh5639998239/detail-3661.html 针对其进行深度讲解推荐 http://www.zhangxinxu.com/wordpress/ ...

  2. SpringMVC和MyBatis整合

    目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTfu ...

  3. 关于cocoa框架,你所要知道的一切&lpar;苹果官方文档,cocoa框架核心竞争力,必须收藏!&rpar;

    https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Accessib ...

  4. matlab图形句柄属性总结

    原文在于雪漫的bloghttp://blog.sina.com.cn/s/blog_4b9b714a0100cce2.html这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详 ...

  5. Linq的小知识&lpar;一&rpar;,大家可以学习一下

    linq的简介 lLINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰 ...

  6. 验证jquery&period;validate&period;js

    <pre>jquery.validate.js使用之自定义表单验证规则,下面列出了一些常用的验证法规则 jquery.validate.js演示查看 <a href="ht ...

  7. Java基础知识强化82:Random类概述和方法使用

    1. Random类 public class Random extends Object implements Serializable: 此类的实例用于生成伪随机数流.此类使用48位种子. (1) ...

  8. Windows2008RT搭建VPN服务器

    总结一下2008系统搭建VPN的步骤和过程,自己有个人网站和服务要通过互联网发布出来.服务器放在自己家里,宽带是民用的.也就产生了服务发布的一些问题.用无法映射出真实的公网IP,或是一些其他内部的问题 ...

  9. &lbrack;BZOJ&rsqb;3110 K大数查询&lpar;ZJOI2013&rpar;

    这大概是唯一一道小C重写了4次的题目. 姿势不对的树套树(Fail) → 分块(Fail) → 整体二分(Succeed) → 树套树(Succeed). 让小C写点心得静静. Description ...

  10. java发送soapui格式的报文

    import java.io.*;import java.net.HttpURLConnection;import java.net.URL; 使用java对soapui报文进行发送 public c ...