首页 > 其他分享 >Ynoi2014 等这场战争结束之后

Ynoi2014 等这场战争结束之后

时间:2024-11-13 23:30:36浏览次数:1  
标签:战争 val int siz Ynoi2014 lst Lst 这场 FindSet

题目大意

有 \(n\) 个点,点有点权,维护一个完全持久化的数据结构并支持:

  • 将点 \(x\) 和 \(y\) 之间连接一条边。
  • 询问点 \(x\) 所在的连通块的第 \(k\) 小权值。

数据范围:\(1\le n,q\le 10^5,0\le a_i\le 10^9\)。

时间限制:500ms,空间限制:20 MB

思路

写一种比较简单的做法。

先不考虑完全持久化。

先把权值离散化,然后按照权值分块。

对于第一个操作,我们可以使用并查集来维护,对于每个节点维护 \(O(\frac{n}{B})\) 个块,记录其所在连通块内在这个块中出现的权值的数量,每次合并时直接将对应块相加。

这样子一次合并的复杂度是 \(O(\frac{n}{B})\) 的,对于操作 3 的查询也是 naive 的。

对于持久化,有一个经典做法:建出操作树。

那么我们就需要维护一个可撤销并查集,然后按照上述方式来做。

但是这个题的空间限制只有 20MB,所以要卡卡块长,大概取 \(B=\frac{n}{30}\) 左右。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e5 + 1, SIZ = 3334;
int n, m, M, cnt, Lst[N];
int head[N + N], nxt[N + N], to[N + N], tcnt;
inline void addedge(int x, int y) {nxt[++tcnt] = head[x], to[tcnt] = y, head[x] = tcnt;}
int tot, top, ans[N];
pair<int, int> op[N], que[N], stk[N], val[N];
int fa[N], siz[N];
short blk[N][31];
inline int FindSet(int x) {return fa[x] == x ? x : FindSet(fa[x]);}
inline void merge(int x, int y) {
	x = FindSet(x), y = FindSet(y);
	if(x == y) return;
	if(siz[x] > siz[y]) swap(x, y);
	fa[x] = y, siz[y] += siz[x];
	for(int i = 1; i <= M; i++) blk[y][i] += blk[x][i];
	stk[++top] = {x, y};
}
inline void del(register int K) {
	while(top > K) {
		register int x = stk[top].first, y = stk[top].second; top--;
		siz[y] -= siz[x]; for(int i = 1; i <= M; i++) blk[y][i] -= blk[x][i];
		fa[x] = x;
	}
}
inline void dfs(register int x) {
	register int K = top;
	if(x > 0) merge(op[x].first, op[x].second);
	for(int p = head[m + x]; p; p = nxt[p]) {
		int t = to[p], x = FindSet(que[t].first), y = 0, k = que[t].second;
		if(k > siz[x]) {ans[t] = -1; continue;}
		for(register int i = 1; i <= M; i++) {
			if(k > blk[x][i]) k -= blk[x][i];
			else {y = i; break;}
		}
		for(register int i = (y - 1) * SIZ + 1; i <= y * SIZ && k; i++) if(FindSet(val[i].second) == x) k--, ans[t] = val[i].first;
	} 
	for(int p = head[x]; p; p = nxt[p]) dfs(to[p]);
	if(x > 0) del(K);
}
int main() {
	#ifdef ddxrS    
		freopen("sample.in", "r", stdin);
		freopen("sample.out", "w", stdout);
	#endif
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin>>n>>m; M = (n + SIZ - 1) / SIZ; cerr<<M<<'\n';
	for(register int i = 1; i <= n; i++) cin>>val[i].first, val[i].second = i;
	sort(val + 1, val + n + 1);
	for(register int i = 1; i <= n; i++) {
		fa[i] = i, siz[i] = 1;
		blk[val[i].second][(i - 1) / SIZ + 1]++;
	}
	for(register int i = 1, opt, x, y, lst = 0; i <= m; i++) {
		cin>>opt>>x;
		if(opt == 1) cin>>y, addedge(lst, cnt + 1), op[lst = ++cnt] = {x, y}, Lst[i] = cnt;
		else if(opt == 2) lst = Lst[x], Lst[i] = lst;
		else if(opt == 3) cin>>y, addedge(m + lst, ++tot), que[tot] = {x, y}, Lst[i] = Lst[i - 1];
	}
	dfs(0);
	for(register int i = 1; i <= tot; i++) cout<<ans[i]<<'\n';
    cerr<<clock() * 1.0 / CLOCKS_PER_SEC<<'\n';
	return 0;
}

标签:战争,val,int,siz,Ynoi2014,lst,Lst,这场,FindSet
From: https://www.cnblogs.com/ddxrS/p/18545068

