首页 > 其他分享 >LG P5537 【XR-3】系统设计

LG P5537 【XR-3】系统设计

时间:2024-08-13 17:28:06浏览次数:12  
标签:LG ch P5537 int mid read base 哈希 XR

本文核心卖点:用树状数组神秘地维护哈希(不如另一篇题解巧妙,内含简单数论知识)。

观察到,走这个操作的可行性关于走的步数有单调性,考虑二分走的步数。

那么如何判断从点 \(x\) 走 \(mid\) 步的可行性呢?树的结构是固定的,每一种走法(路径上每个点儿子的排名构成的序列)与走到某个重点一一对应,和哈希很类似。

那么二分出 \(mid\),求出走 \(mid\) 步的哈希值(即为 \(a[l...l+mid-1]\) 的哈希值)后,如何判断这个哈希值是否存在呢?

由于每个终点可能对应很多个起点,进行 \((起点,终点)\) 的哈希值的记录是 \(\mathcal O(n^2)\) 的。但是这种树上问题,起点终点又有祖先关系,容易想到前缀相关。

具体怎么做呢?根走到起点构成的序列对应唯一一个起点,但是起点到终点构成序列不一定对应唯一一条路径。那么就把这两个拼在一起,在全局中存在,就是在起点的子树内存在。用unordered_map再维护下。

这时候万事俱备,只欠支持单点修改,区间查询的哈希值维护了。

想偷懒,不想用线段树,那么树状数组怎么做呢。

我是铸币,想不到那篇题解中的做法。于是转而用了一种稍微复杂的。

有一个初步的想法,一个正常的树状数组+每一位的值为 \(a[i]*base^{n-i}\)。

但是这样区间查询出的值不是 \(a_l*base^{r-l}+...+a_r*base^{0}\) 的,而是全体乘上了一个 \(base^{m-r}\) ,我们想要把它除掉。

这时候就要求逆元了,可是我们又想偷懒,用自然溢出,模数为 \(2^{64}\) ,不是质数啊。

无所谓,模数是死的,\(base\) 是活的,我们只要求 \(base\) 的幂的逆元就行了,选一个与 \(2^{64}\) 互质的 \(base\) 就行了(按照讨论区的建议,用的一个神秘 \(base\))。

至此,这题就完成了。

#include <bits/stdc++.h>

using namespace std;

#define typ int
inline char gc(){static char buf[100000] , *p1 = buf , *p2 = buf;return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;}inline typ read(){typ x = 0; bool f = 0;char ch = gc();while(!isdigit(ch)){f |= (ch == '-');ch = gc();}while(isdigit(ch)){x = (x << 1) + (x << 3) + (ch ^ 48);ch = gc();}return (f ? -x : x);}

typedef unsigned long long ull;

const int N = 5e5 + 5;
const ull BB = 3846711;
const ull invBB = 918018653273039751;

int n , m , q , rt , a[N];
ull H[N] , B[N] , invB[N];

vector<int> E[N];

unordered_map<ull , int> mp;

namespace BIT {
	ull t[N];
#define lowbit(x) ((x) & (-(x)))
	void ch(int x , ull v){
		while(x <= m){
			t[x] += v;
			x += lowbit(x);
		}
	}
	ull qwq(int x){
		ull res = 0;
		while(x > 0){
			res += t[x];
			x -= lowbit(x);
		}
		return res;
	}
}

signed main(){
	n = read() , m = read() , q = read();
	for(int i = 1; i <= n; ++ i){
		int fa = read();
		if(fa == 0) rt = i;
		else {
			E[i].push_back(fa);
			E[fa].push_back(i);
		}
	}
	
	for(int i = 1; i <= m; ++ i) a[i] = read();
	
	for(int i = 1; i <= n; ++ i) 
		sort(E[i].begin() , E[i].end());
	
	invB[0] = B[0] = 1;
	for(int i = 1; i <= m; ++ i) {
		B[i] = B[i - 1] * BB;
		invB[i] = invB[i - 1] * invBB;
		assert(invB[i] * B[i] == 1);
	}
	
	function<void(int , int)> dfs = [&] (int u , int fa) -> void {
		mp[H[u]] = u;
		int rk = 0;
		for(auto v : E[u]){
			if(v == fa) continue;
			
			++ rk;
			H[v] = H[u] * BB + rk;
			
			dfs(v , u);
		}
	};
	
	dfs(rt , 0);
	
	for(int i = 1; i <= m; ++ i){
		BIT::ch(i , a[i] * B[m - i]);
	}
	
	for(int tt = 1; tt <= q; ++ tt){
		int op = read();
		if(op == 1){
			int u = read() , L = read() , R = read();
			int l = 0 , r = R - L + 1 , res = -1;
			while(l <= r){
				int mid = (l + r) >> 1;
				ull v = BIT::qwq(L + mid - 1) - BIT::qwq(L - 1);
				v *= invB[m - (L + mid - 1)];
				v += H[u] * B[mid];
				if(mp.find(v) != mp.end()){
					res = mp[v];
					l = mid + 1;
				}
				else {
					r = mid - 1;
				}
			}
//			assert(res != -1);
			printf("%d\n" , res);
		}
		if(op == 2){
			int x = read() , k = read();
			BIT::ch(x , -a[x] * B[m - x]);
			a[x] = k;
			BIT::ch(x , a[x] * B[m - x]);
		}
	}
	
	return 0;
}

