洛谷 P2146 软件包管理器

2024-03-15 02:58

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

题目链接
题目分析:

很裸的树链剖分,没啥可讲的,不过我也不晓得我的怎么就错了,调试了半天,输出了样例,最后只过了两个点,打的我好崩溃!需要学习树剖的可以点击树链剖分详解

程序代码

#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn=200005;
int n,k=0,x,head[maxn],q,deep[maxn],father[maxn],size[maxn];
int tid[maxn],top[maxn],son[maxn],tidnum=0,pos[maxn];
char s[15];
struct node {int to,next;
} edge[maxn<<1];
struct Node {int left,right,flag,sum;
} tree[maxn<<2];
void add(int u,int v) {edge[++k].to=v;edge[k].next=head[u];head[u]=k;
}
int read() {int x=0;char ch=getchar();while(ch<48||ch>57) ch=getchar();while(ch>=48&&ch<=57) x=x*10+ch-48,ch=getchar();return x;
}
void dfs1(int x,int fa,int depth) {size[x]=1;father[x]=fa;deep[x]=depth;for(int i=head[x]; i; i=edge[i].next) {if(edge[i].to==fa) continue;dfs1(edge[i].to,x,depth+1);size[x]+=size[edge[i].to];if(!son[x]||size[edge[i].to]>size[son[x]]) son[x]=edge[i].to;}
}
void dfs2(int x,int tp) {tid[x]=++tidnum;pos[tid[x]]=x;top[x]=tp;if(!son[x]) return;dfs2(son[x],tp);for(int i=head[x]; i; i=edge[i].next) {if(edge[i].to!=son[x]&&edge[i].to!=father[x])dfs2(edge[i].to,edge[i].to);}
}
void build(int id,int l,int r) {tree[id].left=l;tree[id].right=r;tree[id].sum=0;tree[id].flag=-1;if(l==r) return;int mid=(l+r)>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);return;
}
void downdata(int id) {tree[id<<1].sum=(tree[id<<1].right-tree[id<<1].left+1)*tree[id].flag;tree[id<<1|1].sum=(tree[id<<1|1].right-tree[id<<1|1].left+1)*tree[id].flag;tree[id<<1].flag=tree[id<<1|1].flag=tree[id].flag;tree[id].flag=-1;
}
int get(int id,int l,int r) {if(tree[id].right<l||tree[id].left>r) return 0;if(tree[id].right<=r&&tree[id].left>=l) return tree[id].sum;if(tree[id].flag!=-1) downdata(id);return get(id<<1,l,r)+get(id<<1|1,l,r);
}
void update(int id,int l,int r,int val) {if(tree[id].right<l||tree[id].left>r) return;if(tree[id].right<=r&&tree[id].left>=l) {tree[id].sum=(tree[id].right-tree[id].left+1)*val;tree[id].flag=val;return;}if(tree[id].flag!=-1) downdata(id);update(id<<1,l,r,val);update(id<<1|1,l,r,val);tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;return;
}
void change(int u,int v,int val) {while(top[u]!=top[v]) {if(deep[top[u]]<deep[top[v]]) std::swap(u,v);update(1,tid[top[u]],tid[u],val);u=father[top[u]];}if(deep[u]>deep[v]) std::swap(u,v);update(1,tid[u],tid[v],val);return;
}
int main() {n=read();for(int i=2; i<=n; i++) {x=read();x++;add(x,i);}dfs1(1,1,1);dfs2(1,1);q=read();build(1,1,tidnum);for(int i=1; i<=q; i++) {scanf("%s",s);x=read();x++;int t1=tree[1].sum;if(s[0]=='i') {change(1,x,1);int t2=tree[1].sum;printf("%d\n",abs(t2-t1));}if(s[0]=='u') {update(1,tid[x],tid[x]+size[x]-1,0);int t2=tree[1].sum;printf("%d\n",abs(t1-t2));}}return 0;
}

这篇关于洛谷 P2146 软件包管理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

【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

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

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