BZOJ4196 NOI2015 软件包管理器 树链剖分

2023-12-24 23:50

本文主要是介绍BZOJ4196 NOI2015 软件包管理器 树链剖分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:给定一颗树,维护:1、给定一个节点,求该节点到根的路径上总点数-点权和,并将路径上的所有点的权值赋为1  2、给定一个节点,求该节点子树的点权和,并将子树中所有点的权值赋为0

题解:链剖裸题

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <iostream>
#include <algorithm>
using namespace std;const int MAXN=100000+2;
struct HASH{int u;HASH *next;HASH(){}HASH(int _u,HASH *_next):u(_u),next(_next){}
}mem[MAXN*2];
struct NODE{int f,b,c,s,m,l,r;HASH *child;
}node[MAXN];
typedef struct TREE{int l,r,s,a;TREE *lchild,*rchild;TREE(){}TREE(int _l,int _r):l(_l),r(_r),s(0),a(-1),lchild(0),rchild(0){}
} *ROOT;
ROOT root;
int N,Q,cnt;
char S[20+2];void Insert(int u,int v){ node[u].child=&(mem[cnt++]=HASH(v,node[u].child));}void DFS1(int f,int x){node[x].c=1,node[x].s=-1;for(HASH *p=node[x].child;p;p=p->next)if(p->u!=f){DFS1(x,p->u);node[x].c+=node[p->u].c;if(node[x].s==-1 || node[p->u].c>node[node[x].s].c) node[x].s=p->u;}
}void DFS2(int f,int x,int b){node[x].f=f,node[x].b=b,node[x].m=node[x].l=node[x].r=++cnt;if(node[x].s!=-1) DFS2(x,node[x].s,b);for(HASH *p=node[x].child;p;p=p->next){if(p->u!=f && p->u!=node[x].s) DFS2(x,p->u,p->u);node[x].r=max(node[x].r,node[p->u].r);}
}void Build(ROOT &x,int l,int r){x=new TREE(l,r);if(l==r) return;int m=(l+r)>>1;Build(x->lchild,l,m),Build(x->rchild,m+1,r);
}void Pushup(ROOT &x){ x->s=x->lchild->s+x->rchild->s;}void Pushdown(ROOT &x,int m){if(x->a==1){x->lchild->a=x->rchild->a=1;x->lchild->s=m-(m>>1);x->rchild->s=m>>1;x->a=-1;}else if(!x->a){x->lchild->a=x->rchild->a=0;x->lchild->s=x->rchild->s=0;x->a=-1;}
}int Summation(ROOT &x,int l,int r,bool a){if(l<=x->l && x->r<=r){if(a) return x->r-x->l+1-x->s;else return x->s;}Pushdown(x,x->r-x->l+1);int m=(x->l+x->r)>>1,ret=0;if(l<=m) ret+=Summation(x->lchild,l,r,a);if(r>m) ret+=Summation(x->rchild,l,r,a);return ret;
}void Update(ROOT &x,int l,int r,bool a){if(l<=x->l && x->r<=r){if(a) x->a=1,x->s=x->r-x->l+1;else x->a=0,x->s=0;return;}Pushdown(x,x->r-x->l+1);int m=(x->l+x->r)>>1;if(l<=m) Update(x->lchild,l,r,a);if(m<r) Update(x->rchild,l,r,a);Pushup(x);
}int Query1(int x){int ret=0;for(int i=x;i!=-1;i=node[node[i].b].f)ret+=Summation(root,node[node[i].b].m,node[i].m,1);for(int i=x;i!=-1;i=node[node[i].b].f)Update(root,node[node[i].b].m,node[i].m,1);return ret;
}int Query2(int x){int ret=Summation(root,node[x].l,node[x].r,0);Update(root,node[x].l,node[x].r,0);return ret;
}int main(){scanf("%d",&N);for(int i=1,u;i<N;i++){scanf("%d",&u);Insert(i,u),Insert(u,i);}DFS1(-1,0),cnt=0,DFS2(-1,0,0);Build(root,1,N);scanf("%d",&Q);for(int i=1,x;i<=Q;i++){scanf("%s %d",S,&x);if(S[0]=='i') printf("%d\n",Query1(x));else printf("%d\n",Query2(x));}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6443928.html

这篇关于BZOJ4196 NOI2015 软件包管理器 树链剖分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533563

相关文章

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

Apache Tiles 布局管理器

陈科肇 =========== 1.简介 一个免费的开源模板框架现代Java应用程序。  基于该复合图案它是建立以简化的用户界面的开发。 对于复杂的网站,它仍然最简单,最优雅的方式来一起工作的任何MVC技术。 Tiles允许作者定义页面片段可被组装成在运行一个完整的网页。  这些片段,或Tiles,可以用于为了降低公共页面元素的重复,简单地包括或嵌入在其它瓦片,制定了一系列可重复使用

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

Android SmsManager(短信管理器),发送短信息

AndroidManifest.xml <uses-permission android:name="android.permission.SEND_SMS"/> <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns

Android 电话管理器TelephonyManager,获取网络,SIM卡信息

// 获取系统TelephonyManager对象 TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); AndroidManifest.xml package shortcut.song.com.myapplication;import an

828华为云征文|部署电影收藏管理器 Radarr

828华为云征文|部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 Radarr 使用 四、总结 一、Flexu

随手记(2)-java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

问题描述: 在使用Java连接access数据的.mdb文件时候程序报如下错误 java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序     错误原因: 在win7 office2013下报错 解决方法:  查看Java桥连程序连接字符串是否写成{Microsoft Access Driver (*.m

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引(PyPI)注册表的新型供应链攻击技术已在野外被利用,并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack,并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包,并导致数十万次恶意软件包下载。这些易受攻击的软件包下载量已超过 10 万次,或已活跃超过 6 个月。 JFrog安全研究人员And

[Python]之with与上下文管理器

-python基础知识回顾 with 与上下文管理器 1.1文本操作回顾 # 1、以写的方式打开文件f = open("1.txt", "w")# 2、写入文件内容f.write("hello world")# 3、关闭文件f.close() 文件使用完后必须关闭 因文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的 1.2存在的安全隐患: ① 由于文件

Qt中处理布局管理器之间的距离

一般的要让控件容器和子控件没有空隙, 有两种情况: (确保控件容器的margins设置成0)1. 子控件大小固定, 则控件容器大小也得固定, 确保没有空隙产生;2. 子控件大小动态变化, 则将其大小变化设置成扩展(expanding), 随控件容器变化; 那么,为了确保frame与内部控件一样高,我设置其最大高度:titleFrame->setMaximumHeight(16);同时却出现了