[bzoj3123][SDOI2013]森林

news/2023/12/9 14:49:20

3123: [Sdoi2013]森林

Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 1654 Solved: 520
[Submit][Status][Discuss]
Description

这里写图片描述

Input

第一行包含一个正整数testcase,表示当前测试数据的测试点编号。保证1≤testcase≤20。
第二行包含三个整数N,M,T,分别表示节点数、初始边数、操作数。第三行包含N个非负整数表示 N个节点上的权值。
接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分。

Output

对于每一个第一类操作,输出一个非负整数表示答案。 

Sample Input

1 
8 4 8
1 1 2 2 3 3 4 4
4 7
1 8
2 4
2 1
Q 8 7 3 
Q 3 5 1 
Q 10 0 0 
L 5 4 
L 3 2 
L 0 7 
Q 9 2 5 
Q 6 1 6 

Sample Output

2 
2
1
4
2 

HINT

对于第一个操作 Q 8 7 3,此时 lastans=0,所以真实操作为Q 8^0 7^0 3^0,也即Q 8 7 3。点8到点7的路径上一共有5个点,其权值为4 1 1 2 4。这些权值中,第三小的为 2,输出 2,lastans变为2。对于第二个操作 Q 3 5 1 ,此时lastans=2,所以真实操作为Q 3^2 5^2 1^2 ,也即Q 1 7 3。点1到点7的路径上一共有4个点,其权值为 1 1 2 4 。这些权值中,第三小的为2,输出2,lastans变为 2。之后的操作类似。

这里写图片描述

平常这种题很常见的思路就是求出dfs序来,然后每次查询的时候就是在主席树上查询 x+ylcafa[lca] 的值就行了。
但是这个题要动态的给森林中加边,还是强制在线的,所以就需要考虑换一种方法来维护这个东西。
首先先dfs出每棵树来,然后对于link操作,可以启发式合并两个主席树。这里我们把主席树维护的dfs序变成维护每个点到根的这条路径。所里link的时候假设我们要把x合到y上,那么我们就边dfs x 这棵树,边用当前点的fa作为历史状态的root来更新当前点的root就行了。求lca的fa数组和deep数组在dfs的时候动态维护就行了。
复杂度: O(nlog2n)
需要之一一个问题就是,我原来在预处理fa数组的时候是这样写的:for(i=1;i<20&&deep[x]>=(1<<i);++i)
但是由于这个题是动态维护的这个数组,所以这样写会出现问题,就是我这个点当前的deep比较小,但是在之前的树中很大,这样的话fa数组中就还保留着之前树中的信息,这样再求LCA的时候就会出问题,所以要改成这样写:for(i=1;i<20;++i)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mid (L+R)/2
#define inf 1000000000
const int N=100000;
const int M=20000000;
bool flag[N];
struct S{int st,en;}aa[N<<1];
int n,m,T,root[N],l[M],r[M],sum[M],siz,tot,point[N],next[N<<1],size[N],belong[N],R[N],v[N],deep[N],fa[N][20];
inline int in(){int x=0;char ch=getchar();while(ch<'0'|ch>'9') ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}
inline void add(int x,int y){next[++tot]=point[x];point[x]=tot;aa[tot].st=x;aa[tot].en=y;next[++tot]=point[y];point[y]=tot;aa[tot].st=y;aa[tot].en=x;
}
inline void insert(int L,int R,int x,int &y,int z){y=++siz;sum[y]=sum[x]+1;if(L==R) return ;l[y]=l[x];r[y]=r[x];if(z<=mid) insert(L,mid,l[x],l[y],z);else insert(mid+1,R,r[x],r[y],z);
}
inline void dfs(int x,int last,int now){int i;flag[x]=true;size[x]=1;belong[x]=now;for(i=1;i<20;++i)fa[x][i]=fa[fa[x][i-1]][i-1];insert(1,inf,root[last],root[x],v[x]);for(i=point[x];i;i=next[i])if(aa[i].en!=last){fa[aa[i].en][0]=x;deep[aa[i].en]=deep[x]+1;dfs(aa[i].en,x,now);size[x]+=size[aa[i].en];}
}
inline int LCA(int x,int y){if(deep[x]<deep[y]) swap(x,y);int i,t=deep[x]-deep[y];for(i=0;i<20;++i)if(t&(1<<i)) x=fa[x][i];for(i=19;~i;--i)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];return x==y?x:fa[x][0];
}
inline int query(int L,int R,int x1,int x2,int x3,int x4,int z){if(L==R) return L;int now=sum[l[x1]]+sum[l[x2]]-sum[l[x3]]-sum[l[x4]];if(now>=z) return query(L,mid,l[x1],l[x2],l[x3],l[x4],z);else return query(mid+1,R,r[x1],r[x2],r[x3],r[x4],z-now);
}
int main(){int i,j,x,y,num,k,ans=0;T=in();n=in();m=in();T=in();for(i=1;i<=n;++i) v[i]=in();for(i=1;i<=m;++i){x=in();y=in();add(x,y);}for(num=0,i=1;i<=n;++i)if(!flag[i]) dfs(i,0,++num),R[num]=i;while(T--){char ch=getchar();while(ch!='Q'&&ch!='L') ch=getchar();x=in();y=in();x^=ans;y^=ans;if(ch=='Q'){k=in();k^=ans;int lca=LCA(x,y);ans=query(1,inf,root[x],root[y],root[lca],root[fa[lca][0]],k);printf("%d\n",ans);}if(ch=='L'){int now1=R[belong[x]],now2=R[belong[y]];if(size[now1]>size[now2]) swap(now1,now2),swap(x,y);add(y,x);fa[x][0]=y;size[now2]+=size[now1];deep[x]=deep[y]+1;dfs(x,y,belong[y]);}}
}

