题目: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. GIT客户端的使用【原创】

    这次分享的方式,采用的是视频的形式,视频是本人录制. 在做项目使用SVN的时候经常有各种错误出现,所以萌发使用git的想法.在学习git的过程中发现一个神器就是分支,虽然在SVN里也有分支,但由于机制 ...

  2. HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()

    无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块.那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplic ...

  3. 【Atheros】如何在驱动中禁用ACK

    上一篇文章讲了如何禁用载波侦听(CSMA)和退避(BACKOFF)的方法,这一篇介绍如何禁用ACK. 禁用ACK主要分为三部分: 1. 在发送端设置不等待ACK回来就继续发送: 2. 在接收端设置收到 ...

  4. 修改zend studio字符集

    zend studio是一款编辑PHP的很好的工具,但是它的默认字符集是GBK,如何修改成UTF-8呢? 一.修改整个编辑器的编码 其实很简单,如果你做的每一个项目都是固定的某一个字符集(如UTF-8 ...

  5. 一起来学linux:例行性任务之at和crontab

    对于我们日常生活来说,有很多例行需要进行的工作,比如每天早上起床一杯水,例如家人的生日,每天的起床时间等.这性例行的工作有可能被遗忘,但是如果我们用计算机来进行提醒的话,则方便很多.这里就要介绍到Li ...

  6. 链表的C++实现

      有的时候,处于内存中的数据并非连续的.那么这时候.我们就须要在数据结构中加入一个属性.这个属性会记录以下一个数据的地址.有了这个地址之后.全部的数据就像一条链子一样串起来了,那么这个地址属性就起到 ...

  7. 关于SAP的编码范围

    [转自 http://blog.sina.com.cn/s/blog_6466e5f70100ithw.html ] 1.Number Range的通用Tcode:SNRO 2.Number Rang ...

  8. 【linux】自动删除7天前的文件

    下面的脚本是删除/home目录下7天前的文件 #!/bin/bash -exec rm -f {} \; 把这个脚本保存在/tmp目录下,命名为:clearfile.sh 加入计划任务 crontab ...

  9. vi中如何替换某字符成“回车”?

    vi中如何替换某字符成“回车”? 在 vi 中::s/,/^M/g (you need to type CTRL-V <CR> to get a ^M here)VIM - Vi IMpr ...

  10. Java性能分析方法

    Java调优经验 http://www.rowkey.me/blog/2016/11/02/java-profile/