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 ...
随机推荐
- [luoguP2982][USACO10FEB]慢下来Slowing down(dfs序 + 线段树)
传送门 这个题显然可以用树链剖分做. 然而线段树也能做. 每个点都对它的子树有贡献,所以先求一边 dfs序,然后直接在 dfs序 中搞 线段树 就行. ——代码 #include <cstdio ...
- POJ1450:Gridland 【杂题】
题目大意:先给出了TSP的背景,然后给出一个n*m的单位格点的图,图中除边缘上的点与八个方向的点有边连接,距离为欧拉距离,求从左上角出发的TSP 思路:从水题列表中看到的题,但看一开始给出的backg ...
- 普通平衡树(bzoj 3224)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- django学习之- json序列化
序列化操作 - Errordict - 自定义Encoder - django的模块可以直接序列化 第一种: from django.core import serializers # 通过这个模块对 ...
- 2017多校Round4(hdu6067~hdu6079)
补题进度:10/13 1001 待填坑 1002(kmp+递推) 题意: 有长度为n(<=50000)的字符串S和长度为m(m<=100)的字符串T,有k(k<=50000)组询问, ...
- flash update
https://get.adobe.com/cn/flashplayer/otherversions/
- @Retention n. 保留
@Retention n. 保留 学习了:https://blog.csdn.net/asdgbc/article/details/70196749 默认都是保留到class中,而在runtime中没 ...
- USB多重系統 - 開機碟工具 – WinSetupFromUSB
WinSetupFromUSB下載與安裝 讓USB磁碟擁有多重開機的功能,WinSetupFromUSB有著提軟體和硬體的高相容性. [官方網頁]:http://www.winsetupfromusb ...
- 公布Java桌面程序
我拿了一份桌面工具的开源码,修改动改,在elipse上执行.感觉良好.但到了公布应用程序,就傻眼了. 我竟然不知道咋公布! 呵呵,不愧是Java小白. 假设是微软阵营,直接就编译成exe了. 但jav ...
- Essay
要养成先连续输入一对匹配的字符——比如"("和")",以及"{"和"}"——再在其中填写内容的习惯.如果先填写内容,很容 ...