hdu 4366 Successor (线段树xdfs序x排序预处理)
来源:互联网 发布:中国大学生失业数据 编辑:程序博客网 时间:2024/05/21 22:21
题意:
给一颗树,每个节点两个属性(x,y)。
每次查询一个子树中,x大于root(子树的根)且y最大的节点。
思路:
查询子树,很容易想到先求出dfs序然后用线段树维护y值。
但如何保证 x 呢?
如果让线段树初始为空,叶子的值是-1。
将节点按 x 从大到小排序,x 相等则 dfs序小的在前 (这里子树中root的dfs序最小)
然后只要按序查询每个节点对应的子树,然后将节点更新到线段树上。就预处理出了每个子树的答案。
int tr[N<<2], qL, qR;#define lc o<<1#define rc o<<1|1int query(int o, int l, int r) { if ( qL <= l && r <= qR ) return tr[o]; int m = (l + r) >> 1; if ( qR <= m ) return query(lc, l, m); if ( qL > m ) return query(rc, m+1, r); return max ( query(lc, l, m), query(rc, m+1, r) );}void modify(int o, int l, int r, int x, int v) { if ( l == r ) { tr[o] = v; return; } int m = (l + r) >> 1; if ( x <= m ) modify(lc, l, m, x, v); else modify(rc, m+1, r, x, v); tr[o] = max ( tr[lc], tr[rc] );}vector<int> graph[N];int ans[N];int L[N], R[N], loyaltyToId[1000005], timer;void dfs(int u) { L[u] = timer ++; for(int v:graph[u]) dfs(v); R[u] = timer - 1;}struct Node { int x, y, id; // loyality, ability bool operator < (const Node& rhs) const { if ( y != rhs.y ) return y > rhs.y; return L[id] < L[rhs.id]; }};Node as[N];int main() {#ifdef _LOCA_ENV_ freopen("input.in", "r", stdin);#endif // _LOCA_ENV int t, n, m; scanf("%d", &t); while ( t -- ) { scanf("%d%d", &n, &m); rep(i, 0, n-1) vector<int>().swap(graph[i]); rep(i, 1, n-1) { int x, y, z; scanf("%d%d%d", &x, &y, &z); graph[x].push_back(i); as[i] = (Node) {y, z, i}; loyaltyToId[y] = i; } timer = 1; dfs(0); memset(tr, -1, sizeof(tr)); memset(ans, -1, sizeof(ans)); sort(as + 1, as + n); for (int i = 1; i < n; ++ i) { int v = as[i].id; qL = L[v], qR = R[v]; int res = query(1, 1, n); if ( res != -1 ) ans[v] = loyaltyToId[res]; modify(1, 1, n, L[as[i].id], as[i].x); } rep(i, 1, m) { int x; scanf("%d", &x); printf("%d\n", ans[x]); } } return 0;}
0 0
- hdu 4366 Successor (线段树xdfs序x排序预处理)
- hdu 4366 Successor dfs序 + 线段树
- HDU 4366 Successor 线段树
- hdu 4366 Successor 线段树
- HDU 4366 Successor(dfn序 + 线段树)
- HDU 4366 Successor(线段树)
- hdu 4366 Successor(线段树)
- [线段数]hdu 4366 Successor
- HDU 4366 Successor(线段树 DFS时间戳)
- HDU 4366 Successor [树形转线形+线段树]【数据结构+技巧】
- 【线段树】 HDOJ 4366 Successor
- Successor (线段树)
- [HDU4366]Successor 线段树
- hdu 4366 Successor
- hdu 4366 Successor
- HDU 4366 Successor
- HDU 4366 Successor(分块)
- HDU 5726 GCD(线段树+预处理)
- linux下epoll如何实现高效处理百万句柄的
- 自旋锁和互斥锁区别
- 双向链表
- eclipse新建maven web项目流程
- BZOJ 3931 网络吞吐量 (最短路+最大流)
- hdu 4366 Successor (线段树xdfs序x排序预处理)
- Attribute "scope" must be declared for element type "bean"
- java字符与对应Ascii码互转
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- UISearchbar 搜索按钮更换 代码实现UISearchbar去除第一响应
- 用apktool反编译的时候出错:Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec:
- mongoose模块自动生成_id
- Unity_使用NGUI插件点击控件时同时检测到点击地面的解决方案
- import 简化Spring 配置文件