• Apple Tree (dfs序+线段树)


    Apple Tree (dfs序+线段树)

     1 /*dfs+线段树(单点修改+区间查询)*/
     2 #include "iostream"
     3 #include "vector"
     4 #include "map"
     5 #include "cstdio"
     6 #include "cstring"
     7 
     8 using namespace std;
     9 typedef long long ll;
    10 const int maxn = 100005;
    11 int n,m,_time,cnt;
    12 int num[maxn],in[maxn],out[maxn],last[maxn];
    13 int sum[maxn<<2];
    14 struct data{
    15     int to,_next;
    16 }e[maxn<<1];
    17 
    18 void add(int u,int v){
    19     e[++cnt].to = v; e[cnt]._next=last[u]; last[u]=cnt;
    20     e[++cnt].to = u; e[cnt]._next=last[v]; last[v]=cnt;
    21 }
    22 
    23 void dfs_arr(int x,int fa){
    24     in[x]=++_time;
    25     num[_time]=x;
    26     for(int i=last[x];i;i=e[i]._next){
    27         if( e[i].to!=fa ) dfs_arr(e[i].to,x);
    28     }
    29     out[x]=_time;
    30 }
    31 
    32 void build(int pt,int l,int r){
    33     int mid=(l+r)>>1;
    34     if( l==r ){
    35         sum[pt]=1;
    36         return ;
    37     }
    38     build(pt<<1,l,mid);
    39     build(pt<<1|1,mid+1,r);
    40     sum[pt] = sum[pt<<1]+sum[pt<<1|1];
    41 }
    42 
    43 int query(int pt,int L,int R, int l,int r){
    44     if( L<=l&&R>=r ) return sum[pt];
    45     int mid=(l+r)>>1;
    46 
    47     int sum=0;
    48     if( L<=mid ) sum+=query(pt<<1,L,R,l,mid);
    49     if( R>mid ) sum+=query(pt<<1|1,L,R,mid+1,r);
    50     return sum;
    51 }
    52 
    53 void modify(int pt,int x,int l,int r)
    54 {
    55     int mid=(l+r)>>1;
    56     if( l==r )
    57     {
    58         sum[pt]^=1;
    59         return ;
    60     }
    61     if( x<=mid ) modify(pt<<1,x,l,mid);
    62     else modify(pt<<1|1,x,mid+1,r);
    63     sum[pt] = sum[pt<<1]+sum[pt<<1|1];
    64     return ;
    65 }
    66 
    67 
    68 int main()
    69 {
    70     scanf("%d",&n);
    71     for(int i=1;i<n;i++ ){
    72         int u,v;
    73         scanf("%d%d",&u,&v);
    74         add(u,v);
    75     }
    76     dfs_arr(1,0);
    77     scanf("%d",&m);
    78     char ch[10];
    79     build(1,1,n);
    80     for(int i=1;i<=m;i++){
    81         scanf("%s",ch+1);
    82         int x;
    83         scanf("%d",&x);
    84         if( ch[1]=='Q' ) printf("%d
    ",query(1,in[x],out[x],1,n));
    85         else modify(1,in[x],1,n);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    git将已存在的项目转换成git项目&托管git服务器
    联合索引
    MyISAM和InnoDb的关系
    NPOIHelper
    C# CRC各种转换
    appcloud 微信分享大图片
    C# 微信JSSDK 获取配置信息
    简易delegate委托
    GPS、谷歌、百度、高德坐标相互转换
    反射执行方法WINFROM
  • 原文地址:https://www.cnblogs.com/wsy107316/p/11959192.html
Copyright © 2020-2023  润新知