题解

树剖模板题,每次改变是\(1\)或者是\(0\),区间求和和区间修改就可了。

ac代码

# include <cstdio>
# include <cstring>
# include <algorithm>
# include <ctype.h>
# include <iostream>
# include <cmath>
# include <map>
# include <vector>
# include <queue>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf (0x7f7f7f7f)
# define pb push_back
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
# define N 100005
struct segment_tree{
    # define mid ((l+r)>>1)
    # define ls (nod<<1)
    # define rs (nod<<1|1)
    struct node{
        int l,r,s,tag;
    }tr[N<<2];
    void pushup(int nod){
        tr[nod].s=tr[ls].s+tr[rs].s;
    }
    void pushdown(int nod){
        int tmp=tr[nod].tag; tr[nod].tag=-1;
        if (tmp==-1) return;
        tr[ls].s=(tr[ls].r-tr[ls].l+1)*tmp;
        tr[rs].s=(tr[rs].r-tr[rs].l+1)*tmp;
        tr[ls].tag=tr[rs].tag=tmp;
    }
    void build(int l,int r,int nod){
        tr[nod].l=l,tr[nod].r=r,tr[nod].tag=-1,tr[nod].s=0;
        if (l>=r) return;
        build(l,mid,ls); build(mid+1,r,rs);
        pushup(nod);
    }
    void update_sec(int ql,int qr,int v,int nod){
        int l=tr[nod].l,r=tr[nod].r;
        if (ql<=l&&r<=qr){
            tr[nod].tag=v;
            tr[nod].s=(r-l+1)*v;
            return;
        }
        pushdown(nod);
        if (ql<=mid) update_sec(ql,qr,v,ls);
        if (qr>mid) update_sec(ql,qr,v,rs);
        pushup(nod);
    }
}tr;
struct edge{
    int to,nt;
}E[N<<1];
int son[N],top[N],sz[N],fa[N],H[N],dep[N],idx[N],pre[N];
int cnt,tot,n,m;
void addedge(int u,int v){
    E[++cnt]=(edge){v,H[u]}; H[u]=cnt;
}
void dfs1(int u,int ft,int dp){
    dep[u]=dp; fa[u]=ft; sz[u]=1;
    int maxson=-1;
    for (int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if (v==fa[u]) continue;
        dfs1(v,u,dp+1); sz[u]+=sz[v];
        if (sz[v]>maxson) maxson=sz[v],son[u]=v;
    }
}
void dfs2(int u,int tp){
    top[u]=tp; idx[u]=++tot; pre[tot]=u;
    if (!son[u]) return; dfs2(son[u],tp);
    for (int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if (v==fa[u]||v==son[u]) continue;
        dfs2(v,v);
    }
}
void update(int u,int v,int w){
    while (top[u]!=top[v]){
        if (dep[top[u]]<dep[top[v]]) swap(u,v);
        tr.update_sec(idx[top[u]],idx[u],w,1);
        u=fa[top[u]];
    }
    if (dep[u]>dep[v]) swap(u,v);
    tr.update_sec(idx[u],idx[v],w,1);
}
int main(){
//  freopen("data.in","r",stdin);
//  freopen("data.out","w",stdout);
    n=gi();
    for (int i=2;i<=n;i++){
        int u=gi();
        addedge(u+1,i);
        addedge(i,u+1);
    }
    m=gi();
    dfs1(1,-1,1);
    dfs2(1,1);
    tr.build(1,n,1);
    while (m--){
        char opt[10];
        scanf("%s",opt);
        int t1=tr.tr[1].s,x=gi(); x++;
        if (opt[0]=='i') update(1,x,1); else tr.update_sec(idx[x],idx[x]+sz[x]-1,0,1);
        int t2=tr.tr[1].s;
        printf("%d\n",abs(t1-t2));
    }
    return 0;
}

[luogu1912][bzoj4196][NOI2015]软件管理器的更多相关文章

  1. [UOJ#128][BZOJ4196][Noi2015]软件包管理器

    [UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...

  2. [BZOJ4196][NOI2015]软件包管理器(树链剖分)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2166  Solved: 1253[Submit][Sta ...

  3. [BZOJ4196][NOI2015]软件包管理器

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1040  Solved: 603[Submit][Stat ...

  4. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

  5. BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  6. BZOJ4196 [Noi2015]软件包管理器 【树剖】

    题目 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件 ...

  7. BZOJ4196: [Noi2015]软件包管理器(树链剖分)

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  8. [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]

    题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空.注意边界,编号是从0开始的,容易漏掉树根. 第一次写树剖- #include <io ...

  9. bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树

    先把树剖分了(又是dfs1.dfs2),然后区间求和.区间覆盖即可 难得的1A好(shui)题 ——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233 总结: ...

随机推荐

  1. RabbitMQ 优先级队列-为队列赋权

    RabbitMQ 消息收发是按顺序收发,一般情况下是先收到的消息先处理,即可以实现先进先出的消息处理.但如果消息者宕机或其他原因,导致消息接收以后,未确认,那么消息会重新Requeue到队列中,就打破 ...

  2. Linux文件下载(转)

    wget是Linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...

  3. Webpack 2 视频教程

    这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲解的. 这个基本就是目前 ...

  4. linux-RPM安装

    vh可写可不写

  5. hashContext

    java.lnag.Object中对hashCode的约定: 1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必 ...

  6. 【CV】ICCV2015_Unsupervised Learning of Visual Representations using Videos

    Unsupervised Learning of Visual Representations using Videos Note here: it's a learning note on Prof ...

  7. linux内核分析第七次实验

    实验: rm menu -rf git clone https://github.com/megnning/menu.git cd menu ls mv test_exec.c test.c vi t ...

  8. 伪GZCC官网

    <html class="no-js"><head> <meta charset="utf-8"> <meta htt ...

  9. 第三个Sprint冲刺第5天

    成员:罗凯旋.罗林杰.吴伟锋.黎文衷 各成员努力完成最后冲刺

  10. 纯MarkDown博客阅读体验优化

    今天鼓捣了一天纯MarkDown书写的博客样式的美化,事实证明图表较多的MarkDown撰写的博文一样可以展现出非常漂亮的效果.为了让纯MarkDown书写的博客有一个干净舒服的阅读体验,我主要针对博 ...