题目链接


题目大意:

给出一棵树,问有多少条路径权值和不大于www,长度不大于lll


解题思路:

  1. 首先树上路径问题大概率就是点分治了
  2. 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i)(li​,wi​)
  3. 那么就是查询查询x∈[0,l−li],y∈[0,w−wi]x\in[0,l-l_i],y\in[0,w-w_i]x∈[0,l−li​],y∈[0,w−wi​]这个二维平面里面有多少个点?
  4. 这就是很经典的二维数点问题了
  5. 因为www很大我们可以对www进行排序,然后用树状数组去维护lll.每次查询[0,l−li][0,l-l_i][0,l−li​]里面有多少个数就可以了

AC code

  1. 这里有个坑点就是www可以为0
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n, m, k;
vector<PII> G[maxn];
//.....
ll tr[maxn];
inline void add(int pos, int val) {while(pos < maxn) {tr[pos] += val;pos += lowbit(pos);}
}
inline ll sum(int pos) {if(pos <= 0) return 0;ll res = 0;while(pos) {res += tr[pos];pos -= lowbit(pos);}return res;
}
//.....
int siz[maxn], MX, root, node;
ll ans = 0;
bool vis[maxn];
inline void find_root(int u, int fa) {siz[u] = 1;int max_son = 0;for(auto it : G[u]) {if(vis[it.first] || it.first == fa) continue;find_root(it.first,u);max_son = max(max_son,siz[it.first]);siz[u] += siz[it.first];}max_son = max(max_son,node-siz[u]);if(MX > max_son) MX = max_son, root = u;
}
vector<PII> inf;
inline void dfs(int u, int fa, int length, ll w) {inf.push_back({w,length});for(auto it : G[u]) {if(it.first == fa || vis[it.first]) continue;dfs(it.first,u,length+1,w+it.second);}
}inline ll getans(int u, int up, bool is) { // is是否是容斥的 坑点 w=0inf.clear();if(is) inf.push_back({up,1});for(auto it : G[u]) {if(vis[it.first]) continue;dfs(it.first,u,is+1,up*is+it.second); }sort(inf.begin(),inf.end());ll res = 0;int j = 0;for(int i = inf.size()-1; i >= 0; i --) {while(j < inf.size() && inf[j].first <= k - inf[i].first) add(inf[j++].second,1);res += sum(m-inf[i].second);}while(j) j --, add(inf[j].second,-1);int one = 0;// one是单链for(auto it : inf) {if(it.first <= k && it.second <= m && is == 0)one ++;if(it.first * 2ll <= k && 2ll * it.second <= m)res --; // 自己和自己匹配到了}return res / 2 + one;// 除2是因为两个点相互匹配了
}inline void Div(int u) {vis[u] = 1;ans += getans(u,0,0);for(auto it : G[u]) {if(vis[it.first]) continue;ans -= getans(it.first,it.second,1);node = siz[it.first];MX = 1e9;find_root(it.first,u);Div(root);}
}int main() {IOS;cin >> n >> m >> k;for(int i = 2; i <= n; ++ i) {int fa, w;cin >> fa >> w;G[fa].push_back({i,w});G[i].push_back({fa,w});}node = n;MX = 1e9;find_root(1,0);Div(root);cout << ans;return 0;
}

点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)相关推荐

  1. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  2. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  3. CF 293 E Close Vertices (树的分治+树状数组)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一棵树,问有多少条路径权值和不大于w,长 ...

  4. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  5. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  6. 点分治问题 ----------- 2019-2020 ICPC Asia Hong Kong Regional Contest C.Constructing Ranches[点分治+树状数组]

    题目链接 题目大意: 给你一个nnn个顶点的树,树上的顶点都有一个自己的权值,现在问你有多少对(u,v)(u,v)(u,v),它们路径上点的权值集合可以组成一个多边形? 解题思路: 1.对于树上路径问 ...

  7. Luogu P4178 Tree (点分治 + 树状数组)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...

  8. Free tour II SPOJ - FTOUR2 点分治 + 树状数组

    传送门 文章目录 题意: 思路: 题意: 给你一个有nnn个点的树,有mmm个点拥堵,连接两个点的一条边有一个美丽值,让你选择一个路径,使其经过的拥堵点数不超过kkk且美丽值最大. n≤2e5,m≤n ...

  9. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

最新文章

  1. MyBatis 的工作原理,你了解过吗?
  2. 如何设置一个严格30分钟过期的Session
  3. 如何应対syn flood
  4. 云调用,小程序鉴权正确姿势
  5. WPF之Binding(转)
  6. 最长公共子序列Python解法
  7. 未定义标识符 stringc/c++(20)_到 2024 年,阿斯顿·马丁汽车销量的 20%以上将是电动汽车...
  8. 开发者如何快速精简容器云镜像?| 技术头条
  9. 【Learning】 动态树分治
  10. 采集gpu_GPU是怎么处理游戏画面?一文看懂显卡的工作原理,原来这么简单
  11. 利用python画简单图形示例代码_使用python画社交网络图实例代码
  12. (JavaScript案例)可拖动的模态框
  13. 正弦交流电的瞬时值、最大值、有效值
  14. Python之动态检测编码chardet
  15. View的事件分发机制
  16. C++ 重新定义继承而来的非虚函数
  17. linux系统查询服务器型号,Linux系统查看服务器型号
  18. 【蓝桥杯】最长子序列
  19. 简单爬虫,爬取天猫商品信息
  20. Linux下学习C语言编程(一)系统环境配置

热门文章

  1. 结构化综合布线系统中的干线子系统是指(33)。【答案】D
  2. 你了解如何用GAN做语义分割吗
  3. AIWalker是个什么样的号?为什么要推荐呢?聚焦low-level,关注AI最前沿
  4. 图像自标记的可视化指南
  5. opencv3.4.1 vs2017 鼠标停在 Mat 上 vs卡死
  6. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
  7. 山石网科发布智能下一代防火墙新版本 应对未知威胁
  8. 记录一次git的误删除操作--恢复
  9. Django快速开发之投票系统
  10. iPhone浏览器性能测试