【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;
}

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

  1. BZOJ3425[POI2013]Polarization——DP+bitset+分块

    题目描述 Everyone knew it would only be a matter of time. So what? Faced for years on, a peril becomes t ...

  2. BZOJ3425 : Poi2013 Polarization

    最小值肯定是把树看作二分图,此时答案为$n-1$. 最大值一定是选取重心为根,任意一个子树要么全部指向根,要么全部背离根,这样可以制造最大的星型图. 统计出每个子树的大小后做01背包,如果小于$\sq ...

  3. 【CSP模拟赛】独立集(最长上升子序列&大力猜结论)

    题目描述 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独 立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两 个东西结合在一起.众所周知,独 ...

  4. D. Minimum Diameter Tree 思维+猜结论

    D. Minimum Diameter Tree 思维+猜结论 题意 给出一颗树 和一个值v 把该值任意分配到任意边上 使得\(\sum\limits_{i,j}p_{ij}=v\) 使得 这颗树任意 ...

  5. hdu 5976 Detachment 脑洞题 猜结论

    题目链接 题意 将\(x\)拆成\(a_1+a_2+...+\)的形式,且\(a_1\lt a_2\lt...\),使得\(a_1*a_2*...\)取到最大值 思路 大胆猜结论. 首先拆分的形式中肯 ...

  6. Atcoder Grand Contest 031 D - A Sequence of Permutations(置换+猜结论)

    Atcoder 题面传送门 & 洛谷题面传送门 猜结论神题. 首先考虑探究题目中 \(f\) 函数的性质,\(f(p,q)_{p_i}=q_i\leftarrow f(p,q)\circ p= ...

  7. BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)

    BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...

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

    2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status ...

  9. 51nod 1574 排列转换(猜结论)

    分析 猜了一下结论,居然对了..........具体操作是:假设排列s是1,2,3,...,nk为排列p中最大的 没有放到正确位置的数,k的位置为posk的右边一定有一个数x<=pos(因为&l ...

随机推荐

  1. C#四舍五入保留一位小数

    DateTime d1 = hrStaff.DateJoin; DateTime d2 = DateTime.Now; TimeSpan d3 = d2.Subtract(d1); ; //int i ...

  2. java调试打断点和不打断点执行结果不一致问题解决

    java程序在调试的时候需要debug来跟踪一下结果,有一种情况是这样的,正常执行java程序就会出现问题,而断点debug跟踪此方法的时候却是正常的,不断测试结果都是这样,由此判断有可能是因为此方法 ...

  3. unity, 查看资源文件类型

  4. atitit. java jsoup html table的读取解析 总结

    atitit. java jsoup html table的读取解析 总结 1. 两个大的parser ,,,jsoup 跟个   htmlparser 1 2. 资料比较 1 3. jsoup越佳. ...

  5. Path相关方法解说(二)

    今天咱们一起来看看Path里 XXXTo 相关的一类方法. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/4 ...

  6. 2、Reactive Extensions for .NET(译)

    实验3-引入 .net 中的 events 到 Rx 目标:前面实验中的使用各种工厂构造方法创建一个 可观察序列是一个部分.把 .net 中现有的异步数据源进行关联 是更重要的事情.在这次实验中我们将 ...

  7. Mysql变量声明与使用

    set @today='2017-04-25';set @ydate=DATE_SUB(@today, INTERVAL 7 day);select @today, @ydate; 待续....

  8. RFID Hacking–资源大合集

    原文: http://www.freebuf.com/news/others/605.html http://www.proxmark.org/forum/index.php RFID破解神器官方论坛 ...

  9. php 的rabbitmq 扩展模块amqp安装

    php 的rabbitmq 扩展模块amqp安装 2017年10月08日 10:34:22 阅读数:240 使用PHP开发,要使用中间队列rabbitmq, 必须要安装PHP的扩展模块amqp, 服务 ...

  10. 回文树(回文自动机) - BZOJ 3676 回文串

    BZOJ 3676 回文串 Problem's Link: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 Mean: 略 analyse: ...