【BZOJ3425】Poi2013 Polarization 猜结论+DP

【BZOJ3425】Poi2013 Polarization

Description

给定一棵树,可以对每条边定向成一个有向图,这张有向图的可达点对数为树上有路径从u到达v的点对(u,v)个数。求最小可达点对数和最大可达点对数

n<=250000

Sample Input

4
1 2
1 3
1 4

Sample Output

3 5

题解:想了一晚上,怎么想怎么是个搭建双塔,结果看题解发现还真tm是搭建双塔。

本题的结论有点神,不过很好猜,证明见Claris博客。

第一问的答案一定是n-1,因为树是个二分图,所以我们将树黑白染色后所有边都从黑点指向白点即可。

第二问的答案是什么呢?我们猜测一定是先选中一个点,然后一半的边都指向这个点,另一半的边从这个点指出去。而选择哪个点呢?显然是重心啦。然后我们将重心之外所有联通块的大小都拿出来,这就变成了搭建双塔问题。

话说搭建双塔不是$O(n^2)$的吗?n=250000你逗我?然而正解很奇特。

当联通块大小<sqrt(n)时,我们将所有这样的联通块合到一起跑分组背包;当联通块大小>sqrt(n)时,这样的联通块不超过sqrt(n)个,所以暴力DP即可。DP时用bitset维护,于是时间复杂度就变成了神奇的$O({n \sqrt{n}\over 32})$。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <bitset>
#include <cmath>
using namespace std;
const int maxn=250010;
typedef long long ll;
int B,n,m,cnt,rt,mn;
ll sum,ans;
int to[maxn<<1],next[maxn<<1],head[maxn],siz[maxn],v[maxn],dep[maxn],s[maxn];
bitset<maxn> f;
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+(gc^‘0‘),gc=getchar();
	return ret*f;
}
inline void add(int a,int b)
{
	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
	siz[x]=1,sum+=dep[x]-1;
	int i,tmp=0;
	for(i=head[x];i!=-1;i=next[i])	if(!dep[to[i]])
		dep[to[i]]=dep[x]+1,dfs(to[i]),siz[x]+=siz[to[i]],tmp=max(tmp,siz[to[i]]);
	tmp=max(tmp,n-siz[x]);
	if(tmp<mn)	mn=tmp,rt=x;
}
int main()
{
	n=rd(),B=int(sqrt(double(n))),mn=1<<30;
	memset(head,-1,sizeof(head));
	int i,j,a,b;
	for(i=1;i<n;i++)	a=rd(),b=rd(),add(a,b),add(b,a);
	dep[1]=1,dfs(1),memset(dep,0,sizeof(dep));
	sum=0,dep[rt]=1,dfs(rt);
	for(i=head[rt];i!=-1;i=next[i])	v[++m]=siz[to[i]];
	f[0]=1;
	for(i=1;i<=m;i++)
	{
		if(v[i]<=B)	s[v[i]]++;
		else	f=f|(f<<v[i]);
	}
	for(i=1;i<=B;i++)
	{
		for(j=1;j<=s[i];s[i]-=j,j<<=1)	f=f|(f<<(i*j));
		if(s[i])	f=f|(f<<(i*s[i]));
	}
	for(i=0;i<=n;i++)	if(f[i])	ans=max(ans,sum+(ll)i*(n-1-i));
	printf("%d %lld",n-1,ans);
	return 0;
}
时间: 2024-10-12 08:04:56

【BZOJ3425】Poi2013 Polarization 猜结论+DP的相关文章

BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status][Discuss] Description 佳佳和明明玩一个猜数游戏.佳佳想一个1~n之间的整数,明明每次可以随便猜一个数.从第二次猜测起,佳佳告诉明明本次猜测的数和上次猜测的数相比哪个更接近.B表示本次猜测的数更接近,W表示上次猜测的数更接近.如果两次猜测的接近程度一样,则既可回答B也可回答W.

UVA 11636-Hello World!(水题,猜结论)

UVA11636-Hello World! Time limit: 1.000 seconds When you ?rst made the computer to print the sentence “Hello World!”, you felt so happy, not knowing how complex and interesting the world of programming and algorithm will turn out to be. Then you did

