时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
在卡卡的房子外面,有一棵苹果树。每年的春天,树上总会结出很多的苹果。卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树。我们知道树是有很多分叉点的,苹果会长在枝条的分叉点上面,且不会有两个苹果结在一起。卡卡很想知道一个分叉点所代表的子树上所结的苹果的数目,以便研究苹果树哪些枝条的结果能力比较强。

卡卡所知道的是,每隔一些时间,某些分叉点上会结出一些苹果,但是卡卡所不知道的是,总会有一些调皮的小孩来树上摘走一些苹果。

于是我们定义两种操作:

C x

表示编号为x的分叉点的状态被改变(原来有苹果的话,就被摘掉,原来没有的话,就结出一个苹果)

G x

查询编号为x的分叉点所代表的子树中有多少个苹果

我们假定一开始的时候,树上全都是苹果,也包括作为根结点的分叉1。

输入描述 Input Description
第一行一个数N (n<=100000)

接下来n-1行,每行2个数u,v,表示分叉点u和分叉点v是直接相连的。

再接下来一行一个数M,(M<=100000)表示询问数

接下来M行,表示询问,询问的格式如题目所述Q x或者C x

输出描述 Output Description
对于每个Q x的询问,请输出相应的结果,每行输出一个

样例输入 Sample Input
3

1 2

1 3

3

Q 1

C 2

Q 1

样例输出 Sample Output
3

2
写在前面:为这不美好的世界献上祝福


思路:刚开始不知道用dfs序,因此不知道怎么搞线段树or树状数组
自己胡搞的90分代码,被一条100000长的链给卡死了:

#include "cstdio"
#include "cstring"
#include<iostream>
#include<algorithm>
using namespace std;
int tot,n,m,x,y;
int first[100010],father[100010],num[100010];
struct os
{int fa,son,next;
}a[200010];
struct node
{int root,sum;
}tree[400010];
inline void add(int x,int y)
{a[++tot].fa=x;a[tot].son=y;a[tot].next=first[x];first[x]=tot;
}
inline void build(int root)
{int k=first[root];tree[root].sum=1;while (k){if (!father[a[k].son]){father[a[k].son]=root;build(a[k].son);tree[root].sum+=tree[a[k].son].sum;}k=a[k].next;}
}
inline void change(int root,int x)
{if (root==0) return;tree[root].sum+=x;change(father[root],x);
}
inline int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch>='0'&&ch<='9') t=t*10+ch-'0',ch=getchar();return t;
}
main()
{n=in();for (int i=1;i<n;i++){x=in();y=in();add(x,y);num[x]=num[y]=1;add(y,x);}m=in(); father[1]=-1;build(1);for (int i=1;i<=m;i++){char ch=getchar();while (ch!='C'&&ch!='Q') ch=getchar();x=in();if (ch=='C'){num[x]=1-num[x];if (num[x])change(x,1);else change(x,-1);}else printf("%d\n",tree[x].sum);}
}

100分dfs+线段树

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int tot,n,m,x,y,first[100010],l[200010],r[200010],sum,d[100010];
bool flag[100010];
struct os
{int next,fa,son;
}a[200010];
struct node
{int sum;
}tree[400010];
void add(int x,int y)
{a[++tot].fa=x;a[tot].son=y;a[tot].next=first[x];first[x]=tot;
}
void dfs(int x)
{int k=first[x];l[x]=++sum;flag[x]=1;while (k){if (!flag[a[k].son]) dfs(a[k].son);k=a[k].next;}r[x]=sum;
}
void build(int root,int begin,int end)
{if (begin==end) {tree[root].sum=1;return;}int mid=(begin+end)/2;build(root*2,begin,mid);build(root*2+1,mid+1,end);tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}
void update(int root,int begin,int end,int x,int num)
{if (begin==end) {tree[root].sum+=num;return;}int mid=(begin+end)/2;if (mid>=l[x]) update(root*2,begin,mid,x,num);else update(root*2+1,mid+1,end,x,num);tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}
int get(int root,int begin,int end,int x)
{if (l[x]<=begin&&end<=r[x]) return tree[root].sum;int mid=(begin+end)/2,ans=0;if (mid>=l[x]) ans+=get(root*2,begin,mid,x);if (mid<r[x]) ans+=get(root*2+1,mid+1,end,x);return ans;
}
main()
{scanf("%d",&n);for (int i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);dfs(1);build(1,1,n);scanf("%d",&m);for (int i=1;i<=m;i++){char ch=getchar();while (ch!='C'&&ch!='Q') ch=getchar();scanf("%d",&x);if (ch=='Q') printf("%d\n",get(1,1,n,x));else {flag[x]=1-flag[x];if (flag[x]) update(1,1,n,x,1);else update(1,1,n,x,-1);}}
}

