开始zz写了一个主席树,后来发现写个树状数组就行~

  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <bits/stdc++.h>
  5. #define N 100005
  6. #define ll long long
  7. #define setIO(s) freopen(s".in","r",stdin)
  8. using namespace std;
  9. int length,weight;
  10. namespace BIT
  11. {
  12. int C[N];
  13. int lowbit(int t)
  14. {
  15. return t&(-t);
  16. }
  17. void update(int x,int v)
  18. {
  19. for(;x<N;x+=lowbit(x)) C[x]+=v;
  20. }
  21. int query(int x)
  22. {
  23. int re=0;
  24. for(;x>0;x-=lowbit(x)) re+=C[x];
  25. return re;
  26. }
  27. };
  28. ll answer;
  29. struct Node
  30. {
  31. int u,d1,d2;
  32. Node(int u=0,int d1=0,int d2=0):u(u),d1(d1),d2(d2){}
  33. };
  34. vector<Node>v;
  35. bool cmp(Node a,Node b)
  36. {
  37. return a.d2<b.d2;
  38. }
  39. int n,edges,root,sn;
  40. int hd[N],to[N<<1],nex[N<<1],val[N<<1];
  41. int size[N],mx[N],vis[N],rt[N];
  42. void add(int u,int v,int c)
  43. {
  44. nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
  45. }
  46. void getroot(int u,int ff)
  47. {
  48. size[u]=1,mx[u]=0;
  49. for(int i=hd[u];i;i=nex[i])
  50. if(to[i]!=ff&&!vis[to[i]])
  51. getroot(to[i],u),size[u]+=size[to[i]],mx[u]=max(mx[u],size[to[i]]);
  52. mx[u]=max(mx[u],sn-size[u]);
  53. if(mx[u]<mx[root]) root=u;
  54. }
  55. // d1<=l d2<=w
  56. void getdis(int u,int ff,int d1,int d2)
  57. {
  58. v.push_back(Node(u,d1,d2));
  59. for(int i=hd[u];i;i=nex[i])
  60. if(to[i]!=ff&&!vis[to[i]])
  61. getdis(to[i],u,d1+1,d2+val[i]);
  62. }
  63. ll calc(int u,int D1,int D2)
  64. {
  65. getdis(u,0,D1,D2);
  66. sort(v.begin(),v.end(),cmp);
  67. ll re=0;
  68. int i,j,l=0,r=(int)v.size()-1;
  69. for(i=1;i<(int)v.size();++i) BIT::update(v[i].d1+1,1);
  70. while(l<r)
  71. {
  72. if(v[l].d2+v[r].d2<=weight)
  73. {
  74. re+=(ll)BIT::query(length-v[l].d1+1);
  75. ++l,BIT::update(v[l].d1+1,-1);
  76. }
  77. else
  78. {
  79. BIT::update(v[r].d1+1,-1);
  80. --r;
  81. }
  82. }
  83. v.clear();
  84. return re;
  85. }
  86. void solve(int u)
  87. {
  88. vis[u]=1;
  89. answer+=calc(u,0,0);
  90. for(int i=hd[u];i;i=nex[i]) if(!vis[to[i]]) answer-=calc(to[i],1,val[i]);
  91. for(int i=hd[u];i;i=nex[i])
  92. if(!vis[to[i]])
  93. sn=size[to[i]],root=0,getroot(to[i],u),solve(root);
  94. }
  95. int main()
  96. {
  97. int i,j;
  98. // setIO("input");
  99. scanf("%d%d%d",&n,&length,&weight);
  100. for(i=1;i<n;++i)
  101. {
  102. int a=i+1,b,c;
  103. scanf("%d%d",&b,&c),add(a,b,c),add(b,a,c);
  104. }
  105. mx[root=0]=sn=n,getroot(1,0),solve(root);
  106. printf("%lld\n",answer);
  107. return 0;
  108. }

  

CF293E Close Vertices 点分治+树状数组的更多相关文章

  1. BZOJ_3262_陌上花开_CDQ分治+树状数组

    BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...

  2. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  3. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  4. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  5. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  6. BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组

    BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...

  7. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  8. BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组

    BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description        给定N个数对(xi, yi),求最长上升子 ...

  9. BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组

    BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...

随机推荐

  1. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...

  2. OpenTSDB在HBase中的底层数据结构设计

    0.时序数据库 时间序列(Time Series):是一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,1小时等). 时间序列数据可被简称为时序数据. ...

  3. 云数据库RDS SQL Server 版

    云数据库RDS SQL Server版是一种可弹性伸缩的在线数据库服务,并具备自动监控.备份.容灾恢复等方面的全套解决方案,彻底解决数据库运维的烦恼 请观看视频简介 SQL Server是发行最早的商 ...

  4. git使用技巧集合(持续更新中)

    git使用技巧集合(持续更新中) 在团队协作中,git.svn等工具是非常重要的,在此只记录一些git使用过程中遇到的问题以及解决方法,并且会持续更新. 1.git commit之后,还没push,如 ...

  5. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

  6. idea 设置自动生成注释

    idea新建类注释规则 /** @ProjectName: ${PROJECT_NAME} @Package: ${PACKAGE_NAME} @ClassName: ${NAME} @Descrip ...

  7. Python应用RabbitMQ教程

    介绍 RabbitMQ是一个消息代理.它的工作就是接收和转发消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ就扮演着邮箱.邮局以及邮 ...

  8. sql server delete语句

    delete语句 --DELETE 语句用于删除表中的行 语法:delete from 表名称 where 列名称 = 值 --可以在不删除表的情况下删除所有的行.这意味着表的结构.属性和索引都是完整 ...

  9. python发起post请求获取json数据使用requests方法

    最普通的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的 . 可能很多人都已经猜到了答案是: 1.GET 使用URL或Cookie传参.而POS ...

  10. kill指定用户所有进程

    在linux系统管理中,我们有时候需要kill某个用户的所有进程,这里有以下几种方法,以heboan用为例 pkill方式 pkill -u heboan killall方式 killall -u h ...