bzoj 3872 [Poi2014]Ant colony——二分答案
题目: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——二分答案的更多相关文章
- bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分
3872: [Poi2014]Ant colony Time Limit: 30 Sec Memory Limit: 128 MB Description There is an entranc ...
- bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
啊我把分子分母混了WA了好几次-- 就是从食蚁兽在的边段成两棵树,然后dp下去可取的蚂蚁数量区间,也就是每次转移是l[e[i].to]=l[u](d[u]-1),r[e[i].to]=(r[u]+1) ...
- 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]
题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...
- $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...
- 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分
[BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】
题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...
- [BZOJ 1816][Cqoi2010]扑克牌(二分答案)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1816 分析: 我先以为是道水题,但是要注意的是每套牌中Joker只能用1张的,所以就出现了可能 ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
随机推荐
- React系列之--props属性
版权声明:本文为博主原创文章,未经博主允许不得转载. PS:转载请注明出处作者:TigerChain地址:http://www.jianshu.com/p/fa81cebac3ef本文出自TigerC ...
- 目标检测之hog(梯度方向直方图)---hog简介0
梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征.Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功 ...
- Android-彻底地理解Binder
转自:https://blog.csdn.net/huachao1001 https://blog.csdn.net/huachao1001/article/details/51504469 你是不是 ...
- jQuery+bootstrap实现美化警告/确认/提示对话框插件
http://www.html580.com/12067/demo http://craftpip.github.io/jquery-confirm/
- 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行
习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...
- 一起来学linux:进程
简单来说,每当执行一个程序或者命令,启动事件的时候都会得到一个PID,也就是进程ID.比如用户登陆的时候就会得到一个PID.如下所示.两个用户zhf和root在登陆后分别获得PID 3212和3214 ...
- Linux入门基础(二)——cp、nano命令
- 如何查看apache配置文件路径
我是用https://lamp.sh/安装的,apache配置文件位置在:/usr/local/apache/conf/httpd.conf如果是直接安装的apache,配置文件应该在:/etc/ht ...
- okhttp 请求list数据实例
public class DataBean { /** * id : 61684 * movieName : <猜火车2>先导预告片 * coverImg : http://img31.m ...
- IOS UITableView reload 刷新某一个cell 或 section
通常刷新整个列表 我们都使用[self.tableView reloadData]; 有的时候,有变化更新的只是某一行 row 或者是某个section 所以只更新这一行就好了 //一个section ...