http://www.ppmy.cn/news/846259.html

相关文章

bzoj 3123 [Sdoi2013]森林

http://www.elijahqi.win/archives/3755 Description Input 第一行包含一个正整数testcase&#xff0c;表示当前测试数据的测试点编号。保证1≤testcase≤20。 第二行包含三个整数N&#xff0c;M&#xff0c;T&#xff0c;分别表示节点数、初始边数、操作数。第三行包含N个…

hdu_3123_GCC

The GNU Compiler Collection (usually shortened to GCC) is a compiler system produced by the GNU Project supporting various programming languages. But it doesn’t contains the math operator “!”. In mathematics the symbol represents the factorial operation…

【loj3123】【CTS2019】重复

题目 给出一个长度为\(n\)的串\(s\)&#xff0c;询问有多少个长度为\(m\)的串\(t\)  满足 \(t\) 的无限循环串存在一个长度为\(n\)且比\(s\)字典序严格小的子串 $ n , m \le 2000 $ 题解 自从CTS打铁之后就非常自闭&#xff0c;智商一天不如一天&#xff0c;所以感觉这题异常抽…

bzoj3123: [Sdoi2013]森林

题面在这里 题意&#xff1a; 给一个森林&#xff0c;森林有n个节点m条边。 现在有两种操作&#xff1a; 1.Q x y k 表示询问x-y这条链上点权的第k小。保证x&#xff0c;y在同一个连通块里。 2.L x y 表示链接x,y两点。保证x,y在不同的连通块里。 要求强制在线&#xff0…

bzoj3123

3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1846 Solved: 574[Submit][Status][Discuss] Description Input 第一行包含一个正整数testcase&#xff0c;表示当前测试数据的测试点编号。保证1≤testcase≤20。 第二行包含三个整数N&#xff0c;M…

POJ 3123

https://cn.vjudge.net/problem/POJ-3123 题意&#xff1a; n 个城市&#xff0c;m 条路&#xff0c;给定八个点&#xff08;也就是四对&#xff09;&#xff0c;使每队点连通且总权和最小。 分析&#xff1a; dp[i][j] 表示 i 状态下以 j 为起点的最小总权和。 #include …

Flutter:第三方常用库整理

前言 随着Flutter的不断学习&#xff0c;接触了不少第三方的库。因此打算进行简单的整理。 dio 简介 一个强大的Dart/FlutterHTTP客户端&#xff0c;支持全局配置&#xff0c; 拦截器、表单数据、请求取消、文件上传/下载、 超时和自定义适配器等。 官方地址 https://pub-w…

Redis_客户端命令和数据操作(3)

目录 切换数据库 键命令 数据结构 string类型 hash类型 list类型 set类型 zset类型 查看中文value 源码等资料获取方法 切换数据库 redis数据库没有名称&#xff0c;默认有16个&#xff0c;通过0-15来标识&#xff0c;连接redis默认选择第一个数据库&#xff0c;可以…

青龙傻妞onebot不能用,改用cqhttp+傻妞/qqbot

不知为何我的onebot突然用不了了&#xff0c;傻妞还正常&#xff0c;这就需要改用cqhttp了 下面介绍cqhttp登录不上的问题 一般来说cqhttp还是很好安装的随便一搜就很多&#xff0c;这里先讲一下QQ扫码登录不成功问题 原因是&#xff0c;tx检测qq登录有风险&#xff0c;网络…

ONEBOT开发板

