P3576 [POI2014]MRO-Ant colony

题目描述

The ants are scavenging an abandoned ant hill in search of food.

The ant hill has nn chambers and n-1n−1 corridors connecting them.

We know that each chamber can be reached via a unique path from every other chamber.

In other words, the chambers and the corridors form a tree.

There is an entrance to the ant hill in every chamber with only one corridor leading into (or out of) it.

At each entry, there are gg groups of m_1,m_2,\cdots,m_gm​1​​,m​2​​,⋯,m​g​​ ants respectively.

These groups will enter the ant hill one after another, each successive group entering once there are no ants inside.

Inside the hill, the ants explore it in the following way:

  • Upon entering a chamber with dd outgoing corridors yet unexplored by the group,the group divides into dd groups of equal size. Each newly created group follows one of the d corridors.If d=0d=0, then the group exits the ant hill.

  • If the ants cannot divide into equal groups, then the stronger ants eat the weaker until a perfect division is possible.Note that such a division is always possible since eventually the number of ants drops down to zero.Nothing can stop the ants from allowing divisibility - in particular, an ant can eat itself, and the last one remaining will do so if the group is smaller than dd.

The following figure depicts mm ants upon entering a chamber with three outgoing unexplored corridors, dividing themselves into three (equal) groups of \left \lfloor m/3 \right \rfloor⌊m/3⌋ ants each.

A hungry anteater dug into one of the corridors and can now eat all the ants passing through it.

However, just like the ants, the anteater is very picky when it comes to numbers.

It will devour a passing group if and only if it consists of exactly kk ants.

We want to know how many ants the anteater will eat.

给一棵树,对于每个叶子节点,都有g群蚂蚁要从外面进来,每群蚂蚁在行进过程中只要碰到岔路,就将平均地分成岔路口数-1那么多份,然后平均地走向剩下的那些岔路口,余下的蚂蚁自动消失,树上有一个关键边,假如有一群蚂蚁通过了这条边且数量恰好为k,这k只蚂蚁就被吃掉,问一共有多少只蚂蚁被吃掉

输入输出格式

输入格式:

The first line of the standard input contains three integers nn, gg, kk(2\le n,g\le 1\ 000\ 0002≤n,g≤1 000 000, 1\le k\le 10^91≤k≤10​9​​), separated by single spaces.

These specify the number of chambers, the number of ant groups and the number of ants the anteater devours at once. The chambers are numbered from 1 to nn.

The second line contains gg integers m_1,m_2,\cdots,m_gm​1​​,m​2​​,⋯,m​g​​ (1\le m_i\le 10^91≤m​i​​≤10​9​​), separated by single spaces, where m_im​i​​ gives the number of ants in the ii-th group at every entrance to the ant hill. The n-1n−1 lines that follow describe the corridors within the ant hill;the ii-th such line contains two integers a_ia​i​​,b_ib​i​​ (1\le a_i,b_i\le n1≤a​i​​,b​i​​≤n), separated by a single space, that indicate that the chambers no. a_ia​i​​ and b_ib​i​​ are linked by a corridor. The anteater has dug into the corridor that appears first on input.

输出格式:

Your program should print to the standard output a single line containing a single integer: the number of ants eaten by the anteater.

输入输出样例

输入样例#1:

7 5 3
3 4 1 9 11
1 2
1 4
4 3
4 5
4 6
6 7
输出样例#1:

21

说明

给一棵树,对于每个叶子节点,都有g群蚂蚁要从外面进来,每群蚂蚁在行进过程中只要碰到岔路,就将平均地分成岔路口数-1那么多份,然后平均地走向剩下的那些岔路口,余下的蚂蚁自动消失,树上有一个关键边,假如有一群蚂蚁通过了这条边且数量恰好为k,这k只蚂蚁就被吃掉,问一共有多少只蚂蚁被吃掉

树形dp

O(≧口≦)O做了一晚上、、、

我们会发现一个很严肃的问题,如果我们从子节点开始做的话会非常难处理(反正蒟蒻表示我不会、、、)

既然正着不会,我们就倒着搞吧、、其次他说的是通过一条边的数量为k,这k只蚂蚁都会被吃掉。然而我们如果直接用边来进行运算的话,既然这样我们直接将边改为这条边的两个节点,然后以这两个节点为根节点,将原来的树处理成两棵树。然后就可以在这两棵树上乱搞了

如图所示:在1~2这条边上如果有k只蚂蚁经过的时候这k只蚂蚁会被吃掉

我们将上面的两棵树抽离成两颗一颗以1为根节点,一棵以2为根节点。

对于每一颗树我们从根节点开始往下进行搜索,更新每一个节点的父亲节点,如果这个点的父亲节点与他相连出去的节点不相同,那么将与他相连节点的父亲节点为当前节点。

我们看上面的图,如果要是蚂蚁经过1~2这条边上的时候蚂蚁的数量达到k时1号节点·与2好节点处的蚂蚁数量也就要为k。

然后我们在从这个各节点倒着计算他下面的节点蚂蚁的数量

我们知道进入蚂蚁的节点一定是子节点,然后每一个子节点往其他的分支那平分蚂蚁,他评分出来的蚂蚁一定是有一波要进入他的父亲节点。这样的话我们可以直接根据他的父亲节点的蚂蚁数目推出当前节点的蚂蚁数目,我们这个地方是不可能求出准确值的,因为他在平分的时候是下取整的。所以我们只能求出一个子节点的蚂蚁数目的范围。

子节点的蚂蚁的数目等于它的父节点的;连出去的边的条数*父节点的蚂蚁个数。

看这个图,你可以发现一个规律它的父节点连出去的边的条数正好等于它的父节点的入读。我们可以在进行dfs的时候处理处每一个点的父亲节点以及该点的入读、

蚂蚁平分,子节点最少的蚂蚁的个数为他父亲节点的蚂蚁的数量*父亲节点的入读,也就是说没有蚂蚁被消灭。最多的蚂蚁的数量为还差一个蚂蚁就可以让每一个分支在多分一只蚂蚁了,极为maxn[t]=(sum[now]+1)*out[now]-1

然后dfs结束的条件的为他已经搜索到最后一层子节点了。当minn[to[i]]<=m[g]是说明还没有到达根节点。

然后我们可以处理处到达叶子节点的时候的蚂蚁的最多数量跟最少数量,然后在判断有多少组蚂蚁满足要求。

最后的可以吃到的蚂蚁的数量为k*满足条件的蚂蚁的组数

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1100000
#define ll long long
using namespace std;
int n,g,k,x,y,sx,sy,tot;
int fa[N],in[N],head[N];
ll s[N],maxn[N],minn[N],ans;
int read()
{
    ,f=; char ch=getchar();
    ; ch=getchar();}
    +ch-'; ch=getchar();}
    return x*f;
}
struct Edge
{
    int to,from,next;
}edge[N<<];
int add(int x,int y)
{
    tot++;
    edge[tot].to=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int dfs(int now)
{
    for(int i=head[now];i;i=edge[i].next)
    {
        int t=edge[i].to;
        if(fa[now]!=t)
        {
            fa[t]=now;
            in[now]++;
         }
    }
    for(int i=head[now];i;i=edge[i].next)
    {
        int t=edge[i].to;
        if(fa[now]!=t)
        {
            minn[t]=minn[now]*in[now];
            maxn[t]=(maxn[now]+)*;
            maxn[t]=min(maxn[t],s[g]);
            if(minn[t]<=s[g]) dfs(t);
        }
    }
}
ll erfen(ll x)
{
    ,r=g,ans1=;
    while(l<=r)
    {
        ;
        if(s[mid]<x)
        {
            ans1=mid;
            l=mid+;
        }
        ;
    }
    return ans1;
}
int main()
{
    n=read(),g=read(),k=read();
    ;i<=g;i++) scanf("%lld",&s[i]);
    sort(s+,s++g);
    sx=read(),sy=read();
    ;i<n;i++)
    {
        x=read(),y=read();
        add(x,y),add(y,x);
    }
    minn[sx]=minn[sy]=maxn[sx]=maxn[sy]=k;
    dfs(sx),dfs(sy);
    ;i<=n;i++)
     if(!in[i])
      ans+=erfen(maxn[i]+)-erfen(minn[i]);
    printf("%lld",ans*k);
    ;
}

洛谷——P3576 [POI2014]MRO-Ant colony的更多相关文章

  1. 洛谷 P3576 [POI2014]MRO-Ant colony

    P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...

  2. 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]

    题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...

  3. 洛谷—— P3576 [POI2014]MRO-Ant colony

    https://www.luogu.org/problem/show?pid=3576 题目描述 The ants are scavenging an abandoned ant hill in se ...

  4. 洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)

    洛谷题面传送门 考虑一个平凡的 DP:我们设 \(dp_i\) 表示前 \(i\) 辆车一来一回所需的最小时间. 注意到我们每次肯定会让某一段连续的火车一趟过去又一趟回来,故转移可以枚举上一段结束位置 ...

  5. 洛谷 P3573 [POI2014]RAJ-Rally 解题报告

    P3573 [POI2014]RAJ-Rally 题意: 给定一个\(N\)个点\(M\)条边的有向无环图,每条边长度都是\(1\). 请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. 输入输 ...

  6. 洛谷P3572 [POI2014]PTA-Little Bird

    P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...

  7. 2018.09.14 洛谷P3567 [POI2014]KUR-Couriers(主席树)

    传送门 简单主席树啊. 但听说有随机算法可以秒掉%%%(本蒟蒻并不会) 直接维护值域内所有数的出现次数之和. 当这个值不大于区间总长度的一半时显然不存在合法的数. 这样在主席树上二分查值就行了. 代码 ...

  8. 洛谷P3567[POI2014]KUR-Couriers(主席树+二分)

    题意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解: 最近比赛太多,都没时间切水题了,刚好日推了道主席树裸题,就写了一下 然后 WA80 WA80 WA0 WA90 WA80 ?? ...

  9. 【刷题】洛谷 P3573 [POI2014]RAJ-Rally

    题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...

随机推荐

  1. shell脚本,计算输入给定的数,判断最大值,最小值,总和?

    [root@localhost ~]# cat five.sh #!/bin/bash #任意输入5个数,判断最大值,最小值,总和 s= read -p "please input:&quo ...

  2. 【dp】bzoj1613: [Usaco2008 Jan]Running贝茜的晨练计划

    还记得这是以前看上去的不可做题…… Description 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1<=N<=10,000)分钟的晨跑.在 ...

  3. LeetCode(9)Palindrome Number

    题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...

  4. POJ-3106 Flip and Turn (模拟)

    [题目大意] 给你一个n*m的矩阵,然后给你一系列操作,最后让你输出操作后的矩阵. 操作包括: 1:沿主对角线反转 2:沿副对角线反转 H:上下翻转 V:水平翻转 A B C:顺时针90° 180° ...

  5. saltstack管理八之常用执行模块

    所有执行模块: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html 常用模块:cmd, cron, file, mount, ...

  6. Pyhton开发:Python基础杂货铺

    if 语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python中if语句的一般形式如下所示: if condition_1: stateme ...

  7. android 之 ListView相关

    ListView是一种列表视图,其将ListAdapter所提供的各个控件显示在一个垂直且可滚动的列表中.需要注意的为创建适配器并将其设置给ListView. 1.ArrayAdapter Array ...

  8. ACdream 1135 MST

    MST Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Problem Descrip ...

  9. HDU 3271 SNIBB

    SNIBB Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 3271 ...

  10. acm之简单博弈 Nim Bash Wythoff

    前些日子我打算开了博弈基础,事后想进行总结下 一句话就是分析必胜或必败,异或为0. 以下内容来自转载: Nim游戏的概述: 还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠 ...