题目: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. android利用apkplug框架实现主应用与插件通讯(传递随意对象)实现UI替换

    时光匆匆,乍一看已半年过去了,经过这半年的埋头苦干今天最终有满血复活了. 利用apkplug框架实现动态替换宿主Activity中的UI元素.以达到不用更新应用就能够更换UI样式的目的. 先看效果图: ...

  3. 【Java】Spring Web MVC注意事项

    本文内容可能是书上没有的,至少是<Java Web整合开发实践>这本书上没有的.这是初学Spring的笔者走过的弯路,谨记以自勉. 这两天学习Spring WebMVC,照着书依葫芦画瓢写 ...

  4. Android API Guides---Supporting Tablets and Handsets

    在Android平台上的各种屏幕尺寸的执行和系统调整大小正常应用程序的用户界面.以适应每一个人. 通常情况下,你须要做的是设计你的UI是灵活的,并通过提供替代资源(如又一次定位的一些看法观点或替代尺寸 ...

  5. idea 的IDE

    idea 是与eclipse齐名的IDE(集成开发工具),以智能闻名,不过对于熟悉eclipse的的用户来说,初次接触idea有些让人搞不清方向,下面介绍一下简单的使用 方式. 1.安装 官网下载ul ...

  6. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

  7. npm install --save 、--save-dev 、-D、-S 的区别与NODE_ENV的配置

    https://blog.csdn.net/jwl_willon/article/details/81054978 1.npm install <=> npm i --save   < ...

  8. 用CMakeLists.txt组织工程

    1 一个工程会有多个CMakeLists.txt,如何组织这些CMakeLists.txt来构建一个工程? 1.1  最外层一个CMakeLists.txt,是总的CMakeList.txt,在这个里 ...

  9. Netty入门 - 秒懂

    目录 Netty 入门 前言: 建立项目 编写一个Discard Handler 处理器 编写一个Discard 服务器 线程组 启动帮助类 设置Channel 通道的选项 测试:发送消息到Disca ...

  10. cocos2d-js添加道有道插屏(通过jsb反射机制)

    1.导入jar包 2.修改AndroidManifest.xml文件 添加权限:      <activity android:configChanges="keyboard|keyb ...