线段树维护DFS序

Apple Tree

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e5+5;
int n,m,sum,fa[maxn];
struct Node{
    int l,r,val;
    int mid(){
        return (l+r)>>1;
}
}node[maxn<<2];
struct Edge{
    int to,next;
}edge[maxn];
int head[maxn],tot;
int In[maxn],Out[maxn],deg[maxn],id;
void add_edge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void dfs(int x,int f)
{
    In[x]=++id;
    deg[x]=id;
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        int y=edge[i].to;
        if(y==f) continue;
        dfs(y,x);
    }
    Out[x]=id;
}
//void BuildTree(int rt,int l,int r)
//{
//    node[rt].l=l,node[rt].r=r,node[rt].val=1;
//    if(l==r){
//        fa[l]=rt;
//        return;
//    }
//    int mid=node[rt].mid();
//    BuildTree(lson);
//    BuildTree(rson);
//}
//
//void UpdateTree(int rt)
//{
//    if(rt==1) return;
//    int fi=rt>>1;
//    node[fi].val=node[fi<<1].val+node[fi<<1|1].val;
//    UpdateTree(rt>>1);
//}
//
//void Query(int rt,int l,int r)
//{
//    if(node[rt].l==l&&node[rt].r==r){
//        sum+=node[rt].val;
//        return;
//    }
//    int mid=node[rt].mid();
//    if(mid>=r) Query(rt<<1,l,r);
//    else if(l>mid) Query(rt<<1|1,l,r);
//    else Query(lson),Query(rson);
//}
void Pushup(int rt)
{
    node[rt].val=node[rt<<1].val+node[rt<<1|1].val;
}
void BuildTree(int rt,int l,int r)
{
    node[rt].l=l,node[rt].r=r,node[rt].val=1;
    if(l==r){
        fa[l]=rt;
        return;
    }
    int mid=node[rt].mid();
    BuildTree(lson);
    BuildTree(rson);

    Pushup(rt);
}
void UpdateTree(int rt,int x)
{
    if(node[rt].l==node[rt].r)
    {
        if(node[rt].val) node[rt].val=0;
        else node[rt].val=1;
        return;
    }

    int mid=node[rt].mid();

    if(mid>=x) UpdateTree(rt<<1,x);
    else UpdateTree(rt<<1|1,x);

    Pushup(rt);
}
int QueryTree(int rt,int l,int r)
{
    if(node[rt].l==l&&node[rt].r==r)
        return node[rt].val;

    int mid=(node[rt].l+node[rt].r)>>1;
    int ans=0;
    if(mid>=r) ans+=QueryTree(rt<<1,l,r);
    else if(l>mid) ans+=QueryTree(rt<<1|1,l,r);
    else ans+=QueryTree(rt<<1,l,mid),ans+=QueryTree(rt<<1|1,mid+1,r);

    return ans;
}
int pre[maxn];
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        pre[i]=i,head[i]=-1;
    BuildTree(1,1,n);
    for(int i=1;i<n;i++)
    {
        int u=read(),v=read();
        pre[v]=u;
        add_edge(u,v);
    }
    for(int i=1;i<=n;i++)
        if(pre[i]==i) dfs(i,-1);

    m=read();
    while (m--)
    {
        char op; cin>>op;
        if(op=='C')
        {
            int x=read();
            UpdateTree(1,deg[x]);
        }
        else
        {
            int x=read();
            printf("%d\n",QueryTree(1,In[x],Out[x]));
        }
    }
    return 0;
}

