bzoj1036: [ZJOI2008]树的统计Count link-cut-tree版

news/2024/7/5 7:54:06

题目传送门

这 算是link-cut-tree裸题啊 不过以前好像没有写过单点修改..............

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=50007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
int n,m,c[M][2],fa[M],a[M],b[M];
LL v[M],sum[M],mx[M];
bool rev[M];
bool isrt(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
void up(int x){
    if(!x) return ;
    mx[x]=v[x]; sum[x]=v[x];
    int l=c[x][0],r=c[x][1];
    if(l) mx[x]=max(mx[x],mx[l]),sum[x]+=sum[l];
    if(r) mx[x]=max(mx[x],mx[r]),sum[x]+=sum[r];
}
void down(int x){
    if(!rev[x]) return ;
    rev[x]=0;
    int l=c[x][0],r=c[x][1];
    if(l) swap(c[l][0],c[l][1]),rev[l]^=1;
    if(r) swap(c[r][0],c[r][1]),rev[r]^=1;
}
void rotate(int x){
    int y=fa[x],z=fa[y],l=0,r=1;
    if(c[y][1]==x) l=1,r=0;
    if(!isrt(y)) c[z][c[z][1]==y]=x;
    fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
    c[y][l]=c[x][r]; c[x][r]=y;
    up(y); up(x);
}
int st[M],top=0,S;
void splay(int x){
    st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
    while(top) down(st[top--]);
    while(!isrt(x)){
        int y=fa[x],z=fa[y];
        if(!isrt(y)){
            if(c[z][0]==y^c[y][0]==x) rotate(x);
            else rotate(y);
        }
        rotate(x);
    }
}
void acs(int x0){
    for(int x=x0,y=0;x;splay(x),c[x][1]=y,up(x),y=x,x=fa[x]);
    splay(x0);
}
void mrt(int x){acs(x); swap(c[x][0],c[x][1]); rev[x]^=1;}
void link(int x,int y){mrt(x); fa[x]=y;}
void spl(int x,int y){mrt(x); acs(y);}
int main()
{
    int x,y;
    n=read();
    for(int i=1;i<n;i++) a[i]=read(),b[i]=read();
    for(int i=1;i<=n;i++) v[i]=read();
    for(int i=1;i<n;i++) link(a[i],b[i]);
    m=read();
    char ch[15];
    for(int i=1;i<=m;i++){
        scanf("%s",ch); x=read(); y=read();
        if(ch[1]=='H') acs(x),v[x]=y;
        if(ch[1]=='S') spl(x,y),printf("%lld\n",sum[y]);
        if(ch[1]=='M') spl(x,y),printf("%lld\n",mx[y]);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7084849.html


http://www.niftyadmin.cn/n/4608927.html

相关文章

【吴恩达】prompt engineering(原则 迭代 文本概括 推断、订餐机器人)

简介 Introduction 基础的LLM训练的模型&#xff0c;问法国的首都什么&#xff0c;可能会将答案预测为“法国最大的城市是什么&#xff0c;法国的人口是多少”许多 LLMs 的研究和实践的动力正在指令调整的 LLMs 上。指令调整的 LLMs 已经被训练来遵循指令。因此&#xff0c;如…

Linux----进程控制(上)

Linux----进程控制&#xff08;上&#xff09;1&#xff09;进程创建fork()① fork()返回值为什么有两个&#xff08;返回两次&#xff09;&#xff1f;② fork()常见使用场景③ fork()调用失败的原因2&#xff09;进程终止进程退出的情况分类进程退出方法①exit()②_exit()在操…

14.Nginx防盗链Nginx访问控制Nginx解析php相关配置Nginx代理

[toc] 一、Nginx防盗链&#xff1a; 1. 打开配置文件&#xff1a; 增加如下配置文件&#xff1a; [rootxavi ~]# cd /usr/local/nginx/conf/vhost/ [rootxavi vhost]# vim test.com.conf} # location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$# {# expires 7d;# …

安装戴尔OMSA

设置变量versionumcat /etc/redhat-release | awk {print $3} | awk -F . {print $1}versionnamecat /etc/redhat-releaseif [ $versionum 5 ];then echo $versionname" Tikanga" > /etc/redhat-release echo "OM-SrvAdmin-Dell-Web-LX-7.4.0-866.RHE…

Linux----进程控制(下)

Linux----进程控制&#xff08;下&#xff09;3&#xff09;进程等待wait()waitpid()①status②option(阻塞与非阻塞)4&#xff09;进程程序替换替换函数①execl系列&#xff08;l&#xff1a;list&#xff09;②execv系列&#xff08;v&#xff1a;vector&#xff09;场景3&am…

安卓应用安全指南 4.2.2 创建/使用广播接收器 规则书

4.2.2 创建/使用广播接收器 规则书 原书&#xff1a;Android Application Secure Design/Secure Coding Guidebook 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 遵循下列规则来发送或接受广播。 4.2.2.1 仅在应用中使用的广播接收器必须设置为私有&#xff08;必需…

Linux----IO(初级)

Linux----IO&#xff08;初级&#xff09;1&#xff09;C文件I/O2&#xff09;系统文件I/O①Linux一切皆文件&#xff08;补缓冲区&#xff09;②IO系统接口③站在系统角度理解④file descriptor&#xff08;文件与进程&#xff09;⑤分配文件描述符的规则⑥C中的FILE⑦重定向3…

Web API(二):Web API概述

一、什么是API API&#xff08;Application Programming Interface&#xff09;即应用程序编程接口&#xff0c;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而无需访问源代码&#xff0c;或者理解内部的…