设$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 Web学习笔记8

    上下文参数(context-param) 由于init-param是配置在<servlet>标签里的,只能有这个Servlet来读取,因此它不是全局的参数,不能被其他的Servlet读取. ...

  2. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  3. diff和patch的使用、patch文件的格式解说

    为了弄懂 patch中的 p0   p1    和.orig文件是啥,找到了这篇文章! 来源:http://www.cnblogs.com/super119/archive/2010/12/18/19 ...

  4. 什么叫session和cookie-及其设置

    http的无状态? 保持状态, 是指当程序关闭后重启, 上一次操作的历史还能继续, 保持的. 如word中的 "选项"设置. 如windows系统的设置等等. http的设计目的, ...

  5. IoC/DI基本思想的演变

    ---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...

  6. filterHTML

    function filterHTML(source) { return !source ? "" : source.replace(/]*>/g, "" ...

  7. SQL 的坑1 除法“”不可用“”

    今天工作中遇见 一问题,有5各部分,现要求5个部分各自的比例,SQL语句没有问题,后来还试了"加","减","乘","Round& ...

  8. Ruby常用比较操作符

    操作符 含义 == 测试值是否相等 ==== 用来比较case语句的目标和每个when从句的项 <=>  通用比较操作符. 根据接受者小于, 等于, 大于其参数, 返回-1, 0. 1 & ...

  9. 关于Javascript的使用参考

    DOM编程>1.js重要的作用就是可以让用户可以与网页元素进行交互操作-->JS精华之所在 >2.DOM编程也是ajax的基础 >3.DOM(文档对象模型),是HTML与XML ...

  10. JSON.parse和eval的区别

    JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...