题解

树剖模板题,每次改变是\(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. c# create html table test

    string html = "<html><head><title>44444444</title>"; html += @&quo ...

  2. 大话设计模式之模板模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...

  3. springmvc 解决 controller 中出现死循环并 stackoverflow 的问题

    这是因为这个controller中的方法返回值为void类型,且没有request response这类衍生的重定向,或者返回值为String,但是是null等等的情况,都会引起死循环,然后stack ...

  4. Oracle_安装说明

    1.先到Oracle官网上下载11g oracle Database 11g 第 2 版 (11.2.0.1.0) 标准版.标准版 1 以及企业版 适用于 Microsoft Windows (x64 ...

  5. 最近新明白的SQL小知识

    1.partition by和order by 先看三个小需求: ①查询出各个类编号的书本的数量. select count (类编号) as 数量, 类编号 from Books group by ...

  6. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  7. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  8. shiro课程的学习

    1.shiro的课程目标 (1)shiro的整体框架 各组件的概念 (2)shiro 认证 授权的过程 (3)shiro自定义的Reaml Filter (4)shiro session 管理 (5) ...

  9. Java基础知识中的注意事项

    设置Java的相关路径,举例: JAVA_HOME  -->   C:\Program Files\Java\jdk1.8.0_191 Path --->   C:\Program Fil ...

  10. Ehcache Monitor使用一例

    场景介绍:系统集成Shiro,使用Ehcache保存用户登录限制次数,常有用户密码被锁,影响工作效率. 在不考虑集成SSO,LDAP,也不引入身份校验,邮件,短信等解锁特性下.使用Ehcache Mo ...