相关文章

  • 【量子芯链】书籍摘抄《芯片战争:争夺全球最关键技术》
    今天的电脑和智能手机运行在含有数十亿微小晶体管的芯片上,这些微小的电子开关通过打开和关闭来表示信息。因此,它们比美国陆军的“电子数字积分计算机”(ENIAC)要强大得太多,而后者是1945年最先进的计算机。这台巨型计算机总共只有18000个“开关”。(盖蒂图片社<GettyImages>)1957年,鲍勃......
  • 铁锈战争地图--小窄条战争
    本内容为原创,请勿用作商业用途,仅用于学习,交流,娱乐。本地图为电脑版,手机版正在制作中小窄条战争0.2.3版--操作步骤新建txt文本文档复制下方内容进txt文档将文档后缀改为.tmx放入游戏内mods文件夹下的maps文件夹复制内容:<?xmlversion="1.0"encoding="UTF-8"?><mapversio......
  • “你好BOE”即将重磅亮相上海国际光影节 这场“艺术x科技”的顶级光影盛宴不容错过!
    当艺术遇上科技,将会擦出怎样的璀璨火花?答案即将在首届上海国际光影节揭晓。9月29日-10月5日,全球显示龙头企业BOE(京东方)年度标杆性品牌IP“你好BOE”即将重磅亮相上海国际光影节,这也是虹口区的重点项目之一。现场BOE(京东方)将携手上海电影、上影元、OUTPUT、新浪微博、海信、OPPO、京......
  • 数据要素市场如何发展?2024WAIC零数科技这场论坛干货满满!
    7月6日,2024WAIC零数科技产业数据要素流通与应用论坛于上海世博中心430会议室成功举办。本次论坛由中国发展战略学研究会数字经济战略专委会主办,中国发展战略学研究会数字经济战略专委会、上海零数科技有限公司联合承办。作为2024WAIC重要分论坛之一,论坛以“激活数据要素×,筑基新质......
  • 全球高级持续威胁:网络世界的隐形战争
    背景在当今数字化时代,网络安全已经成为全球各国政府、企业和个人面临的最紧迫问题之一。高级持续威胁(APT,AdvancedPersistentThreats)是网络攻击中最复杂、最隐蔽、最具破坏力的一种形式。APT攻击者通常由国家支持或具备高度专业技能,他们使用复杂的策略和工具,长期潜伏在目标网......
  • 如何解决《罗马2全面战争》中的twitchsdk_32_release.dll错误模块跳出问题?实用技巧与
    当您启动《罗马2全面战争》时,可能会遇到与twitchsdk_32_release.dll相关的错误提示,这可能导致游戏无法正常运行。本篇文章将深入探讨这一问题的原因以及提供多种解决方法,帮助您顺利启动游戏。twitchsdk_32_release.dll错误模块跳出的原因twitchsdk_32_release.dll文件出现......
  • 战争密码 Python实现二战德军恩格玛机(Enigma)
    战争密码Python实现二战德军恩格玛机(Enigma)恩格玛机原理介绍转轮类的实现恩格玛机类的实现加解密类的实现加密解密完整代码加密代码解密代码注意恩格玛机原理介绍恩格玛机,在密码学史中通常被称为恩尼格玛密码机(Enigma),是一种用于加密与解密文件的密码机。它最早......
  • 《全面战争:战锤2》fhcat.dll丢失问题的深入修复指南
    《全面战争:战锤2》是一款策略游戏,在运行游戏时遇到fhcat.dll文件丢失的问题通常表明游戏缺少必要的动态链接库(DLL)文件。这类问题可能是由于游戏安装不完整、系统文件损坏或缺失等原因造成的。下面是详细的修复指南:fhcat.dll文件简介fhcat.dll是CreativeAssembly开发的《全......
  • 从经济角度来看历史战争,从历史角度来看经济周期
    该文主要通过上世纪二战前的两个历史事件,来聊聊经济的周期萧条和复苏。从经济周期看历史战争,从历史战争看经济周期。这才是一个整个大循环,也就是人们常说的康波周期鉴于多数财经媒体对这个机构的描述太课本化,太简单,存在一些误解,所以该文要结合历史上发生过的事情,把加息......
  • 《全面战争:三国》风灵月影二十五项修改器使用说明介绍
    风灵月影是一款广受玩家喜爱的游戏修改工具,能够帮助玩家调整《全面战争:三国》游戏中的各种参数,如资源、兵力、角色属性等,从而提升游戏体验以及降低游戏难度。特点介绍功能丰富:提供了无限金钱、无限经验、无限技能点、一回合改革等多项修改功能,帮助玩家更轻松地管理资源、提......