首页 > 其他分享 >st表+lca模板

st表+lca模板

时间:2024-03-01 19:58:52浏览次数:32  
标签:aa log ll long st fd lca 模板 define

st表

#include<bits/stdc++.h>
#define ll long long
#define fd(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
ll n,m,t,l,r,dp[1000100][100];
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>m>>n;
	fd(i,1,m) cin>>dp[i][0];
	t=log(m)/log(2)+1;
	fd(j,1,t)
	{
		fd(i,1,m-(1<<j)+1)
		{
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
		}
	}
	fd(i,1,n)
	{
		cin>>l>>r;
		ll tt=log(r-l+1)/log(2);
		printf("%lld\n",max(dp[l][tt],dp[r-(1<<tt)+1][tt]));
	}
	return 0;
}

LCA

#include<bits/stdc++.h>
#define ll long long
#define fd(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
ll n,m,s,tot,head[1000100],aa,bb;
ll d[1000100],f[1000100][20],t;
struct edge
{
	ll to,nxt,w;
}e[1000100];
void add(ll a,ll b,ll c)
{
	e[++tot].nxt=head[a];
	e[tot].to=b;
	e[tot].w=c;
	head[a]=tot;
}
void bfs()
{
	queue<ll> q;
	q.push(s);
	d[s]=1;
	while(!q.empty())
	{
		ll x=q.front();
		q.pop();
		for(ll i=head[x];i;i=e[i].nxt)
		{
			ll y=e[i].to;
			if(d[y]) continue;
			d[y]=d[x]+1;
			f[y][0]=x;
			fd(j,1,t)
			{
				f[y][j]=f[f[y][j-1]][j-1];
			}
			q.push(y);
		}
	}
}
ll lca(ll a,ll b)
{
	if(d[a]>d[b]) swap(a,b);
	for(ll i=t;i>=0;--i)
	{
		if(d[f[b][i]]>=d[a]) b=f[b][i];
	}
	if(a==b) return a;
	for(ll i=t;i>=0;--i)
	{
		if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
	}
	return f[a][0];
}
int main()
{
//	freopen("pow.in","r",stdin);
//	freopen("pow.out","w",stdout);
	cin>>n>>m>>s;
	fd(i,1,n-1)
	{
		cin>>aa>>bb;
		add(aa,bb,0);
		add(bb,aa,0);
	}
	t=log(n)/log(2);
	bfs();
	fd(i,1,m)
	{
		cin>>aa>>bb;
		cout<<lca(aa,bb)<<endl;
	}
	return 0 ;
}

标签:aa,log,ll,long,st,fd,lca,模板,define
From: https://www.cnblogs.com/whrwlx/p/18047806

相关文章

  • 树状数组模板
    单修区查【模板】树状数组1题目描述如题,已知一个数列,你需要进行下面两种操作:将某一个数加上$x$求出某区间每一个数的和输入格式第一行包含两个正整数$n,m$,分别表示该数列数字的个数和操作的总个数。第二行包含$n$个用空格分隔的整数,其中第$i$个数字表示数列......
  • 接口写完想快速压力测试?试试Apipost一键压测功能
    背景研发同学在调试完成某些接口后需要验证一下高并发情况下的接口运行情况。这时候必须得跟测试同学协调一下,但这来来回回也有点麻烦,而实际上,这个工作量并不算太大。所以Apipost也是推出了一键压测功能来解决这个痛点场景。这篇文章给大家介绍Apipost的一键压测功能。使用方法......
  • Lambda实现条件去重distinct List
    原文链接:https://blog.csdn.net/qq_39940205/article/details/114269686  _______________________________________________________________________________________________________________我们知道,Java8lambda自带的去重为distinct方法,但是只能过滤整体对象,不......
  • isinstance
    当然,我可以帮你将这些Python代码转化为Markdown格式的笔记。以下是你的Markdown笔记:Python中的isinstance函数isinstance是Python的内置函数,用于判断一个对象是否是一个已知的类型。1.使用方法一isinstance(数据,类型):如果该数据是这个类型,返回True;反之,返回False。n=123......
  • 反射型xss的post请求获取cookie
    攻击者构造的网站地址:192.168.10.12:100受害者主机:192.168.10.134目标服务器:192.168.10.1步骤一:受害者主机访问目标服务器根据提示登录步骤二:输入xssPayload<script>document.location='http://192.168.10.12:100/pkxss/xcookie/cookie.php?cookie='+document.cookie<......
  • go中的结构体struct
    结构体的介绍:golang支持面向对象,是基于struct来实现OOP特性的,相当于Java中的class类。golang去掉了传统的oop语言的继承,方法重载,构造函数和析构函数,隐藏的this指针。golang仍然有面向对象编程的继承,封装和多态的特性。但是golang的继承没有extends关键字,继承是通过匿名字段来......
  • Collapsing Strings
    做这道题目的时候学CDQ和整体二分学成傻逼了是吧?我寻思着非要把一整个数组传进去操作,明明一个一个考虑不就好了真的烦躁题外话,做这道题目的时候,探索出来一个东西,vector要放字符串的话,template可以写char*最开始的想法是编写一个函数work(vector<char*>a,vector<char*>b),然......
  • 学习unigui【22】unistringGrid的标题栏双击事件
    第一步:在TuniStringGrid的ClientEvents.ExtEvents中定义Ext.grid.Panel的reconfigure事件:functionreconfigure(sender,store,columns,oldStore,oldColumns,eOpts){columns.forEach(function(col){if(col.titleEl){col.titleEl.on('dblcli......
  • 【STL和泛型编程】4. hashtable、unordered_set、unordered_map
    1.hashtable前置知识:【数据结构】3.跳表和散列 基本原理:将Key计算成一个数值,然后取余数得到它在表头中的位置table(篮子)里每个指针都指向一个链表(桶)来存储余数相同的值如果桶内的元素个数比篮子个数还多,则将篮子的大小扩充篮子是vector,数量是质数,初始为53,53扩充后为97......
  • cnpm i报错 cpm:无法加载文件c:wsers vdministratorpata Roaming mpmcnpm.ps1,因为在
    cpm:无法加载文件c:wsersvdministratorpataRoamingmpmcnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅htps:/g.microsoft.con/fvlink/?LinkID=135170中的aboutExecutionPolicies。所在位置行:1字符:1+cnpmi.+CategoryInfoSecurityError:(:)[],PsSecuri......