BZOJ4078 : [Wf2014]Metal Processing Plant
设$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的更多相关文章
- BZOJ 4078: [Wf2014]Metal Processing Plant
4078: [Wf2014]Metal Processing Plant Time Limit: 100 Sec Memory Limit: 128 MBSubmit: 86 Solved: 20 ...
- BZOJ 4078: [Wf2014]Metal Processing Plant [放弃了]
以后再也不做$World Final$的题了................ 还我下午 bzoj上TLE一次后就不敢交了然后去uva交 Claris太神了代码完全看不懂 还有一个代码uva上竟然WA了 ...
- 【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant
Description 定义集合S的价值D(S)为: 现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值 要你将这些元素划分成两个集合A.B. 求min{D(A)+D(B)}. 注:d(i, ...
- bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】
枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...
- Codeforces Gym 101221G Metal Processing Plant(2-SAT)
题目链接 题意:有 \(n\) 个元素,第 \(i\) 个数与第 \(j\) 个数之间有一个权值 \(d_{i,j}\),\(d(i,j)=d(j,i)\). 定义函数 \(D(S)=\max\lim ...
- BZOJ4078 WF2014Metal Processing Plant(二分答案+2-SAT)
题面甚至没给范围,由数据可得n<=200.容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可.这样是O(n4logn)的. 2-SAT复杂度已经是下界,考虑如何优化枚举.稍微改 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Processing Images
https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_ ...
- Working with Metal—Overview
看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...
随机推荐
- Java Web学习笔记8
上下文参数(context-param) 由于init-param是配置在<servlet>标签里的,只能有这个Servlet来读取,因此它不是全局的参数,不能被其他的Servlet读取. ...
- mysql常用操作语句
mysql常用操作语句 1.mysql -u root -p 2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...
- diff和patch的使用、patch文件的格式解说
为了弄懂 patch中的 p0 p1 和.orig文件是啥,找到了这篇文章! 来源:http://www.cnblogs.com/super119/archive/2010/12/18/19 ...
- 什么叫session和cookie-及其设置
http的无状态? 保持状态, 是指当程序关闭后重启, 上一次操作的历史还能继续, 保持的. 如word中的 "选项"设置. 如windows系统的设置等等. http的设计目的, ...
- IoC/DI基本思想的演变
---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...
- filterHTML
function filterHTML(source) { return !source ? "" : source.replace(/]*>/g, "" ...
- SQL 的坑1 除法“”不可用“”
今天工作中遇见 一问题,有5各部分,现要求5个部分各自的比例,SQL语句没有问题,后来还试了"加","减","乘","Round& ...
- Ruby常用比较操作符
操作符 含义 == 测试值是否相等 ==== 用来比较case语句的目标和每个when从句的项 <=> 通用比较操作符. 根据接受者小于, 等于, 大于其参数, 返回-1, 0. 1 & ...
- 关于Javascript的使用参考
DOM编程>1.js重要的作用就是可以让用户可以与网页元素进行交互操作-->JS精华之所在 >2.DOM编程也是ajax的基础 >3.DOM(文档对象模型),是HTML与XML ...
- JSON.parse和eval的区别
JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...