博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-3887 Counting Offspring 树状数组+模拟栈
阅读量:5321 次
发布时间:2019-06-14

本文共 2063 字,大约阅读时间需要 6 分钟。

做树状数组专题,竟然还是没有看出这题可以用树状数组来写,表示有点不好意思啊。

原来树状数组之所以能够搞定这一题是因为我们在建立好一棵数时,通过反问一个节点的子孙们后,顺序对的变化数来统计有多少数字比该节点小的子孙节点。

该题用DFS搜索直接爆栈,所以恶心的写了一个模拟栈,其实要注意的就是每个节点要在第一次出栈时保留在栈,第二次才从栈中出去,亦即是当其孩子节点都被反问完之后。

这题还有一点不得不说的就是给定的边的关系没有确定,要建立一个双向的邻接表,这就相对与给定的点可以从不同的方向来看其从属关系,而给定的根节点就确定了这种关系。

代码如下:

#include 
#include
#include
#include
#define INF 10000000 #define MAXN 100005 using namespace std; struct Node {
int code, next; }edge[2*MAXN]; int N, M, head[MAXN], tol, res[MAXN], c[MAXN], visit[MAXN]; stack
stk; inline int lowbit(int x) {
return x & -x; } inline void update(int pos, int val) {
for (int i = pos; i <= N; i += lowbit(i)) {
c[i] += val; } } inline int getsum(int pos) {
int s = 0; for (int i = pos; i > 0; i -= lowbit(i)) s += c[i]; return s; } void modify(int a, int b) {
edge[tol].code = b; edge[tol].next = head[a]; head[a] = tol++; } void dfs(int f) {
int pos, code; stk.push(f); while (!stk.empty()) {
int pos = stk.top(); if (visit[pos]) {
stk.pop(); res[pos] = getsum(pos-1) - res[pos]; update(pos, 1); } else {
visit[pos] = 1; res[pos] = getsum(pos-1); for (int i = head[pos]; i != -1; i = edge[i].next) {
code = edge[i].code; if (!visit[code]) stk.push(code); } } } } int main() {
int a, b; while (scanf("%d %d", &N, &M), M|N) {
tol = 0; memset(head, -1, sizeof (head)); memset(c, 0, sizeof (c)); memset(visit, 0, sizeof (visit)); for (int i = 1; i < N; ++i) {
scanf("%d %d", &a, &b); modify(a, b); modify(b, a); } dfs(M); for (int i = 1; i <= N; ++i) {
printf(i == N ? "%d\n" : "%d ", res[i]); } } return 0; }

转载于:https://www.cnblogs.com/Lyush/archive/2012/02/25/2368160.html

你可能感兴趣的文章
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>
面向对象的优点
查看>>
套接口和I/O通信
查看>>
阿里巴巴面试之利用两个int值实现读写锁
查看>>
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
jequery动态创建form
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
第六次java作业
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
Jenkins执行批处理文件失败
查看>>