E. Party Company

容易发现这是一颗树形结构,根节点为111,并且有点权从根节点开始递减。

题目大意就是给定一个点u,l,ru, l, ru,l,r,对于于uuu在同一个连通块里,并且点权是在[l,r][l, r][l,r]之间的点答案贡献加一。

如果理解到上述的题意,那这题就变得简单了。

由于我们要求的是在同一个联通块里的,并且点权具有单调性,我们可以通过二分跳转到可以满足的深度最小的节点上去,在这个节点依附上lll。

容易想到,满足要求的点一定是出现在这个节点的子树上的,所以我们可以动态维护一个以lll的有序数组,然后在每个节点二分查找,有多少个值是小于等于当前节点的,这个值就是当前节点的答案了。

当我们退出这颗子树的时候,记得清空这个节点上依附的lll。

由于l,rl, rl,r都比较小,所以可以直接通过树状数组,进行单点修改,前缀和查询,整体复杂度O(nlog⁡m+mlog⁡m)O(n \log m + m \log m)O(nlogm+mlogm)。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int head[N], to[N], nex[N], cnt = 1;int fa[N], son[N], sz[N], top[N], rk[N], id[N], dep[N], tot;int n, m, value[N], ans[N];vector<int> vt[N];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, sz[rt] = 1, dep[rt] = dep[f] + 1;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs1(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[to[i]] > sz[son[rt]]) {son[rt] = to[i];}}
}void dfs2(int rt, int tp) {top[rt] = tp, rk[++tot] = rt, id[rt] = tot;if (!son[rt]) {return ;}dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa[rt] || to[i] == son[rt]) {continue;}dfs2(to[i], to[i]);}
}void solve(int cur, int L, int R) {while (cur != 1) {if (fa[top[cur]] && value[fa[top[cur]]] <= R) {cur = fa[top[cur]];}else {int l = id[top[cur]], r = id[cur];while (l < r) {int mid = l + r >> 1;if (value[rk[mid]] > R) {l = mid + 1;}else {r = mid;}}vt[rk[l]].push_back(L);return ;}}vt[1].push_back(L);
}int tree[N];int lowbit(int x) {return x & (-x);
}void update(int x, int value) {while (x < N) {tree[x] += value;x += lowbit(x);}
}int query(int x) {int ans = 0;while (x) {ans += tree[x];x -= lowbit(x);}return ans;
}void dfs(int rt, int fa) {for (auto it : vt[rt]) {update(it, 1);}ans[rt] = query(value[rt]);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}dfs(to[i], rt);}for (auto it : vt[rt]) {update(it, -1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &m);for (int i = 1, fa; i <= n; i++) {scanf("%d %d", &value[i], &fa);if (i != 1) {add(fa, i);}}dfs1(1, 0);dfs2(1, 1);for (int i = 1; i <= m; i++) {int cur, l, r;scanf("%d %d %d", &cur, &l, &r);solve(cur, l, r);}dfs(1, 0);for (int i = 1; i <= n; i++) {printf("%d%c", ans[i], i == n ? '\n' : ' ');}return 0;
}

E. Party Company(树上问题)相关推荐

  1. E. Company(Codeforces Round #520 (Div. 2))

    E. Company 给定一颗有nnn个节点的树,有mmm次询问,每次询问给定[l,r][l, r][l,r],我们可以选择删除其中的一个点ppp,然后找到一个深度最深的rtrtrt,使得剩下的点都在 ...

  2. 【HDU】5140 Hun Gui Wei Company 主席树

    传送门:[HDU]5140 Hun Gui Wei Company 题目分析:一般情况下,区间很大的话,第一反应就是离散,我也不例外,但是本题的区间很大!并且重要的是强制在线让人不能离散!但是这样就能 ...

  3. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

  4. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  5. POJ - 3417 Network LCA+树上差分

    思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一. 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的 ...

  6. [CTSC2018]混合果汁 二分 套 主席树上二分

    题意: n种果汁,第iii种果汁的美味程度是did_idi​有lil_ili​​升,价格是pip_ipi​升 mmm个询问,要求使用果汁的总量不小于LimLimLim,价格不超过GGG,最大化所用的果 ...

  7. [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树

    题意题解: 首先对于树上某个点a来说,假设点b是a的祖先(也就是在a的上面),那么答案很好计算,也就是min(k,dep[a]−1)∗(size[a]−1)min(k,dep[a]-1)*(size[ ...

  8. P4216 [SCOI2015]情报传递 LCA+树上主席树 离线操作

    题意: 给你一棵n个点的树,初始每个位置没有点权 有m次操作 1 x:让一个点从当前时刻开始,每秒操作点权++ 2 x y c:查询一条链中有多少点的点权大于c 其中每秒操作点权++就是指我每操作一次 ...

  9. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

最新文章

  1. Tomcat5.5x+jndi配置
  2. 吴恩达登录知乎,亲自回答如何系统学习机器学习
  3. sql 插入text字段包含特殊字符_Kettle(PDI)转换中输出之插入/更新详解
  4. 解决Vue开发过程中与后台服务器跨域问题
  5. 2016蓝桥杯C++A组第六题 寒假作业【暴力搜索】
  6. 使用MVC框架中要注意的问题(一):修改首页以支持主题
  7. 2019 杭电多校第六场 题解
  8. 阵列函数 java_Java复制阵列– Java中的阵列复制
  9. 走迷宫(三):在XX限制条件下,是否走得出。
  10. 精灵混合加密系统_混合云的数据备份
  11. TFWmodi-修改tfw文件
  12. 嵇少峰:互联网金融草根时代终结
  13. 全球及中国26二氟苯磺酰氯行业发展状况与前景趋势分析报告2022-2028年
  14. 语义分割中样本分布不均衡怎么办
  15. 中兴交换机如何查看服务器设备,中兴交换机配置流程和配置命令(参考模板)...
  16. GitLab针对关键账户接管漏洞发布安全补丁
  17. 05导航指示-04树状导航栏-navlistview
  18. STM32任意IO模拟8080时序驱动TFTLCD屏
  19. TCP丢包原因、解决办法
  20. 非官方即时通信 IM,支持腾讯IM,环信IM,极光IM,融云IM,网易云信IM等

热门文章

  1. mvc 职能划分_MVC架构的职责划分原则
  2. java23种设计模式个人整理_java23种设计模式-行为型模式之模板方法模式
  3. 未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?
  4. @order注解_别再用ifelse了,用注解去代替他吧
  5. 研究表明,胸大无脑是不存在的......
  6. 叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界
  7. 你家猫砸东西是不是也专挑贵的砸?
  8. 都说Python库千千万,这几个你认识不?
  9. 荐书 | 10本书给你计算机大师思维
  10. c语言二维数组代码,C语言之二维数组(示例代码)