zoukankan      html  css  js  c++  java
  • Poj3321 apple tree

    zz:http://hzwer.com/8114.html

    题意

    给一棵n个节点的树,每个节点开始有一个苹果,m次操作
    1.将某个结点的苹果数异或 1
    2.查询一棵子树内的苹果数
    题解
    求出树的dfs序,即先序遍历,则一个子树的所有结点对应dfs序上连续的一段
    用线段树/树状数组实现单点修改和区间求和
    #include<map>
    #include<set>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define mod 998244353
    #define N 100005
    #define pi acos(-1)
    #define inf 0x7fffffff
    #define ll long long
    using namespace std;
    ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,id,cnt;
    int q[N],st[N],ed[N],last[N];
    int rl[N<<2],rr[N<<2],sum[N<<2];
    struct data{
        int to,next;
    }e[N<<1];
    void insert(int u,int v)
    {
        e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;
        e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
    }
    void dfs(int x,int fa)
    {
        q[++id]=x;
        st[x]=id;
        for(int i=last[x];i;i=e[i].next)
            if(e[i].to!=fa)
                dfs(e[i].to,x);
        ed[x]=id;
    }
    void build(int k,int l,int r)
    {
        int mid=(l+r)>>1;
        rl[k]=l;rr[k]=r;
        if(l==r)
        {
            sum[k]=1;
            return;
        }
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        sum[k]=sum[k<<1]+sum[k<<1|1];
    }
    int query(int k,int a,int b)
    {
        int l=rl[k],r=rr[k],mid=(l+r)>>1;
        if(l==a&&r==b)
            return sum[k];
        if(b<=mid)return query(k<<1,a,b);
        else if(a>mid)return query(k<<1|1,a,b);
        else 
            return query(k<<1,a,mid)+query(k<<1|1,mid+1,b);
    }
    void modify(int k,int x)
    {
        int l=rl[k],r=rr[k],mid=(l+r)>>1;
        if(l==r)
        {
            sum[k]^=1;
            return;
        }
        if(x<=mid)modify(k<<1,x);
        else modify(k<<1|1,x);
        sum[k]=sum[k<<1]+sum[k<<1|1];
    }
    int main()
    {
        n=read();
        for(int i=1;i<n;i++)
        {
            int u=read(),v=read();
            insert(u,v);
        }
        dfs(1,0);
        m=read();
        char ch[10];
        build(1,1,n);
        for(int i=1;i<=m;i++)
        {
            scanf("%s",ch+1);
            int x=read();
            if(ch[1]=='Q')
                printf("%d
    ",query(1,st[x],ed[x]));
            else 
                modify(1,st[x]);        
        }
        return 0;
    }
    

      

  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/cutemush/p/11799620.html
Copyright © 2011-2022 走看看