(转)dp和dip是同一个单位

原文地址:http://blog.csdn.net/chenyufei1013/article/details/8363619 摘要 本文介绍了android单位dp,dip的概念,并给出了它的确切含义. 概述 Android中,dp是Density-independent Pixels简写,而dip则是Density Independent Pixels,实际上指的是一个概念,都是Android的单位.在文档More Resource Types中有描述: dp        Density-

AtCoder AGC032E Modulo Pairing (二分、贪心结论)

题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以某个位置为界,两边分别首尾匹配,且满足左边的每一对的和都\(<M\), 右边每一对的和都\(\ge M\). 证明不难,可参考官方题解,此处不再赘述. 然后显然可以枚举这个临界点,然后\(O(n)\)暴力计算答案,时间复杂度\(O(n^2)\). 考虑优化: 在我们配对的时候,当临界点右移,左右两侧

2017暑假实践报告

第二年暑假在学校度过了,去年的时候还在成长阶段,今年就在修炼阶段,刚开始的一个多星期没有什么状态,但总的来说一个暑假的学习,还是学了不少东西,自己也成长了不少. 刚来的一个星期,老师给了一个数据结构的专题,先敲敲代码,找回手感,但是写的过程中并不容易,线段树各种应用,还是需要YY.但是慢慢的就好点了,能感觉到的状态在回升,感觉自己又开始熟悉键盘了,接下来的第二个专题二分贪心,就很恶心了,卡精度,贪心的时候,贪心的正确性检验,很痛苦. 接下来的多校训练就是重头戏了. 第一场多校训练,朝鲜的金策工业

GDUT决赛题解

决赛,我自我认为题目难度更大,反而我的心态更好了. 由于放轻松的时候反而效果更好,跟昨天的观点一样,凡是可以1A的,才算这题做得好. A.数目不大,关键是看懂题(我自己连输入输出是什么都不清楚.... 然后管理员就把题下掉了. . ..批评批评啊. .. )bin神的代码膜拜了下.知道是状态压缩,题中说了最多6个,要么1<<6枚举,要么6!枚举.代码: /* *********************************************** Author :kuangbin Cre

蒟蒻的高一生活

博主在三周前成功晋级为高中生OwO终于不再是假的HZOIer感受一波HZ的真正生活...(然而实际上级部不少监督一直没启动23333) (然而三周过去好多事情都忘了QAQ瞎写好了(逃)) Week 1 心情复杂地进了海阔的班...(感觉药丸?) 第一周主要就是军训...军训这几天天气都比较阴沉所以没有很热的样子OwO然而发的军训鞋的鞋底硬到不行直接给军训多添加了 $50\%$ 的痛苦QAQ 不过似乎削减了不少以前的军训项目(连正步都没练233)随着这些一起削减掉的还有打靶QAQ(据说会补上?)

11.6晚 考试小结

继续总结,这次分数没那么难看的说..被百度羊的题折磨的GG 题目是真的难..t1没思路,猜结论乱搞,t2(想了很久)打表找规律,真的搞出来了..结果想DP的时候少了一维,没往下想,打了个错误的50%,结果跑的贼快,然后打表解放双手(狗了20),觉得终于A一题的说,然后检查t1,发现打错了,最后十分钟飞速打带权并查集狗了70...t3?码农题手速慢弃坑 这次题目有(T)点(MD)难,但是感觉第二题还是可做的,想题的时候还是要深入一点,有点想法就写很容易炸..

[日常] NOIP 2017滚粗记

突然挑了这么个滑稽的时间补了游记... (成绩日常延时再加上人太菜估计基本上就是颓废记录) 然而文化课太废可能会被强制退役QAQ所以先补了再说吧 day0 一大早被老姚交代了个开十一机房门的任务... 打开门之后本来想去高二那边后来一想还是自己慢慢乱搞比较好... 然后就和高一混在一起 前一天晚上和母上谈了谈然后成功把笔电带上了(233333333) 早上的时候发现 $794$ 势力似乎并没有收拾东西...窝就让他们去找阔少去开条了 于是乎他们两个被批了一顿回来了(后来发现并没必要) 后来 8: