首页 > 其他分享 >ABC 239 E - Subtree K-th Max(树+dfs)

ABC 239 E - Subtree K-th Max(树+dfs)

时间:2022-09-26 20:12:54浏览次数:81  
标签:10 ABC Max LL Subtree dfs back Sample 节点

https://atcoder.jp/contests/abc239/tasks/abc239_e

题目大意:
给定一棵树,根节点是1,一共有n个节点,每一个节点都有它自己的值

给定n-1条边,和q个询问

问我们在第x个节点之下的叶子节点中,值排第k大的是什么?输出它的值。
Sample Input 1  
5 2
1 2 3 4 5
1 4
2 1
2 5
3 2
1 2
2 1
Sample Output 1  
4
5

Sample Input 2  
6 2
10 10 10 9 8 8
1 4
2 1
2 5
3 2
6 4
1 4
2 2
Sample Output 2  
9
10

Sample Input 3  
4 4
1 10 100 1000
1 2
2 3
3 4
1 4
2 3
3 2
4 1
Sample Output 3 
1
10
100
1000

这道题目有一个很关键的点就在于k不会超过20,所以我们对于每个节点,只需要保存它的子树中价值排名20前的就行了
这样就可以保证一定在数据范围之内

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=200200,M=2002;
LL n,q,a[N];
vector<LL> g[N],f[N];
//g表示存储的节点,f表示存储的前20大的值
bool cmp(LL l,LL r)
{
    return l>r;
}
void dfs(LL u,LL fa)
{
    //进去了首先把这个节点下的自己的值加进来
    f[u].push_back(a[u]);
    //爆搜一遍这个节点下所拥有的子节点
    for(int i=0;i<g[u].size();i++)
    {
        int t=g[u][i];
        if(t==fa) continue;//不能回去搜父节点,不然就死循环了
        dfs(t,u);//找到了,继续往下深搜

        for(LL x:f[t])//将递归回来的数加入父节点的集合
            f[u].push_back(x);
    }
    sort(f[u].begin(),f[u].end(),cmp);//给当前节点排个序

    while(f[u].size()>20)//超过20个的就不要
        f[u].pop_back();
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>q;
        //记录每个点的值
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        //建立边
        for(LL i=1;i<=n-1;i++)
        {
            LL u,v;
            cin>>u>>v;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1,-1);//从根节点开始爆搜,它的父节点是-1
        while(q--)
        {
            LL x,k;
            cin>>x>>k;
            //这里输出的是值,而非节点(f)
            cout<<f[x][k-1]<<endl;
        }
    }
    return 0;
}

标签:10,ABC,Max,LL,Subtree,dfs,back,Sample,节点
From: https://www.cnblogs.com/Vivian-0918/p/16732210.html

相关文章

  • ABC270-d
    题目首先贪心是行不通的,考试的时候打了贪心,挂了......举个反例:10234贪心枚举答案为4,但若高桥先选3,最大值为6。其实考试的时候想到了dp,但是不会打悲因为青木也......
  • width和max-width区别
    https://www.w3school.com.cn/css/css_max-width.asp 使用max-width可以改善浏览器对小窗口的处理。例如div宽度是500px,当宽度小于500时,max-width对应的窗口显示的内......
  • abc270
    \(\textbf{G.}\)当\(a=0\)时有\(x_i=\begin{cases}s&,i=0\\b&,i\geq1\end{cases}\).所以可以\(\mathcal{O}(1)\)计算.当\(a=1\)时有\(x_......
  • [Typescript] 37. Medium - KebabCase *
    Replacethe camelCase or PascalCase stringwith kebab-case.FooBarBaz -> foo-bar-bazForexampletypeFooBarBaz=KebabCase<"FooBarBaz">;constfoobarb......
  • ABC270D(fake)
    ……你家E比D水……题意有$N$颗石子,每次可以拿$A_1$或$A_2$或……或$A_K$颗石子。Takahashi是先手,Snuke是后手。他们都想让自己取的石子数尽......
  • Specified key was too long; max key length is 767 bytes错误的原因
    将mysql数据库里某个UNIQUE唯一索引字段从utf8改为utf8mb4时提示1071-Specifiedkeywastoolong;maxkeylengthis767bytes,来看看这个错误的来原因。来几个知识点......
  • Longest Subarray With Maximum Bitwise AND
    LongestSubarrayWithMaximumBitwiseANDYouaregivenanintegerarray nums ofsize$n$.Consideranon-emptysubarrayfrom nums thathasthemaximumpos......
  • C语言max宏的进化
    C语言max宏的进化lv1:shit#defineMAX(a,b)a>b?a:b问题所在不必多言lv2:角度:参数也可为expr解:#defineMAX(a,b)(a)>(b)?(a):(b)bug示例:#i......
  • 在递增的链表中删除min到max之间的所有元素
    在递增的链表中删除min到max之间的所有元素存在一个递增的链表,其中相邻两个结点的数据域的值要么相等,要么就是后面的大于前面的,对该表进行删除值属于(min,max)包括min和m......
  • ABC 270 C - Simple path(树+dfs)
    第一次写出比较正经的树+dfs,这不得写篇博客题目大意:给定一棵树,具有n个节点,给定n-1条边,给定一个起点和终点,让我们输出从起点到终点的路径。SampleInput1Copy5......