Description

定义集合S的价值D(S)为:

现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值

要你将这些元素划分成两个集合A、B。

求min{D(A)+D(B)}。

注:d(i,j)=d(j,i)。

Input

输入数据的第一行是一个整数n,代表元素个数。

之后n-1行描述的是d(i,j),第i行包含n-i个整数,第i行第j列的整数代表的是d(i,i+j)。

0<=wi<=10^9

Output

输出只有一行,一个整数,代表min{D(A)+D(B)}。

Sample Input

5

4 5 0 2

1 3 7

2 0

4

Sample Output

4

Solution

最开始考虑枚举两个集合的上限,于是就会出现“某个点在A集合,另一个点就不能在A集合”的限制,这就是个2-SAT

所以朴素算法就是枚举两个集合的上限,然后建边跑2-SAT判可行性,最后将两个集合的上限的和对答案chkmin

考虑优化

可以发现在最优解的状态下,随着A集合上限的增大,B集合的上限是减小的,于是就可以用两个指针从两端往中间枚举,但这样还是有点慢

再考虑优化

发现A集合上限的变大对图的影响仅仅只是需要删掉一些边,而B集合上限的减小对图的影响仅仅只是需要加一些边

所以在枚举上限之后可以不重新建图,而是加入和删除一些边

这样就可以跑过了

然而还有一些奇环偶环之类的优化,可惜不会,就没写了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=400+10,MAXM=MAXN*MAXN+10;
int n,d[MAXN][MAXN],ans,mxval,beg[MAXN],e,nex[MAXM<<2],to[MAXM<<2],DFN[MAXN],LOW[MAXN],Visit_Num,Stack[MAXN],In_Stack[MAXN],Stack_Num,Be[MAXN],cnt,vt,V[MAXM],Lt,Rt;
struct node{
int u,v,w;
inline bool operator < (const node &A) const {
return w<A.w;
};
};
node L[MAXM],R[MAXM];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
}
inline void Tarjan(int x)
{
DFN[x]=LOW[x]=++Visit_Num;
In_Stack[x]=1;
Stack[++Stack_Num]=x;
for(register int i=beg[x];i;i=nex[i])
if(!DFN[to[i]])Tarjan(to[i]),chkmin(LOW[x],LOW[to[i]]);
else if(In_Stack[to[i]]&&DFN[to[i]]<LOW[x])LOW[x]=DFN[to[i]];
if(DFN[x]==LOW[x])
{
int temp;++cnt;
do{
temp=Stack[Stack_Num--];
In_Stack[temp]=0;
Be[temp]=cnt;
}while(temp!=x);
}
}
inline bool check()
{
for(register int i=2;i<=(n<<1|1);++i)DFN[i]=LOW[i]=0;
for(register int i=2;i<=(n<<1|1);++i)
if(!DFN[i])Tarjan(i);
for(register int i=2;i<=(n<<1|1);i+=2)
if(Be[i]==Be[i^1])return false;
return true;
}
inline void init()
{
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)
if(i!=j)
{
insert(i<<1,j<<1|1),L[++Lt]=(node){i<<1,j<<1|1,d[i][j]};
R[++Rt]=(node){i<<1|1,j<<1,d[i][j]};
}
}
inline void add(int id)
{
insert(R[id].u,R[id].v);
}
inline void del(int id)
{
int u=L[id].u,v=L[id].v,i,las=0;
for(i=beg[u];i&&to[i]!=v;i=nex[las=i]);
if(las)nex[las]=nex[i];
else beg[u]=nex[i];
}
int main()
{
read(n);
for(register int i=1;i<n;++i)
for(register int j=1;j<=n-i;++j)read(d[i][i+j]),V[++vt]=d[i][i+j];
for(register int i=1;i<=n;++i)
for(register int j=i+1;j<=n;++j)d[j][i]=d[i][j],chkmax(mxval,d[i][j]);
init();
V[++vt]=0;ans=mxval;
std::sort(V+1,V+vt+1);
std::sort(L+1,L+Lt+1);
std::sort(R+1,R+Rt+1);
vt=std::unique(V+1,V+vt+1)-V-1;
for(register int i=1,j=vt,lp=1,rp=Rt;i<=vt&&i<=j;++i)
{
while(lp<=Lt&&L[lp].w<=V[i])del(lp),lp++;
while(j>=i&&check())
{
--j;
while(rp>=1&&R[rp].w>V[j])add(rp),rp--;
}
chkmin(ans,V[i]+V[j+1]);
}
printf("%d\n",ans);
return 0;
}

【刷题】BZOJ 4078 [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【二分+2-SAT+枚举+并查集】

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

  4. BZOJ4078 : [Wf2014]Metal Processing Plant

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

  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. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  7. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  8. 【刷题】BZOJ 4316 小C的独立集

    Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...

  9. 【刷题】BZOJ 4176 Lucas的数论

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

随机推荐

  1. 关于开发React Native的注意事项

    今天在写一个简单的RN的Demo时,一连出现了好几个错误,最后幸亏得以解决,在这里把我踩过的坑以及解决办法分享出来: 1.运行出现错误:Could not connect to development ...

  2. Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)

    https://files.cnblogs.com/files/Winniechen/usaco2012-2013.pdf 做的不是很好,还请见谅! 如果有什么疑问,可以QQ上找我. QQ号:1967 ...

  3. C++面试题:list和vector有什么区别

    C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★★★★解析:vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随 ...

  4. 20155209林虹宇 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 简单应用SET工具建立冒名网站 kali要作为web服务器让靶机访问冒名网站,所以要使用阿帕奇web服务器软件. 要阿帕奇使用80端口.进入配置文件/etc/apache2/p ...

  5. Caffe学习系列——工具篇:神经网络模型结构可视化

    Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...

  6. idea git pull项目到本地时容易出现的问题

    有时候pull到本地,出了各种错误,其实是因为搞来搞去的,容易出问题,所以最好的方法是拿原有打包好的整个稳定能跑的项目环境, 先git add,然后vcs重置head为hard,然后再pull,一般就 ...

  7. 微信小程序云开发之云函数创建

    云函数 云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写.一键上传部署即可运行后端代码. 小程序内提供了专门用于云函数调用的 API.开发者可以在云函数内使用 wx-server-sdk ...

  8. Html_兼容性

    那么如何禁止使用IE8兼容模式解析网页呢?在IE8以上版本的浏览器增加了一个X-UA-Compatible 头标记,用于为IE8指定不同的页面渲染模式. <meta http-equiv=&qu ...

  9. 博客配置Racket代码字体

    我想在博客园的文章中插入Racket代码,但是博客园的代码块和高亮都太难看了,如果能把scribble/manual的CSS文件中的Racket代码块的配置拿出来就可以有漂亮的Racket代码高亮了, ...

  10. 做游戏的小伙伴们注意了,DDoS还可以这样破!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 作者:腾讯DDoS安全专家.腾讯云游戏安全专家haroldchen 摘要:在游戏出海的过程中,DDoS攻 ...