标签:LG,ch,P5537,int,mid,read,base,哈希,XR
From: https://www.cnblogs.com/TongKa/p/18357393

相关文章

  • SSM基于Java通识课程管理系统v87xr 线上测试
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:学生,教师,教学视频,课程信息,选课信息,专业,学院,职称开题报告内容一、课题背景随着信息技术的飞速发展,教育领域对高效、智能的管理系统需求日益迫切......
  • 159.302 The 8-Puzzle: Search Algorithms
    159.302ArtificialIntelligenceAssignment#1The8-Puzzle:SearchAlgorithmsMaximumnumberofmemberspergroup:3studentsDeadlineforsubmission:9thofSeptemberInstructionsYourtaskistowriteaC++programthatwillsolvethe8-puzzleprob......
  • lg容斥与反演
    容斥与反演容斥之前从没有搞清楚的:容斥是一种方法,为了做到不重复计数,先算总和再去除重复的方法。所以我们可以计算任意具备一种性质的元素个数(并),通过计算“至少具备了某些元素的个数”(交)。另一种形式:总数-不满足所有性质的元素=任意满足一种性质的元素此时,不满足所有性质即......
  • 记录JSch连接SFTP Exception:Algorithm negotiation fail问题解决
    问题描述:关于正式环境访问外网连接不成功 1、首先检查是否开放防火墙(已确认开放),策略开放后,通过命令连接是否畅通: 通过telnet命令,可以得出,访问畅通。telnet192.168.1.122 2、查看生产环境日志,观察生产环境访问外网服务器异常:抛出异常,提示:算法协商失败com.jcraft.j......
  • 痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇)
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题探析。前段时间有一个RT1052客户反馈了一个有趣的问题,他们设计得是一个带LCD屏交互的应用,应用以官方SDK里的lvgl_demo_widgets_bm例程......
  • paddleocr_paddle_onnxruntime
    paddleocr_paddle论文PaddleOCR通过det、rec、cls三个模型分别实现字符检测、字符识别和字符方向分类的应用det模型主要用DB算法,参考论文如下:https://arxiv.org/pdf/1911.08947.pdfrec模型主要用SVTR算法,参考论文如下:https://arxiv.org/pdf/2205.00159.pdfcls模型用mobi......
  • xrender中的FormRender使用示例
    xrender是阿里的中后台「表单/表格/图表」开箱即用解决方案。先采用在线工具创建一个简单的schema:simple.tsexportdefault{"type":"object","properties":{"title":{"title":"标题","type&qu......
  • Linux 下利用 Valgrind 进行内存调试
    目录一、概述二、Valgrind的使用1、基本格式2、Valgrind工具集3、Memcheck3.1使用未初始化的内存3.2内存泄漏3.3在内存被释放后进行读/写3.4内存块的尾部进行读/写4、常见错误三、分析内存泄漏的使用技巧1、Valgrind协调GDB工作2、利用/proc定位问题3、使用......
  • COMPSCI 753 Algorithms for Massive Data
    COMPSCI753AlgorithmsforMassiveDataAssignment1/Semester2,2024GraphMiningGeneralinstructionsanddataThisassignmentaimsatexploringthePageRankalgorithmonbigreal-worldnetworkdata.Byworkingonthisassignment,youwilllearn......
  • lg-dp3
    lg-dp3计数的东西有什么特点、转化/好的刻画方式AFarthestCity题面关键信息:权值为1的最短路---bfs---分层那么显然加一个点他只能与上一层连,和一层内部连。则设\(f_{i,j}\)为[点数,最后一层点数]有\[f_{i,j}=2^{j\choose2}\sum_{k=1}^{i-j}{f_{i-j,k}(2^k-1)^j{n......