题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872

可以倒推出每个叶子节点可以接受的值域。然后每个叶子二分有多少个区间符合即可。

注意一开始的两个点不是直接是 l[ u ]=r[ u ]=lm !也要看度数的!且把那条边的两个端点分别算子树很方便。

而且过程中似乎会爆 long long ,所以如果 l[ i ] 都大于最大值就不往下算了;r[ i ]也要每次与最大值取min。

然后是和网上一份题解对拍出错却仍A了此题的代码。不想管是哪错了……

(连freopen都忘了去掉也能A!)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6+;
int n,m,lm,a[N],hd[N],xnt,to[N<<],nxt[N<<];
int rt1,rt2,deg[N];
ll l[N],r[N],ans;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y)
{
to[++xnt]=y; nxt[xnt]=hd[x]; hd[x]=xnt;
to[++xnt]=x; nxt[xnt]=hd[y]; hd[y]=xnt;
deg[x]++; deg[y]++;
}
void dfs(int cr,int fa)
{
//printf("l[%d]=%lld r[%d]=%lld\n",cr,l[cr],cr,r[cr]);
for(int i=hd[cr],v;i;i=nxt[i])
if(i>&&(v=to[i])!=fa)
{
if(deg[v]==)
{
l[v]=l[cr]; r[v]=r[cr];
}
else
{
l[v]=l[cr]*(deg[v]-);
r[v]=r[cr]*(deg[v]-)+deg[v]-;
}
r[v]=min(r[v],(ll)a[m]);///
if(l[v]>a[m])continue;///
dfs(v,cr);
}
}
int findr(ll x)//ll
{
int l=,r=m,ret=;
while(l<=r)
{
int mid=l+r>>;
if(a[mid]<=x)ret=mid,l=mid+;
else r=mid-;
}
return ret;
}
int findl(ll x)
{
int l=,r=m,ret=m+;
while(l<=r)
{
int mid=l+r>>;
if(a[mid]>=x)ret=mid,r=mid-;
else l=mid+;
}
return ret;
}
int main()
{
freopen("data.in","r",stdin);
n=rdn(); m=rdn(); lm=rdn();
for(int i=;i<=m;i++) a[i]=rdn();
sort(a+,a+m+); int u,v; u=rdn(); v=rdn();
rt1=u; rt2=v; add(u,v);
// l[u]=r[u]=l[v]=r[v]=lm;
for(int i=;i<n;i++)
{
u=rdn(); v=rdn(); add(u,v);
} u=rt1; v=rt2;
if(deg[u]==) l[u]=r[u]=lm;/////
else l[u]=lm*(deg[u]-),r[u]=lm*(deg[u]-)+deg[u]-;///
r[u]=min(r[u],(ll)a[m]); if(l[u]<=a[m]) dfs(u,); if(deg[v]==) l[v]=r[v]=lm;
else l[v]=lm*(deg[v]-),r[v]=lm*(deg[v]-)+deg[v]-;
r[v]=min(r[v],(ll)a[m]); if(l[v]<=a[m]) dfs(v,); for(int i=;i<=n;i++)
if(deg[i]==&&r[i]&&l[i]<=a[m])
ans+=findr(r[i])-findl(l[i])+;
printf("%lld\n",ans*lm);
return ;
}

bzoj 3872 [Poi2014]Ant colony——二分答案的更多相关文章

  1. bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分

    3872: [Poi2014]Ant colony Time Limit: 30 Sec  Memory Limit: 128 MB Description   There is an entranc ...

  2. bzoj 3872: [Poi2014]Ant colony【树形dp+二分】

    啊我把分子分母混了WA了好几次-- 就是从食蚁兽在的边段成两棵树,然后dp下去可取的蚂蚁数量区间,也就是每次转移是l[e[i].to]=l[u](d[u]-1),r[e[i].to]=(r[u]+1) ...

  3. 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]

    题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...

  4. $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$

    正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...

  5. 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分

    [BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...

  6. [BZOJ3872][Poi2014]Ant colony

    [BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...

  7. [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

    题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...

  8. [BZOJ 1816][Cqoi2010]扑克牌(二分答案)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1816 分析: 我先以为是道水题,但是要注意的是每套牌中Joker只能用1张的,所以就出现了可能 ...

  9. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

随机推荐

  1. uboot之bootm以及go命令的实现

    本文档简单介绍了uboot中用于引导内核的命令bootm的实现,同时分析了uImage文件的格式,还简单看了一下uboot下go命令的实现 作者: 彭东林 邮箱: pengdonglin137@163 ...

  2. ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

    ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长 ...

  3. View数据呈现相关技术

    一.了解Razor语法 1.Razor基本语法 a)输出单一变量时不需要加分号做结尾.如: <p>现在时刻:@DateTime.Now</p> b)输出一段含有空白字元或运算子 ...

  4. iOS中数组遍历的方法及比較

    数组遍历是编码中非经常见的一种需求.我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 由于iOS是兼容C语言的.所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的 ...

  5. mac下spark单机环境配置笔记

    1.安装scala 从http://www.scala-lang.org下载scala-2.11.7.tgz并解压缩 将解压缩的文件夹用mv指令移动到/usr/local/share mv [scal ...

  6. LR中select next row和update value on的设置

    LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了select next row和update value on不同的设置,对于LR ...

  7. 用nvm管理windows nodejs时用npm全局安装的插件无法调用的解决方案

    在环境变量中啊新建变量NODE_PATH赋值为prefix设置的地址即 prefix=D:\Users\xxx\AppData\Roaming\nodejs\npm-global 然后把%NODE_P ...

  8. EasyNVR无插件直播服务器如何使用ffmpeg实现摄像机快照功能的

    EasyNVR提供快照预览功能,并且提供向EasyDSS云平台上传快照的功能 EasyNVR会定时向配置的摄像机抓取快照数据,保存图片用于预览,并且用于快照上传 原理 将从摄像机取出来的I帧数据编码成 ...

  9. 随机生成指定长度的密码之---Random

    随机生成指定长度的密码思路: 1.密码中可能包含字母,数字,特殊符号,为了区别分别定义常量 2.随机生成密码,自然想到要用到java.util.Random 类 3.定义一个带两个参数的方法,1跟2, ...

  10. iOS与H5交互及UIWebView缓存

    iOS原生App与H5页面交互笔记 最近在做一个项目用到了原生App与H5交互,之前有做过简单的H5页面直接调用原生方法的例子,就是利用UIWebView中的代理方法 //webview每次加载之前都 ...