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 ...
随机推荐
- POJ 2195 Going Home【最小费用流 二分图最优匹配】
题目大意:一个n*m的地图,上面有一些人man(m)和数量相等的house(H) 图上的距离为曼哈顿距离 问所有人住进一所房子(当然一个人住一间咯)距离之和最短是多少? 思路:一个人一间房,明显是二分 ...
- SGU515:Recover path 【最短路】
警告:这题卡SPFA,警告:这题卡SPFA 这不是演习 题目大意:给出一个无向图,以及一些点的序列,要找出一条最短的路径使得通过所有点,题目保证存在一条头尾都在点的序列中的最短路满足题意 思路:没有最 ...
- android AlertDialog常见使用
android AlertDialog常见使用 简单提示框: AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); aler ...
- 最长回文(hdu 3068)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有 ...
- 数据库备份与还原c#.net实现
原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 数据库备份与还原c#.net实现: 页面上面有 备份,还原,下拉菜单(浏览备份文件夹下面的所有文件名),删除(删除 ...
- Python基础教程笔记——第5章:条件,循环和其他语句
5.1 print和import的更多信息 1. print()3.0之后print不再是语句,而是函数, >>> print('udg',12,13) udg 12 13 &g ...
- oc温习三:常用函数
参考文章: 算术函数 [算术函数] 函数名 说明 int rand() 随机数生成.(例)srand(time(nil)); //随机数初期化int val = rand()P; //0-49之间的随 ...
- 某考试 T2 yja
2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...
- 页面跳转到顶部---bug修改
今天遇到一个很诡异的bug 某元素的html结构是: <div id="aa"> <span>诡异的bug</span> </div> ...
- crontab使用简介
crontab的配置文件: 前四行是用来配置crond任务运行的环境变量 第一行SHELL变量指定了系统要使用哪个shell,这里是bash 第二行PATH变量指定了系统执行命令的路径 第三行MAIL ...