[BZOJ 4399] 魔法少女LJJ

news/2024/12/28 17:14:52/文章来源:https://www.cnblogs.com/LG017/p/18637692

魔法少女LJJ

Description :

题目描述
在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了

LJJ感叹道“这里真是个迷人的绿色世界,空气清新、淡雅,到处散发着醉人的奶浆味;小猴在枝头悠来荡去,好不自在;各式各样的鲜花争相开放,各种树枝的枝头挂满沉甸甸的野果;鸟儿的歌声婉转动听,小河里飘着落下的花瓣真是人间仙境”

SHY觉得LJJ还是太naive,一天,SHY带着自己心爱的图找到LJJ,对LJJ说:“既然你已经见识过动态树,动态仙人掌了,那么今天就来见识一下动态图吧”

LJJ:“要支持什么操作?”

SHY:“

1.新建一个节点,权值为x。

2.连接两个节点。

3.将一个节点a所属于的联通快内权值小于x的所有节点权值变成x。

4.将一个节点a所属于的联通快内权值大于x的所有节点权值变成x。

5.询问一个节点a所属于的联通块内的第k小的权值是多少。

6.询问一个节点a所属联通快内所有节点权值之积与另一个节点b所属联通快内所有节点权值之积的大小。

7.询问a所在联通快内节点的数量

8.若两个节点a,b直接相连,将这条边断开。

9.若节点a存在,将这个点删去。


LJJ:“我可以离线吗?”

SHY:“可以,每次操作是不加密的,”

LJJ:“我可以暴力吗?”

SHY:“自重”

LJJ很郁闷,你能帮帮他吗

数据范围及提示:

$ 1\le m \le 4\times 10^{5},opt \le 7$

Solution:

我们会发现后面两种恶心到令人发指的操作根本不用实现(\(opt \le 7\))。也就是说,我们只需要合并两个联通块就好了,这让我们很难不想到并查集.

我们维护一些并查集以支持连边操作,然后每个并查集上开一颗权值线段树,每次连边就将两颗树合并。但是我们会发现乘积貌似有点难维护,但是题目只要求比大小,所以我们并不需要维护乘积的真实值,维护对数就好了。

然后修改操作就在 \([1,x-1]\) 或者是 \([x+1,inf]\) 区间上打上删除标记并且记录删除了多少个数字 \(tmp\),然后在 \(x\) 节点上添加 \(tmp\) 个点就好了。

细节提示:

由于这题的删除标记是要 pushdown 的,所以我们在 merge 时一定要将 x,y 都 pushdown

然后就是不推荐使用太过先进的编译器。因为在并查集时,你的 find 函数就算没有 return ,编译器也可能帮你返回一个你最后调用的变量。例如:

int find(int x){fa[x] = fa[x]==x ? fa[x] : find(fa[x]);}

在我的编译器上是会直接返回 fa[x] 的,而不会报错。这两个致命错误导致我在本地调了 3h+
(╯°Д°)╯︵ ┻━┻

然后这题就做完了

Code:

#include<bits/stdc++.h>
const int N=4e5+5;
const int inf=1e9;
using namespace std;
int n,tot;
struct Segment_Tree{struct Tree{int ls,rs,cnt,tag;double val;}t[N*40];int cnt,rt[N];void erase(int x){t[x].cnt=0,t[x].val=0,t[x].tag=1;}void pushdown(int x){if(!t[x].tag)return;erase(t[x].ls),erase(t[x].rs);t[x].tag=0;}void pushup(int x){t[x].cnt=t[t[x].ls].cnt+t[t[x].rs].cnt;t[x].val=t[t[x].ls].val+t[t[x].rs].val;}int merge(int x,int y,int l,int r){if(!x||!y)return x|y;if(l==r){t[x].cnt+=t[y].cnt,t[x].val+=t[y].val;return x;}int mid=l+r>>1;pushdown(x);pushdown(y);t[x].ls=merge(t[x].ls,t[y].ls,l,mid);t[x].rs=merge(t[x].rs,t[y].rs,mid+1,r);pushup(x);return x;}void insert(int &x,int l,int r,int pos,int k){x=(x ? x : ++cnt);if(l==r){t[x].cnt+=k;t[x].val+=1.0*k*log(pos);return;}int mid=l+r>>1;pushdown(x);if(pos<=mid)insert(t[x].ls,l,mid,pos,k);if(mid<pos) insert(t[x].rs,mid+1,r,pos,k);pushup(x);}void upd(int x,int l,int r,int L,int R,int &res){if(L<=l&&r<=R){res+=t[x].cnt;erase(x);return;}int mid=l+r>>1;pushdown(x);if(L<=mid)upd(t[x].ls,l,mid,L,R,res);if(mid<R) upd(t[x].rs,mid+1,r,L,R,res);pushup(x);}int query(int x,int l,int r,int k){pushdown(x);if(l==r)return l;int mid=l+r>>1;if(k<=t[t[x].ls].cnt)return query(t[x].ls,l,mid,k);else return query(t[x].rs,mid+1,r,k-t[t[x].ls].cnt);}
}T;
int fa[N];
int find(int x){return fa[x] = fa[x]==x ? fa[x] : find(fa[x]);}
void work()
{cin>>n;for(int i=1,opt,x,y;i<=n;i++){scanf("%d%d",&opt,&x);if(1<opt&&opt<7)scanf("%d",&y);if(opt==1){tot++;fa[tot]=tot;T.insert(T.rt[tot],1,inf,x,1);}if(opt==2){int u=find(x),v=find(y);if(u!=v){fa[v]=u;T.rt[u]=T.merge(T.rt[u],T.rt[v],1,inf);}}if(opt==3){int tmp=0;x=find(x);T.upd(T.rt[x],1,inf,1,y-1,tmp);T.insert(T.rt[x],1,inf,y,tmp);}if(opt==4){int tmp=0;x=find(x);T.upd(T.rt[x],1,inf,y+1,inf,tmp);T.insert(T.rt[x],1,inf,y,tmp);}if(opt==5){x=find(x);int ans=T.query(T.rt[x],1,inf,y);printf("%d\n",ans);}if(opt==6){x=find(x),y=find(y);printf("%d\n",(T.t[T.rt[x]].val > T.t[T.rt[y]].val ? 1 : 0));}if(opt==7){x=find(x);printf("%d\n",T.t[T.rt[x]].cnt);}}
}
int main()
{freopen("girl.in","r",stdin);freopen("girl.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再战博客园美化(六)

连续剧更新了佬提了一嘴,于是我发现我替换没替换完,现在好了。 这是什么bug明明存在forFlow,但是不让我查询? 弄错了,用.就好light dark回来了,vue没有检查我默认有没有赋值,他只会自己贴一个上去。 算了,那就用vue的切换!不会吧。 在call后出现已被定义,有问题。被重…

arping 工具使用

1. 项目介绍arping 是一个用于在局域网(LAN)中查找特定 IP 地址是否被占用的实用工具。与传统的 ping 命令不同,arping 使用 ARP 协议来发送和接收数据包,从而能够检测到那些阻止 ICMP 请求的主机。arping 可以帮助网络管理员在调试网络时,快速确定哪些 IP 地址已经被占用…

Rules Of JSX 渲染列表 ‼️State

JSX只能拥有一个root元素,即只能有一个父元素。React不会渲染true或false到界面上,但会渲染0,1。 isOpen && <p>Hello!</p> 上述短路表达式意为:只有当isOpen为真时,才会执行第二部分内容,返回第二部分内容。如果isOpen为假且它的值为0,表达式会返回…

FastStone Capture10.9电脑截图工具中文绿色便携版

前言 FSCapture是一款集图像捕捉、浏览编辑、视频录制等功能于一身的屏幕截图软件,软件具有体积小巧、功能强大、操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合。截图后的图片编辑与保存选项也特别丰富和方便,内置功能完善的图像编辑器,支持几乎所有主流图…

研途考研视频课件课程下载工具,如何在电脑端下载研途考研视频课程课件资料PDF,PPT到本地?

一. 安装研途课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/kaoyanvip_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止下…

golang 高频面试题

简述 Goroutine 的调度流程?Goroutine 是 Go 语言中的轻量级线程,Go 运行时使用调度器来管理 Goroutine 的执行。调度器的设计旨在高效地利用系统资源,并在多个 Goroutine 之间公平地分配 CPU 时间。以下是 Goroutine 调度的简要流程:Goroutine 的创建:当通过 go 关键字启…

NetBackup备份恢复工作流程workflow

# NetBackup备份恢复工作流程 在早期的NetBackup Troubleshooting guide中,详细描述了备份和恢复的步骤以及各个进程之间的调用关系,但是7.7以后的文档把这部分内容给取消了。在logging reference里面有类似内容,但是讲得不太清晰。备份流程从客户端或者Master Server GUI发…

如何快速体验chatGPT(AI问答)

由于账号的原因无法使用chatGPT,那有什么其他的办法可以体验一下这样的AI问答呢? 1、豆包 https://www.doubao.com/ 2、在魔塔modelscope的选择要体验的模型,在model详情页里,体验模型 https://www.modelscope.cn/studios/Qwen/QwQ-32B-preview/ 3、智谱AI https://open.…

合作招募

介绍 2025年将为潜在客户解决技术问题,并整理技术文档以满足其需求。根据问题的复杂度,文档的字数通常在1000-2500字之间,并配有相关截图 但为了提高合作效率并确保项目成功,彼此需共同承担部分前期成本(单次共承担最高不超30元,可当做找工作时的路费)。 该费用用于支持前…

第三次Blog 题目集7~8

一,前言 在题目集7和8中,我们逐步完善了智能家居强电电路模拟程序的功能和复杂性。题目集7以基本电路元件的特性和连接为核心,涵盖了开关、调速器、灯、风扇等设备的模拟,实现了多种控制设备和受控设备的电路设计与状态输出;而题目集8在此基础上新增了管脚电压显示、电流限…

题集7-8的总结

一:前言: 1.知识点:主要包括类和对象的使用、数据封装、方法的定义和使用、继承、多态、泛型、抽象类,集合框架,异常处理,字符串处理、以及基本的输入输出操作。 2.题量:现在的题目集都是一道题了,题量没什么说的。 3.难度:每次题集的难度都较大,每次都要7.8小时及以…

『联合省选2025集训』『图的连通性进阶』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…