DFS找到节点删除的时间,删除的时间其实就是子树的最长链,然后给每个点打一个时间戳,然后求每个时间点对应删除的节点的个数,对于1-max_time时间戳求一个前缀和,然后二分找到和m距离最近的那一天

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<string.h>
  4. #include<stdio.h>
  5. #include<vector>
  6. #include<map>
  7. using namespace std;
  8. const int maxx = 2e5+;
  9. const int INF = 0x3f3f3f3f;
  10. vector<int>v;
  11. int ver[maxx],edge[maxx],Next[maxx],head[maxx];
  12. int sz[maxx];
  13. int vis[maxx];
  14. int cnt[maxx];
  15. int pre[maxx];
  16. int tot,n,mx,m;
  17. void add(int u,int v){
  18. ver[++tot]=v;Next[tot]=head[u];head[u]=tot;
  19. ver[++tot]=u;Next[tot]=head[v];head[v]=tot;
  20. }
  21. int dfs(int u,int fa){
  22. for (int i=head[u];i;i=Next[i]){
  23. int v=ver[i];
  24. if (v==fa)continue;
  25. vis[u]=max(vis[u],dfs(v,u));
  26. }
  27. return vis[u]+;
  28. }
  29. int main(){
  30. int q;
  31. int uu,vv,st;
  32. scanf("%d%d",&n,&q);
  33. tot=;
  34. for (int i=;i<=n;i++){
  35. scanf("%d",&uu);
  36. sz[uu]++;
  37. sz[i]++;
  38. if(uu==){
  39. st=i;
  40. continue;
  41. }
  42. add(uu,i);
  43. }
  44. for (int i=;i<=n;i++){
  45. if(sz[i]== && i!=st){
  46. vis[i]=;
  47. }
  48. }
  49. dfs(st,);
  50. mx=;
  51. for (int i=;i<=n;i++){
  52. cnt[vis[i]]++;
  53. mx=max(mx,vis[i]);
  54. }
  55. for (int i=;i<=mx;i++){
  56. pre[i]=pre[i-]+cnt[i];
  57. }
  58. pre[]=;
  59. v.push_back(n);
  60. for (int i=;i<=mx;i++){
  61. v.push_back(n-pre[i]);
  62. }
  63. reverse(v.begin(),v.end());
  64. int ans;
  65. while(q--){
  66. scanf("%d",&m);
  67. int pos=lower_bound(v.begin(),v.end(),m)-v.begin();
  68. // cout<<"ss"<<pos<<endl;
  69. if (pos==v.size()){
  70. printf("1\n");
  71. }else if (pos==){
  72. printf("%d\n",v.size());
  73. }else{
  74. if (abs(v[pos]-m)<=abs(v[pos-]-m)){
  75. printf("%d\n",v.size()-pos);
  76. }else {
  77. printf("%d\n",v.size()-pos+);
  78. }
  79. }
  80. }
  81. return ;
  82. }

hihocoder1994 树与落叶 DFS+前缀和+二分的更多相关文章

  1. Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)

    Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...

  2. ACdream1726-A Math game+(DFS+二分)+(DFS+前缀和)

    传送门 官方题解:http://acdream.info/topic?tid=4246 参考:https://www.cnblogs.com/nowandforever/p/4492428.html ...

  3. Codeforces 948 数论推导 融雪前缀和二分check 01字典树带删除

    A. 全部空的放狗 B. 先O(NLOGNLOGN)处理出一个合数质因数中最大的质数是多少 因为p1 x1 x2的关系是 x2是p在x1之上的最小倍数 所以x1的范围是[x2-p+1,x2-1]要使最 ...

  4. 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序

    [题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...

  5. BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)

    题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...

  6. 51Nod 1272最大距离 (树状数组维护前缀最小值)

    题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  7. Glider(前缀和+二分)

    题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...

  8. luogu SP8093 后缀自动机+树状数组+dfs序

    这题解法很多,简单说几个: 1. 线段树合并,时间复杂度是 $O(nlog^2n)$ 的. 2. 暴力跳 $fail,$ 时间复杂度 $O(n\sqrt n),$ 比较暴力. 3. 建立后缀树后在 $ ...

  9. Acwing:102. 最佳牛围栏(前缀和 + 二分)

    农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最 ...

随机推荐

  1. java 7,8 排序异常

    排序报 java.lang.IllegalArgumentException: Comparison method violates its general contract! 要明确返回-1, 0, ...

  2. 【solr】Solr5.5.4单机部署

    Solr5.5.4单机部署 Solr5和Solr4有很大区别,最为明显的就是Solr5已经可以独立部署,从Solr5开始,Solr已经不再以war包形式部署,Solr已经成为了一个独立的java服务端 ...

  3. python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁

    ps:python解释器有很多种,最常见的就是C python解释器 GIL全局解释器锁: GIL本质上是一把互斥锁:将并发变成串行,牺牲效率保证了数据的安全 用来阻止同一个进程下的多个线程的同时执行 ...

  4. JAVA Sftp 上传下载

    SftpUtils package xxx;import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com ...

  5. SQL Sever实验三 视图与数据更新

    一. 实验目的 1.掌握创建视图的 SQL 语句,数据更新的 SQL 语句. 2.了解使用创建视图向导创建视图的方法. 3.掌握使用 SQL 创建视图的方法,使用 SQL 更新数据的方法. 二. 实验 ...

  6. 【python之路16】作业

    #!usr/bin/env python # -*- coding:utf-8 -*- # 数据库中原有 old_dict = { "#1": {'hostname': 'c1', ...

  7. C# event 和delegate的区别

    其实说实话 event和delegate 并没有什么特别大的区别,event其实就是特殊化的delegate 1.调用上event只能+=和-=,这样做的意义是为了防止,其余的方法覆盖,但是deleg ...

  8. 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见

    题目描述 数据范围 =w= 设h[i]表示,甲队得到i分的方案数. 那么h[(n+k)/2]和h[(n−k)/2]就是答案. 设g[i]表示,甲队得到至少i分的方案数. 那么h[i]=g[i]−∑j& ...

  9. poj3463&&hdu1688 次短路(dijkstra)

    A*算法超内存. 对于最短路,我们可以维护dis[]数组,来求得最短路,但是此题有次短路,所以定义dis[][2],dis[][0]表示最短路,dis[][1]表示次短路;cnt[][2],cnt[] ...

  10. jQuery圆盘抽奖

    在线演示 本地下载