首页 > 其他分享 >补题 DAY1

补题 DAY1

时间:2024-02-17 14:12:34浏览次数:27  
标签:int top tree DAY1 tag 补题 now id

P2146 [NOI2015] 软件包管理器

给你一棵树,两个操作:

  • install x 查询路径 \(0\to x\) 上的点权和,并将路径点权赋值为 \(1\)
  • unistall x 查询 \(x\) 的子树点权和,并将子树点权赋值为 \(0\)

板子。恶心。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+3;
int a[maxn],n,m;
    vector<int>e[maxn];
	void add_edge(int u,int v,bool type=1){
		e[u].push_back(v);
		if(type) e[v].push_back(u);//无向图
	}
    #define ls now<<1
    #define rs now<<1|1
    struct T{
        int sum,tag;
    }tree[maxn<<2];
    void pushup(int now){
        tree[now].sum=(tree[ls].sum+tree[rs].sum);
    }
    void pushdown(int now,int l,int r){
        if(tree[now].tag==-1)return;
        int mid=(l+r)>>1;
    	tree[ls].sum=tree[now].tag*(mid-l+1);
    	tree[rs].sum=tree[now].tag*(r-mid);
		tree[ls].tag=tree[rs].tag=tree[now].tag;    
        tree[now].tag=-1;
    }
    void build(int now,int l,int r){
    	tree[now].tag=-1;
        if(l==r){tree[now].sum=1;return;}
        int mid=(l+r)>>1;
        build(ls,l,mid);build(rs,mid+1,r);
        pushup(now);
    }
    void modify(int now,int l,int r,int x,int y,int v){
        if(x<=l&&r<=y){
        	tree[now].sum=v*(r-l+1);
        	tree[now].tag=v;
            return;
        }
        pushdown(now,l,r);
        int mid=(l+r)>>1;
        if(x<=mid)modify(ls,l,mid,x,y,v);
        if(mid+1<=y)modify(rs,mid+1,r,x,y,v);
        pushup(now);
    }
	int query(int now,int l,int r,int x,int y){
        int ans=0;
        if(x<=l&&r<=y)return tree[now].sum;
        pushdown(now,l,r);
        int mid=(l+r)>>1;
        if(x<=mid)ans=(ans+query(ls,l,mid,x,y));
        if(mid+1<=y)ans=(ans+query(rs,mid+1,r,x,y));
        return ans;
    }
    int siz[maxn],dep[maxn],son[maxn],id[maxn],top[maxn],f[maxn],cnt;
    void dfs1(int u,int fa,int depth){
        siz[u]=1; f[u]=fa; dep[u]=depth;
        int maxx=-maxn;
        for(auto v:e[u]){
            if(v!=fa){
                dfs1(v,u,depth+1);
                siz[u]+=siz[v];
                if(siz[v]>maxx) maxx=siz[v],son[u]=v;
            }
        }
    }
    void dfs2(int u,int t){
        id[u]=++cnt; top[u]=t;
        if(!son[u]) return;
		dfs2(son[u],t);
        for(int v:e[u]) if(!id[v]) dfs2(v,v);
    }
    void modify_tree(int x,int y,int z){
        while(top[x]!=top[y]){
            if(dep[top[x]]<dep[top[y]])swap(x,y);
            modify(1,1,n,id[top[x]],id[x],z);
            x=f[top[x]];
        }
        if(id[x]>id[y])swap(x,y);
        modify(1,1,n,id[x],id[y],z);
    }
    int query_tree(int x,int y){
        int ans=0;
        while(top[x]!=top[y]){
            if(dep[top[x]]<dep[top[y]])swap(x,y);
            ans=(ans+query(1,1,n,id[top[x]],id[x]));
            x=f[top[x]];
        }
        if(id[x]>id[y])swap(x,y);
        ans=(ans+query(1,1,n,id[x],id[y]));
        return ans;
    }

signed main(){
    cin>>n;
    for(int i=1,u;i<n;i++){
        cin>>u;u++;
        add_edge(i+1,u);
    }
	dfs1(1,1,1); dfs2(1,1);
	build(1,1,n);
	cin>>m;
	string op;
    for(int i=1,x,Ans;i<=m;i++){
        cin>>op>>x;x++;
        if(op=="install") cout<<query_tree(x,1)<<'\n',modify_tree(1,x,0);
        else cout<<siz[x]-query(1,1,n,id[x],id[x]+siz[x]-1)<<'\n', modify(1,1,n,id[x],id[x]+siz[x]-1,1);
    }
}

标签:int,top,tree,DAY1,tag,补题,now,id
From: https://www.cnblogs.com/DEV3937/p/18017922/buti1

相关文章

  • Java学习日记 Day16 正月初五,学习回归正轨!
    年前把SSM和Linux学完了,过年期间简单的做了个ssm的项目,再理解理解SSM。今天继续学了radis,也是比较重要的一个技术。radis:简单来说就是把数据存到缓存里的技术,常常和关系数据库结合使用,我们可以把数据库拿出来的数据存到缓存里,这样减少了io的次数,大大提高了效率。radis的学习大......
  • day17_进程管理
    linux资源管理篇昨日内容回顾1.先看状态,再去启动systemctlstatusfirewalldsystemctlrestartfirewalldsystemctllist-unit-files|grepfirewalld1.先理解服务的意思,服务,就是你安装的软件名字2.服务就是一个软件程序,会提供可用的命令,去操控这个软件3.firewall......
  • day19_软件包管理
    Linux软件包管理什么是软件,代码软件包顾名思义就是将应用程序、配置文件和数据打包的产物=======nginx_v.10.rpmyuminstallnginx-y=============先下载nginx.rpm软件包,然后yum自动帮你去安装了这个包/usr/bin/nginx/etc/nginx/nginc.conf配置文件,写了用于控制......
  • day18_系统资源管理
    今日内容英文单词的认识,需要大家自己逐步锻炼了,以后适当的加在考试题中作为练习关于作业,昨日知识,以后大家就把不会的作业题,发在各自小组,我来课下解决关于后台符&,如何用,才是真的实现,安全,可靠的后台运行。可以理解为,无论是用户正常注销登录如logout,如exit。-还是异常的......
  • 【贪心】P7403 [BalticOI 2002 Day1] Tennis Club
    目前题解区还没有证明,我交个证明。形式化题意给定每个点的度数\(d_i\),请构造一个简单无向图(无重边无自环)。First.无解首先,根据握手定理,每个无向图的度数之和为边数的两倍,所以如果度数之和为奇数,那么肯定无解。但是发现,这种情况之外还有别的无解情况(本题有\(3\)个无解数......
  • day16_防火墙服务
    基础服务管理防火墙是什么查找防火墙服务名的技巧[root@yuchao-linux01~]#systemctllist-units|grepfirefirewalld.serviceloadedactiverunningfirewalld-d......
  • day15_scp与ntp服务
    今日笔记,服务管理回顾systemctl你的机器,会有默认的软件(服务),network管理网络的软件,sshd提供远程连接的软件对这些服务,进行管理启动停止重启重新加载开机自启(持久化)禁止开机自启查询是否持久化(是否开机自启)centos7,用这个命令,同时对服务进行启停管理,以及开机自启......
  • day14_系统服务管理
    day13作业1.如何查看系统所有环境变量,且过滤出与root相关的变量。系统全局的,本身内置的变量+用户的变量===系统全局的变量set2.如何查看⽤户个⼈的环境变量,且过滤出与root相关的变量。3.解释下PS1变量,以及如何修改使⽤PS1。请注意,linux是区分大小写的,PS1set设置变量......
  • day13_文件特殊权限
    3.16作业⽤户权限、⽂件权限综合练习1.创建⽤户会涉及哪些⽂件的改动?以及如何验证⽂件被修改过了?(该文件的唯一值是否发生了变化)/etc/passwd用户信息useradd/etc/shadow用户密码信息passwd修改密码/etc/gshadow用户组信息groupadd/etc/group用户组密码信息......
  • day12_文件权限篇
    文件、用户权限管理普通用户超级用户用户组不同的用户,以及不同的组,对于linux的文件操作,权限高地,权限不同。读取cat,more,tail写入echo追加,vim编辑,cat重定向修改,修改文件属性,mv改名字,修改文件权限执行,文件中写的是可执行的语句,如bash语句,python的脚本文件​ 执行一......