设$D(A)\leq D(B)$,从小到大枚举$D(A)$,双指针从大到小枚举$D(B)$。

那么对于权值不超过$D(A)$的边,可以忽略。

对于权值介于$(D(A),D(B)]$之间的边,需要满足那两个点不能都在集合$A$。

对于权值大于$D(B)$的边,需要满足那两个点不在同一个集合。

所以建图判断2-SAT是否有解即可,这可以使用压位Kosaraju算法。

时间复杂度$O(\frac{n^4}{64})$。

#include<cstdio>
#include<algorithm>
#define N 205
using namespace std;
typedef unsigned long long ll;
int n,m,i,j,k,t,q[N<<1],f[N<<1],ans;
struct E{int x,y,w;E(){}E(int _x,int _y,int _w){x=_x,y=_y,w=_w;}}e[N*N];
inline bool cmp(const E&a,const E&b){return a.w<b.w;}
struct BIT{
ll v[4];
void clear(){for(int i=0;i<4;i++)v[i]=0;}
void flip(int x){v[x>>6]^=1ULL<<(x&63);}
int get(int x){return v[x>>6]>>(x&63)&1;}
}v0,v1,g0[N<<1],g1[N<<1];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void addA(int x,int y){
g0[x].flip(y);
g1[y+n].flip(x);
g0[y].flip(x);
g1[x+n].flip(y);
}
inline void addB(int x,int y){
g0[x+n].flip(y);
g1[y].flip(x);
g0[y+n].flip(x);
g1[x].flip(y);
}
void dfs1(int x){
if(x<n){
v0.flip(x);
for(int i=0;i<4;i++)while(1){
ll o=v1.v[i]&g0[x].v[i];
if(!o)break;
dfs1((i<<6|__builtin_ctzll(o))+n);
}
}else{
v1.flip(x-n);
for(int i=0;i<4;i++)while(1){
ll o=v0.v[i]&g0[x].v[i];
if(!o)break;
dfs1(i<<6|__builtin_ctzll(o));
}
}
q[++t]=x;
}
void dfs2(int x,int y){
f[x]=y;
if(x<n){
v0.flip(x);
for(int i=0;i<4;i++)while(1){
ll o=v1.v[i]&g1[x].v[i];
if(!o)break;
dfs2((i<<6|__builtin_ctzll(o))+n,y);
}
}else{
v1.flip(x-n);
for(int i=0;i<4;i++)while(1){
ll o=v0.v[i]&g1[x].v[i];
if(!o)break;
dfs2(i<<6|__builtin_ctzll(o),y);
}
}
}
inline bool check(){
int i;
v0.clear(),v1.clear();
for(i=0;i<n;i++)v0.flip(i),v1.flip(i);
for(t=i=0;i<n;i++)if(v0.get(i))dfs1(i);
for(i=0;i<n;i++)if(v1.get(i))dfs1(i+n);
for(i=0;i<n;i++)v0.flip(i),v1.flip(i);
for(i=t;i;i--)if(q[i]<n){if(v0.get(q[i]))dfs2(q[i],q[i]);}else if(v1.get(q[i]-n))dfs2(q[i],q[i]);
for(i=0;i<n;i++)if(f[i]==f[i+n])return 0;
return 1;
}
void solve(){
ans=~0U>>1;
sort(e+1,e+m+1,cmp);
for(i=0;i<n+n;i++)g0[i].clear(),g1[i].clear();
for(i=1;i<=m;i++)addA(e[i].x,e[i].y);
for(i=0,j=m;i<=j;i++){
if(i)addA(e[i].x,e[i].y);
while(e[i].w+e[j].w>=ans||check()){
ans=min(ans,e[i].w+e[j].w);
if(j)addB(e[j].x,e[j].y);
if((--j)<i)return;
}
}
}
int main(){
while(~scanf("%d",&n)){
for(m=i=0;i<n;i++)for(j=i+1;j<n;j++)read(k),e[++m]=E(i,j,k);
solve();
printf("%d\n",ans);
}
return 0;
}

  

BZOJ4078 : [Wf2014]Metal Processing Plant的更多相关文章

  1. BZOJ 4078: [Wf2014]Metal Processing Plant

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

  2. BZOJ 4078: [Wf2014]Metal Processing Plant [放弃了]

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

  3. 【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant

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

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

    枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...

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

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

  6. BZOJ4078 WF2014Metal Processing Plant(二分答案+2-SAT)

    题面甚至没给范围,由数据可得n<=200.容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可.这样是O(n4logn)的. 2-SAT复杂度已经是下界,考虑如何优化枚举.稍微改 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. Processing Images

    https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_ ...

  9. Working with Metal—Overview

    看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...

随机推荐

  1. 树莓派2系统DietPi简单安装配置使用介绍

    DietPi在Raspberrypi.org上的原帖:http://dwz.cn/HSrmY 版本发布很频繁,给原作者们点个赞.功能会越来越多,而且作者的定制观点很明确,适合树莓派的使用. 之前关于D ...

  2. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  3. TCP/IP——基本知识

    TCP / IP通常被认为是一个四层协议系统: 1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物 ...

  4. Django基础,Day9 - 静态文件目录与路径设置说明(eg. images, JavaScript, CSS)

    静态文件路径设置官方说明 1. Make sure that django.contrib.staticfiles is included in your INSTALLED_APPS. 2. In ...

  5. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

  6. JAVA对MySQL数据库的操作

    一.导包: 使用JDBC连接MySQL数据库时,首先需要导入一个第三方的JAR包(点击下载),下载解压得到一个JAR包,并导入到JAVA项目中,如下图: 二.DBHelper类: 代码如下: impo ...

  7. 删除Tomcat服务及其它注意

    使用sc delete Tomcat7(注意服务名是Tomcat7 不是Apache......Tomcat7.0). 绿色版无法启动的话,需要先ervice.bat install注册一下服务. 如 ...

  8. XHTML的规则

    以正确的DOCTYPE和命名空间开始文档 使用meta内容元素声明你的字符编码 用小写字母写所有元素和属性名称 给所有属性值加引号 给所有属性赋一个值 关闭所有标签 用空格和斜杠关闭“空”标签 不要在 ...

  9. 【Android学习】android布局中几个距离单位的区别:px、dp、sp

    一.px 像素,我们经常说的400*800这种的就是像素,这个比较好理解. 二.dp 要理解dp,首先要先引入dpi这个概念,dpi全称是dots per inch,对角线每英寸的像素点的个数,所以, ...

  10. C++中使用初始化列表的情况

    http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...