设$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. Java数据结构——图

    点 //类名:Vertex //属性: //方法: class Vertex{ public char label; //点的名称,如A public boolean wasVisited; publ ...

  2. 外景VR的应用

    留坑,续写. 最近在做外景的项目,被相关的帧率优化和灯光布置困扰的不要不要的.下面写下我是怎么优化帧率和对帧率的一些理解. 帧率,游戏的重要影响因素,会对玩家的手感以及视觉产生重大的影响,一般的游戏帧 ...

  3. 添加删除表格append或 createElement

    方法一: js代码:增加一行五列的表格 function AddList(){ $len= document.getElementsByName('goods_name[]').length; obj ...

  4. JDK Collection 源码分析(2)—— List

    JDK List源码分析 List接口定义了有序集合(序列).在Collection的基础上,增加了可以通过下标索引访问,以及线性查找等功能. 整体类结构 1.AbstractList   该类作为L ...

  5. java 实现文件下载

    需求:把每天产生的日志文件,从服务器上下载下来 File file = new File(path); // 根据路径,获取File String filename = file.getName(); ...

  6. [NHibernate]Parent/Child

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...

  7. 7 款顶级开源 BI(商务智能)软件和报表工具

    在这个信息化时代,每分每秒都产生海量数据.在海量数据中,挖掘出有用的数据,并且能以较人性化.直观的方式展示这些数据,变得尤为重要.本文将介绍 7款顶级开源 BI(商务智能)软件和报表工具,用于商业数据 ...

  8. R语言 ETL+统计+可视化

    这篇文章...还是看文章吧 导入QQ群信息,进行ETL,将其规范化 计算哪些QQ发言较多 计算一天中哪些时段发言较多 计算统计内所有天的日发言量 setwd("C:/Users/liyi/D ...

  9. Extjs 制作柱状图

    在JSP页面制作柱状图,可以根据数据的变化动态实时的变化 主要是使用EXTJS自带的插件达到效果 Ext.require('Ext.chart.*'); Ext.require([ 'Ext.Wind ...

  10. 字符串匹配:KMP算法

    一.原理: KMP算法是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法.朴素算法( ...