bzoj 3872 [ Poi 2014 ] Ant colony —— 二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872
从食蚁兽所在的边向叶节点推,会得到一个渐渐放大的取值区间,在叶子节点上二分有几群蚂蚁符合条件即可;
注意中途判断,如果已经超过范围就返回或者处理一下,据说会爆 long long 之类的;
而且食蚁兽所在的边的两个端点的初始值不一定是 k 和 k+1 !也要看度数!
注意统计答案的 num 也是 long long 。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((ll+rr)>>1)
using namespace std;
typedef long long ll;
int const xn=1e6+;
int n,g,k,s,t,hd[xn],ct,to[xn<<],nxt[xn<<],deg[xn];
ll m[xn],l[xn],r[xn],num;//
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
int findl(ll x)//第一个大于等于x的
{
int ll=,rr=g,ret=-;
while(ll<=rr)
{
if(m[mid]>=x)ret=mid,rr=mid-;
else ll=mid+;
}
return ret;
}
int findr(ll x)
{
int ll=,rr=g,ret=-;
while(ll<=rr)
{
if(m[mid]<x)ret=mid,ll=mid+;//<
else rr=mid-;
}
return ret;
}
void cal(int x)
{
if(l[x]>m[g]||r[x]<=m[])return;
num+=findr(r[x])-findl(l[x])+;
}
void dfs(int x)
{
vis[x]=;
if(l[x]>m[g])return;//
if(r[x]>m[g])r[x]=m[g]+;//
for(int i=hd[x],u;i;i=nxt[i])
{
if(vis[u=to[i]]||(x==s&&u==t)||(x==t&&u==s))continue;
if(deg[u]>)
{
l[u]=(deg[u]-)*l[x]; r[u]=(deg[u]-)*r[x];
dfs(u);
}
else cal(x);
}
}
int main()
{
n=rd(); g=rd(); k=rd();
for(int i=;i<=g;i++)m[i]=rd();
sort(m+,m+g+);
for(int i=,x,y;i<n;i++)
{
x=rd(); y=rd();
if(i==)s=x,t=y;
add(x,y); add(y,x); deg[x]++; deg[y]++;
}
// l[s]=l[t]=k; r[s]=r[t]=k+1;
if(deg[s]==)l[s]=k,r[s]=k+;
else l[s]=(deg[s]-)*k,r[s]=(deg[s]-)*(k+);
if(deg[s]==)cal(s);//!
if(deg[t]==)l[t]=k,r[t]=k+;
else l[t]=(deg[t]-)*k,r[t]=(deg[t]-)*(k+);
if(deg[t]==)cal(t);//!
dfs(s); dfs(t);
printf("%lld\n",num*k);
return ;
}
bzoj 3872 [ Poi 2014 ] Ant colony —— 二分的更多相关文章
- 解题:POI 2014 Ant colony
题面 既然我们只知道最后数量为$k$的蚂蚁会在特殊边上被吃掉,不妨逆着推回去,然后到达每个叶节点的时候就会有一个被吃掉的蚂蚁的区间,然后二分一下就好啦 #include<cstdio> # ...
- bzoj 3872 [Poi2014]Ant colony——二分答案
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 可以倒推出每个叶子节点可以接受的值域.然后每个叶子二分有多少个区间符合即可. 注意一开 ...
- $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...
- bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分
3872: [Poi2014]Ant colony Time Limit: 30 Sec Memory Limit: 128 MB Description There is an entranc ...
- 【BZOJ3872】Ant colony(二分,动态规划)
[BZOJ3872]Ant colony(二分,动态规划) 题面 又是权限题... Description There is an entrance to the ant hill in every ...
- 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分
[BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...
- CodeForces 474F Ant colony ST+二分
Ant colony 题解: 因为一个数是合法数,那么询问区间内的其他数都要是这个数的倍数,也就是这个区间内的gcd刚好是这个数. 对于这个区间的gcd来说,不能通过前后缀来算. 所以通过ST表来询问 ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- Codeforces 474 F. Ant colony
线段树求某一段的GCD..... F. Ant colony time limit per test 1 second memory limit per test 256 megabytes inpu ...
随机推荐
- [luoguP2831] 愤怒的小鸟(状压DP)
传送门 感觉这题不是很难,但是很恶心. 说一下几点. 1.预处理出来每两个点所构成的抛物线能消除的猪的集合. 2.如果两个点横坐标相同,则不能构成抛物线 3.a >= 0 continue 4. ...
- 洛谷P1504 积木城堡
题目描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木 ...
- [NOIP2000] 提高组 洛谷P1017 进制转换
题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...
- 《TCP/IP详解卷1:协议》——第3章 IP:网际协议(转载)
1.引言 IP是TCP/IP协议族中最核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输.IP提供不可靠. 无连接的数据报传送服务. (1)不可靠 它不能保证IP数据报能成 ...
- msp430入门编程30
msp430中C语言的文件管理
- jquery制作图片瀑布流点击按钮加载更多内容
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> ...
- Unique Paths II (dp题)
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- topcoder 650 srm
500 遇到这种构造题 就给跪了 比赛的时候想很多方法 DP,贪心,模拟 发现越写越烦琐.看到别人出这么快,肯定又是奇葩思路. 后来居然想到 2^50的暴力 +剪枝 不过暴力肯定卡你 IDEA: 只要 ...
- ArrayList内部实现原理
数组在创建的时候长度是固定的,那么就有往ArrayList中不断添加对象的时候,那么ArrayList是如何管理这些数组的? ArrayList内部通过Object[]实现,我们通过分析ArrayLi ...
- Java 等额本金等额本息工具类
原文:http://www.open-open.com/code/view/1449034309983 等额本息: /** * Description:等额本息工具类 * Copyright: Cop ...