题目链接 Treeland Tour

题目就是让你求树上LIS

先离散化,然后再线段树上操作。一些细节需要注意一下。

#include <bits/stdc++.h>using namespace std;#define rep(i, a, b)   for (int i(a); i <= (b); ++i)
#define dec(i, a, b)    for (int i(a); i >= (b); --i)typedef long long LL;const int N = 200010;int root[N];
int ls[N * 40], rs[N * 40], lis[N * 40], lds[N * 40];
int ncnt, n, ans;
int ret = 0;
vector <int> v[N];
int val[N];
int sx[N];
int icnt = 0;void merge(int &x, int y){if (!x || !y){x = x + y;return;}lis[x] = max(lis[x], lis[y]);lds[x] = max(lds[x], lds[y]);ret = max(ret, max(lis[ls[x]] + lds[rs[y]], lds[rs[x]] + lis[ls[y]]));merge(ls[x], ls[y]);merge(rs[x], rs[y]);
}void modify(int &x, int l, int r, int t, int v, int *a){if (!x) x = ++ncnt;a[x] = max(a[x], v);if (l == r) return;int mid = (l + r) >> 1;if (t <= mid) modify(ls[x], l, mid, t, v, a);else modify(rs[x], mid + 1, r, t, v, a);
}int query(int x, int l, int r, int ql, int qr, int *a){if (l > r) return 0;if (!x) return 0;if (ql <= l && r <= qr) return a[x];int ret = 0, mid = (l + r) >> 1;if (ql <= mid) ret = max(ret, query(ls[x], l, mid, ql, qr, a));if (qr >  mid) ret = max(ret, query(rs[x], mid + 1, r, ql, qr, a));return ret;
}void dfs(int x, int fa){for (auto u : v[x]){if (u == fa) continue;dfs(u, x);}ret = 0;int nlis = 0, nlds = 0, ilis, ilds;for (auto u : v[x]){if (u == fa) continue;ilis = query(root[u], 1, icnt, 1, val[x] - 1, lis);ilds = query(root[u], 1, icnt, val[x] + 1, icnt, lds);merge(root[x], root[u]);ans = max(ans, ilis + nlds + 1);ans = max(ans, ilds + nlis + 1);nlis = max(nlis, ilis);nlds = max(nlds, ilds);}ans = max(ans, ret);modify(root[x], 1, icnt, val[x], nlis + 1, lis);modify(root[x], 1, icnt, val[x], nlds + 1, lds);
}int main(){scanf("%d", &n);rep(i, 1, n){scanf("%d", val + i);sx[++icnt] = val[i];}sort(sx + 1, sx + icnt + 1);icnt = unique(sx + 1, sx + icnt + 1) - sx - 1;rep(i, 1, n) val[i] = lower_bound(sx + 1, sx + icnt + 1, val[i]) - sx;rep(i, 2, n){int x, y;scanf("%d%d", &x, &y);v[x].push_back(y);v[y].push_back(x);}dfs(1, 0);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/cxhscst2/p/7219887.html

Codeforces 490F Treeland Tour(离散化 + 线段树合并)相关推荐

  1. [牛客网#35D 树的距离]离散化+线段树合并

    [牛客网#35D 树的距离]离散化+线段树合并 分类:Data Structure SegMent Tree Merge 1. 题目链接 [牛客网#35D 树的距离] 2. 题意描述 wyf非常喜欢树 ...

  2. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)

    题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...

  3. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...

  4. Codeforces 600E Lomsat gelral 树上启发式合并,线段树合并.

    文章目录 题意 题解 update:洛谷上已经可交此题. 题意 给一棵1为根的树,每个点有个颜色,求每一个点的子树里出现最多的颜色的和. 题解 我们用两组nnn个mapcnt和summap\ cnt和 ...

  5. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  6. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  7. loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】

    题目链接 loj2537 题解 观察题目的式子似乎没有什么意义,我们考虑计算出每一种权值的概率 先离散化一下权值 显然可以设一个\(dp\),设\(f[i][j]\)表示\(i\)节点权值为\(j\) ...

  8. bzoj4399 魔法少女LJJ 线段树合并

    只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...

  9. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  10. 大根堆 HYSBZ - 4919 线段树合并

    Part 0 ​ 由这题,可以联想到最长不下降子序列.对于每个节点,我们定义DP[i]为这个子树内所有节点堆顶元素等于i时的最大的堆的大小.我们可以把这个数组放在线段树上维护.线段树的叶子节点存的就是 ...

最新文章

  1. NeHe教程Qt实现——lesson16
  2. 深度学习在gilt应用——用图像相似性搜索引擎来商品推荐和服务属性分类
  3. matlab氢原子杂化轨道,网络版原子和分子结构可视化程序的开发
  4. oracle11g session,Oracle11g中Killsession心得
  5. 管理中的计算机应用真题,0051管理系统中计算机应用试题历年真题
  6. 【2017满分】尔雅 刘忠良 绿色康复答案题库
  7. telnet批量ip端口测试连通自动脚本
  8. 金蝶K3案例教程总账后台配置
  9. 计算机三级网络技术考过指南 【历年考点汇总】
  10. ASP.NET身份验证和授权,使用cookie和Claims认证
  11. 对话仟峰资本Steven:DeFi大赢家是怎样炼成的 |链捕手
  12. 如何制作网页教程:如何制作网页最简单的方法
  13. web.xml不同版本的头
  14. 写给IT自学者的入门指南
  15. 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
  16. 搭建微信小程序转码机器人教程
  17. 微信ios接入-Objc -all_load的坑
  18. 搭建spring-boot+vue前后端分离框架并实现登录功能
  19. AliOS Developer 网址
  20. java将office文件转化为PDF(含PPT、Excel、word)

热门文章

  1. mysql 相关操作
  2. 【转载】Java工程师路线图
  3. MySQL数据库删除数据(有外键约束)
  4. sso(single sign on)介绍
  5. Css/Js推荐类库
  6. centos开机卡进度解决方案
  7. freeCodeCamp:Seek and Destroy
  8. 抓包工具Charles使用教程
  9. iOS中的 深拷贝和浅拷贝
  10. STL之map容器的详解