HDU3974Assign the task(DFS序+线段树)
来源:互联网 发布:前端页面优化 编辑:程序博客网 时间:2024/06/09 21:41
/*translation: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。 有若干操作,分配给员工任务以及查询该员工正在执行的任务。solution: 线段树,时间戳一般化 很明显该公司的所有员工间的关系可以用一颗多叉树来表示。然后就是dfs给这棵树打上时间戳。根据新分配的id号码 将其节点对应映射到线段树上面。这样分配任务就相当与更新一段连续的节点,查询任务相当与单点查询。*/#include<bits/stdc++.h>using namespace std;#define N 50010struct Edge{ int to, nxt; Edge(){}; Edge(int _to, int _nxt):to(_to), nxt(_nxt){};}edge[N];struct SegTree{ int l, r, val, lazy;}seg[N<<2];int head[N], start[N], en[N], tol, cnt;bool used[N];void init(){ tol=cnt=0; memset(head, -1, sizeof(head));}void addedge(int u, int v){ edge[tol]=Edge(v, head[u]); head[u]=tol++;}void dfs(int u){ ++cnt; start[u]=cnt; for(int i=head[u]; i!=-1; i=edge[i].nxt) { dfs(edge[i].to); } en[u]=cnt;}void build(int l, int r, int rt){ seg[rt].l=l;seg[rt].r=r; seg[rt].val=-1;seg[rt].lazy=0; if(l==r) return ; int mid=(l+r)>>1; build(l, mid, rt<<1); build(mid+1, r, rt<<1|1);}void pushdown(int rt){ if(seg[rt].lazy) { seg[rt].lazy=0; seg[rt<<1].val=seg[rt<<1|1].val=seg[rt].val; seg[rt<<1].lazy=seg[rt<<1|1].lazy=1; }}void update(int rt, int l, int r, int val){ if(l<=seg[rt].l&&r>=seg[rt].r) { seg[rt].val=val; seg[rt].lazy=1; return ; } pushdown(rt); int mid=(seg[rt].l+seg[rt].r)>>1; if(r<=mid) update(rt<<1, l, r, val); else if(l>mid) update(rt<<1|1, l, r, val); else { update(rt<<1, l, mid, val); update(rt<<1|1, mid+1, r, val); }}int query(int rt, int u){ if(seg[rt].l==u&&seg[rt].r==u) return seg[rt].val; pushdown(rt); int mid=(seg[rt].l+seg[rt].r)>>1; if(u<=mid) return query(rt<<1, u); else return query(rt<<1|1, u);}int main(){ int T, u, v, n, m; scanf("%d", &T); for(int kase=1; kase<=T; kase++) { init(); memset(used, false, sizeof(used)); scanf("%d", &n); for(int i=1; i<n; i++) { scanf("%d%d", &u, &v); used[u]=true; addedge(v, u); } for(int i=1; i<=n; i++) if(!used[i]) { dfs(i); break; } build(1, cnt, 1); char op[10]; scanf("%d", &m); printf("Case #%d:\n", kase); while(m--) { scanf("%s", op); if(op[0]=='C') { scanf("%d", &u); printf("%d\n", query(1, start[u])); } else { scanf("%d%d", &u, &v); update(1, start[u], en[u], v); } } } return 0;}
阅读全文
0 0
- HDU3974Assign the task(DFS序+线段树)
- hdu3974Assign the task(简单树hash,线段树区间更新,单点查询)
- HDU 3974 Assign the task (线段树+dfs序)
- J - Assign the task(dfs序+线段树)J
- Assign the task(dfs+线段树_
- hdoj 3974 Assign the task 【DFS + 线段树区间修改】
- HDU 3974 Assign the task(DFS建树+线段树)
- HDU 3974 Assign the task (DFS + 线段树)
- HDU 3794 Assign the task (时间戳dfs序线段树)
- HDU-3974-Assign the task(线段树维护dfs序)
- HDU 3974 Assign the task(dfs序 + 线段树区间赋值,单点查询)
- HDU-3974 Assign the task题解报告【dfs序+线段树】
- HDU-3974 Assign the task (dfs序+线段树区间修改点查询)
- hdu3974 Assign the task(线段树/dfs)(好题)
- HDU Assign the task(dfs编号+线段树成段更新)
- HDU3974 - Assign the task(线段树)
- HDU 3974 Assign the task (线段树)
- HDU 3974 Assign the task(线段树)
- request与response以及编码的介绍
- 球钟问题
- 黑苹果的问题说明
- 动态更新全局数据
- RecyclerView中嵌套RecyclerView或其他可滑动布局抢占焦点的问题
- HDU3974Assign the task(DFS序+线段树)
- qt 设置阴影 不显示黑色边框
- Mike and gcd problem
- Java开发中的23种设计模式详解
- log4j2入门(二) 使用详解
- 操作系统下载
- 基于微信的产品设计01:注册登录及账号体系设计
- hdu 1814 Peaceful Commission(2-sat 染色)
- 研究领域、研究课题、研究方向三者的区别