ONEBOT开发板 制作传感器的新方式—搭积木式制作传感器 介绍 ONEBOT是小米生态链爱其科技推出的开源传感器创作平台&#xff0c;提供了机器人、物联网应用创作原型&#xff0c;让每个人都享受创造科技的乐趣。 为电子爱好者、DIY、创客、教育等提供了制作传感器的 新方式&a…

『Nonebot 插件编写教程』nonebot2处理消息的完整过程

文章目录 前言捕获消息处理消息Bot机器人参数Event事件参数 回复消息字符串与Message调用MessageSegment接口 前言 前面已经有不止一篇博客教大家如何搭建nonebot2环境了大家可以去专栏查看&#xff0c;这篇博客并不会再次带大家来搭建nonebot2环境&#xff0c;而是着手与插件的…

Ubuntu搭建zhenxunbot聊天机器人

GitHub - HibiKier/zhenxun_bot: 基于 Nonebot2 和 go-cqhttp 开发&#xff0c;以 postgresql 作为数据库&#xff0c;非常可爱的绪山真寻bot 1.安装python3.9 apt和手动编译源码选一个&#xff0c;记得装pip pip改清华源&#xff0c;apt改国内随便哪个源 2.apt安装下面这一…

[Nonebot2]chatgpt

前言 今天我要教大家的是 如何实现nonebot之Gpt接入 准备 1.获取开发者key 获取key的地址&#xff1a;这里你们自行了解&#xff0c;有些原因不能展示 如图所示&#xff0c;我已经创建好一个key了&#xff0c;大家也可以点击Create new secret key按钮来创建一个新的key&am…

青龙面板node-onebot 教程

青龙安装部署教程-------点击跳转 没服务器的先自行购买&#xff0c;腾讯云2H4G8M首年70–点击购买 QQ交流&#xff1a;1014549449 --------------点击跳转 node-onebot 使用教程 注、 先去安全中心把端口开下 1.不管你用什么端口你都要在安全组开放一下 lsof -i :80|grep -…

使用nonebot+go-cqhttp搭建qq机器人

目录 缘由准备工作nonebotgo-cqhttp 开始吧下载go-cqhttp配置使用 go-cqhttp安装nonebotnonebot配置 看看成果吧 缘由 最近ChatGPT各种破圈大火&#xff0c;作为一名NLPer小学生&#xff0c;也来玩玩这个东西。那究竟怎么用呢&#xff1f; 想来想去&#xff0c;以往就想搞一个…

QQ机器人-nonebot

文章目录 前提一、下载go-cqhttp地址&#xff1a; 二、运行go-cqhttp1、出现黑色窗口&#xff0c;一直点确定&#xff08;三次&#xff09;2、得到一个启动文件3、双击bat文件&#xff0c;选择3&#xff0c;生成config文件然后关闭窗口4、打开config文件&#xff0c;并修改①QQ…

QQ机器人AutMan安装及对接

序言 相信很多人在安装傻妞是总会遇到各种各样的困难&#xff0c;今天&#xff0c;我就教大家部署另一个机器人——AutMan&#xff08;一听这个名字就知道一定很好用&#xff09; 部署与安装 安装完成并启动后可进入autMan后台地址&#xff1a;http://【你的IP】:autMan端口…

(七)新版傻妞机器人+onebot协议+对接青龙+对接芝士+常用命令/保姆教程/张嘴吃饭【2022年4月22日】

交流群&#xff1a;点我跳转 懒人自助上车&#xff1a;不想自己动手的 来我这 低价捡漏&#xff1a;低价捡漏 好物分享 我是目录 支持打赏 一、安装傻妞安装傻妞修改配置文件对接青龙芝士开门二、安装onebot机器人协议安装node安装pm2安装git安装onebot修改node-onebot文件机器…

2022完整版青龙面板对接傻妞机器人

1.安装sillyGirl傻妞 #第一步 cd /etc #第二步(国内服务器)set sillyGirl download_prefix https://pd.zwc365.com/#第三步 ssillyGirl;aarm64;if [[ $(uname -a | grep "x86_64") ! "" ]];then aamd64;fi ;if [ ! -d $s ];then mkdir $s;fi ;cd $s;wget …

NoneBot简单搭建QQ机器人

小白有小白的玩法&#xff0c;俺们就玩玩插件就好了QAQ 安装python 下载好合适自己电脑的版本并安装&#xff08;要>3.8版本&#xff09; 该选项一定要勾 winR&#xff0c;输入cmd&#xff0c;查看是否安装完成 安装 NoneBot2 | NoneBot 通过该文档安装好nonebot winR&#…
最新文章