HDU 3974(DFS序 + 线段树lazy)
来源:互联网 发布:淘宝靠谱的美妆卖家 编辑:程序博客网 时间:2024/06/06 09:00
DFS序: 先序遍历保留进入和离开某个节点的时间(in和out) out-in+1就是以当前结点为根的树上的节点个数,out-in就是非根节点的个数,这样就将关系树转化成了线性。
(红色代表进入时间,绿色代表out的时间)
这样就得到了每个节点管辖的区间,将标号转化一下,就可以线段树了。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>using namespace std;int T;int n;const int maxn = 50000+10;vector<int>g[maxn];int cnt;int in[maxn],out[maxn];int indegree[maxn];void DFS(int x){ cnt++; in[x] = cnt; for(int i = 0 ; i < g[x].size() ; i++) { DFS(g[x][i]); } out[x] = cnt;}void Init(){ memset(indegree,0,sizeof(indegree)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); cnt = 0; for(int i = 0 ; i < n ; i++) { g[i].clear(); }}struct SegTree{ int l,r; int job=-1; int lazy;} s[maxn<<2];void pushdown(int i){ if(s[i].lazy != -1) { s[i<<1].lazy = s[i<<1|1].lazy = s[i].lazy; s[i<<1].job = s[i].job; s[i<<1|1].job = s[i].job; s[i].lazy = -1; }}void build(int l, int r, int i){ s[i].l = l; s[i].r = r; s[i].lazy = -1; s[i].job = -1; if(l == r) return; int mid = (l+r) >> 1; build(l,mid,i<<1); build(mid+1,r,i<<1|1);}void update(int l,int r,int i,int x){ pushdown(i); if(l==s[i].l && s[i].r == r) { s[i].lazy = 1; s[i].job = x; return; } int mid = (s[i].l + s[i].r) >> 1; if(r<=mid) { update(l,r,i<<1,x); } else if(l>mid) { update(l,r,i<<1|1,x); } else { update(l,mid,i<<1,x); update(mid+1,r,i<<1|1,x); }}int q;void query(int pos, int i){ pushdown(i); if(s[i].l == s[i].r) { q = s[i].job; return; } int mid = (s[i].l + s[i].r) >> 1; if(pos <= mid) query(pos,i<<1); if(pos > mid) query(pos,i<<1|1);}int main(){ cin >> T; int kase = 1 ; while(T--) { Init(); cin >> n; int father,son; for(int i = 0 ; i < n-1 ; i++) { cin >> son >> father; g[father].push_back(son); indegree[son]++; } for(int i = 1 ; i <= n ; i++) { if(indegree[i] == 0) { DFS(i); break; } } build(1,cnt,1); printf("Case #%d:\n",kase++); int m; char ch; cin >> m; for(int i = 0 ; i < m ; i++) { cin >> ch; if(ch == 'C') { int x; cin >> x; q = -1; query(in[x],1); cout << q << endl; } else { int pos,to; cin >> pos >> to; update(in[pos],out[pos],1,to); } } } return 0;}
阅读全文
0 0
- HDU 3974(DFS序 + 线段树lazy)
- HDU-3974 DFS序+线段树
- hdu 1556 lazy线段树
- 线段树+dfs HDU
- hdu(4325)线段树+离散化+lazy
- HDU 3954 线段树 特殊LAZY操作
- HDU 4578 线段树 多lazy操作
- hdu 4578 线段树lazy标记
- hdu--3468(线段树+lazy思想)
- hdu 3577 Fast Arrangement(线段树+lazy)
- hdu 3911, 3397 线段树 lazy tag
- HDU 3974 Assign the task (线段树+dfs序)
- hdu 5039 Hilarity(dfs序 + 线段树)
- [HDU 5039 Hilarity] DFS序+线段树
- HDU 5039 Hilarity dfs序、线段树
- hdu 5039 线段树+dfs序
- HDU Hilarity (dfs序+线段树)
- hdu 4366 Successor dfs序 + 线段树
- hadoop+spark的安装 配置 新手
- 圆柱贴180度全景图片
- AC自动机完整代码——数组实现,非指针
- SDK目录结构及其作用
- VMware中Linux与Windows共享文件的一种简单好用方法
- HDU 3974(DFS序 + 线段树lazy)
- 图数据库初探之Neo4j
- 正则表达式学习笔记
- 比特币协议是怎样工作的(下)
- sql语句分类
- HIVE group by 和count(distinct)进行对比
- HTTP与HTTPS的区别
- 傅立叶变换详解
- hadoop 和spark的基准测试(1)