【codevs1228】苹果树,哦相关推荐

  1. NOIP知识汇总及模板整理

    排序 求逆序对 NOIP2013火柴排队 洛谷 P2309 loidc 卖卖萌 二分 牢记二分姿势 前缀和及差分优化 NOIP2012借教室差分优化 贪心 洛谷 P3093 牛奶调度 HDU 5500 ...

  2. P2015 二叉苹果树

    传送门 这道题要用到链式前向星... 非常标准的树形背包DP 只要理解了,题就不难 只要理解了...... 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树 ...

  3. 苹果树的故事(转发的)

    一棵苹果树,终于结果了. 第一年,它结了十个苹果,九个被拿走,自己得到一个.对此,苹果树愤愤不平,于是自断经脉,拒绝成长.第二年,它结了五个苹果,四个被拿走,自己得到一个."哈哈,去年我得到 ...

  4. 洛谷 P2015 二叉苹果树

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...

  5. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  6. JZOJ 1016. 【PKU3321】苹果树

    Description 你家门前种了一棵苹果树,每年秋天,树上都结满了苹果,你非常喜欢吃苹果,所以一直精心照料着苹果树. 苹果树有N个分叉,分叉之间由枝干相连,你把分叉用1到N来标记,树根必须记为1. ...

  7. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  8. 苹果树(线段树+Dfs序)

    1228 苹果树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结 ...

  9. 兰州大学第一届 飞马杯 ★★快乐苹果树★★ 树链剖分 + 懒标记 + 树状数组

    传送门 文章目录 题意: 思路: 题意: 思路: 第一次听说树链剖分能在fa[top[i]]fa[top[i]]fa[top[i]]的地方加懒标记,学到了学到了. 首先不能被题目吓住,这个题目仔细剖析 ...

最新文章

  1. 机房收费系统总结【3】-数据库细节
  2. 一个很简单小数正负数行转列问题
  3. 免费资源:Typicons-免费图标字体
  4. 怎么判断噎到没噎到_怎么判断噎到没噎到
  5. Windows App开发之集合控件与数据绑定
  6. nfs上安装oracle,使用NFS安装oracle软件
  7. 2015.7.11js-10(无缝滚动)
  8. Windows 程序设计技巧
  9. java中ArrayList类的操作
  10. 如何拉取k8s镜像_K8s 从懵圈到熟练 – 镜像拉取这件小事
  11. 让你的创业失败的18个昏招 都归结到这里
  12. 2018-10-15
  13. Linux两台主机之间建立信任
  14. subgradients
  15. Thinkphp仿众图网图片素材下载站源码/自适应手机端资源下载站源码
  16. Matlab:求出n边凹多边形内角
  17. Win10系统无法使用VGAPlayer软件播放asf格式和VGA文件
  18. 《金山词霸2009 牛津版》插件工具加载
  19. PostgreSQL regress test
  20. PyTorch 11—简单图像定位

热门文章

  1. 【华为云分享】MongoDB-系统时钟跳变引发的风波
  2. 【华为云实战开发】10.经典的C++项目怎么在云端开发?
  3. 红橙Darren视频笔记 圆点loadingView 动画ANR
  4. * poj 1062 昂贵的礼物 dijkstra 枚举区间
  5. mac写html图片显示不出来解决方法
  6. linux下分割文件的方法,关于linux系统下分割大文件的方法
  7. 如何使用IntelliJ IDEA搭建spark开发环境(上)
  8. jdbc mysql 存储过程查询数据_jdbc调用mysql存储过程实现代码
  9. java基础知识点(2)—— 环境变量的配置
  10. unix iorp等待队列_FreeRTOS+POSIX之消息队列API详解