树 状 数 组 维 护 D F S 序 树状数组维护DFS序 DFS

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define lowbit(x)  ((x)&-(x))
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e5+5;
int n,m,tree[maxn<<2];
struct Edge{
    int to,next;
}edge[maxn<<2];
int head[maxn],tot;
int In[maxn],Out[maxn],deg[maxn],id;
void add_edge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void dfs(int x,int f)
{
    In[x]=++id;
    deg[x]=id;
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        int y=edge[i].to;
        if(y==f) continue;
        dfs(y,x);
    }
    Out[x]=id;
}
void Update(int x,int k)
{
    while (x<=n)
        tree[x]+=k,x+=lowbit(x);
}
int Query(int x)
{
    int ans=0;
    while (x)
        ans+=tree[x],x-=lowbit(x);
    return ans;
}
int pre[maxn];
int a[maxn];
int main()
{
    n=read();
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
        Update(i,1),pre[i]=i,a[i]=1;
    for(int i=1;i<n;i++)
    {
        int u=read(),v=read();
        add_edge(u,v);
  //      add_edge(v,u);
        pre[v]=u;
    }
    for(int i=1;i<=n;i++)
        if(pre[i]==i)
            dfs(i,-1);
    m=read();
    while (m--)
    {
        char op; cin>>op;
        int x=read();
        if(op=='Q')
        {
            printf("%d\n",Query(Out[x])-Query(In[x]-1));
        }
        else
        {
            if(a[x])
                a[x]=0,Update(deg[x],-1);
            else a[x]=1,Update(deg[x],1);
        }
    }
    return 0;
}

Assign the task

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e6+5;
struct Node{
    int l,r,val;
    int mid(){
        return (l+r)>>1;
    }
}node[maxn<<2];
struct Edge{
    int to,next;
}edge[maxn];
int head[maxn],tot;
int In[maxn],nums[maxn],Out[maxn],id,pre[maxn];
void add_edge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void Pushdown(int rt)
{
    if(node[rt].val!=-1) {
        node[rt<<1].val=node[rt].val;
        node[rt<<1|1].val=node[rt].val;
        node[rt].val=-1;
    }
}
void BulidTree(int rt,int l,int r)
{
     node[rt].l=l,node[rt].r=r,node[rt].val=-1;

     if(l==r) return;

     int mid=node[rt].mid();
     BulidTree(rt<<1,l,mid);
     BulidTree(rt<<1|1,mid+1,r);

}
void UpdateTree(int rt,int l,int r,int col)
{

    if(l<=node[rt].l&&r>=node[rt].r){
        node[rt].val=col;
        return;
    }

    int mid=node[rt].mid();
    Pushdown(rt);

    if(r<=mid) UpdateTree(rt<<1,l,r,col);
    else if(l>mid) UpdateTree(rt<<1|1,l,r,col);
    else UpdateTree(rt<<1,l,mid,col),UpdateTree(rt<<1|1,mid+1,r,col);

}
int QueryTree(int pos,int rt)
{
    if(node[rt].l==node[rt].r) return node[rt].val;

    int mid=node[rt].mid();

    Pushdown(rt);

    if(pos<=mid) return QueryTree(pos,rt<<1);
    else return QueryTree(pos,rt<<1|1);
}
void dfs(int x,int fa)
{
    In[x]=++id;
    nums[x]=id;
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        int y=edge[i].to;
        if(y==fa) continue;
        dfs(y,x);
    }
    Out[x]=id;
}
void init(int n)
{
    tot=0, id=0;
    for(int i=0;i<=n;i++)
        In[i]=0,Out[i]=0,head[i]=-1,pre[i]=i;
}
int main()
{
    int t=read(),cas=0;
    while (t--)
    {
        int n=read();
        init(n);
        BulidTree(1,1,n);
        for(int i=1;i<n;i++)
        {
            int u=read(),v=read();
            pre[u]=v;
            add_edge(u,v);
            add_edge(v,u);
        }
        for(int i=1;i<=n;i++)
            if(pre[i]==i) { dfs(i,-1);break; }

        int m=read();
        printf("Case #%d:\n",++cas);
        while (m--)
        {
            char op; cin>>op;
            if(op=='C')
            {
                int x=read();
                printf("%d\n",QueryTree(nums[x],1));
            }
            else
            {
                int x=read(),col=read();
                UpdateTree(1,In[x],Out[x],col);
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值