首页 > 其他分享 >【模板】线段树优化建图

【模板】线段树优化建图

时间:2023-07-21 20:56:27浏览次数:35  
标签:rt int ll back pair 建图 push 线段 模板

区间连区间

luogu P6348 [PA2011] Journeys 略带卡常

#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>e[4200001];
int dis[4200001],id[4200001];
int lson(int l)
{
    return l*2;
}
int rson(int l)
{
    return l*2+1;
}
void build(int rt,int l,int r,int n)
{
	e[rt+4*n].push_back(make_pair(rt,0));
	if(l==r)
	{
		id[l]=rt;
		return;
	}
	e[lson(rt)].push_back(make_pair(rt,0));
	e[rson(rt)].push_back(make_pair(rt,0));
	e[rt+4*n].push_back(make_pair(lson(rt)+4*n,0));
	e[rt+4*n].push_back(make_pair(rson(rt)+4*n,0));
	int mid=(l+r)/2;
	build(lson(rt),l,mid,n);
	build(rson(rt),mid+1,r,n);
}
void update(int rt,int l,int r,int L,int R,int pd,int n,int t)
{
	if(L<=l&&r<=R)
	{
		if(pd==0)
		{
			e[rt].push_back(make_pair(8*n+t,0));
		}
		else
		{
			e[8*n+t].push_back(make_pair(rt+4*n,1));
		}
		return;
	}
	int mid=(l+r)/2;
	if(L<=mid)
	{
		update(lson(rt),l,mid,L,R,pd,n,t);
	}
	if(mid<R)
	{
		update(rson(rt),mid+1,r,L,R,pd,n,t);
	}
}
void bfs(int p)
{
	int x,i;
	memset(dis,0x3f,sizeof(dis));
    deque<int> q;
    dis[id[p]]=0;
    q.push_back(id[p]);
    while(q.empty()==0)
    {
		x=q.front();
		q.pop_front();
		for(i=0;i<e[x].size();i++)
		{
			if(dis[e[x][i].first]>dis[x]+e[x][i].second)
			{
				dis[e[x][i].first]=dis[x]+e[x][i].second;
				if(e[x][i].second==1)
				{
					q.push_back(e[x][i].first);
				}
				else
				{
					q.push_front(e[x][i].first);
				}
			}
		}
	}
}
int main()
{
    int n,m,p,t=0,i,a,b,c,d;
    scanf("%d%d%d",&n,&m,&p);
    build(1,1,n,n);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        t++;
        update(1,1,n,a,b,0,n,t);
        update(1,1,n,c,d,1,n,t);
        t++;
        update(1,1,n,a,b,1,n,t);
        update(1,1,n,c,d,0,n,t);
    }
    bfs(p);
    for(i=1;i<=n;i++)
    {
        if(i==p)
        {
            printf("0\n");
        }
        else
        {
            printf("%d\n",dis[id[i]+4*n]);
        }
    }
    return 0;
}

点连点,点连区间

CF786B Legacy

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define sort stable_sort 
#define endl '\n'
vector<pair<ll,ll>>e[4200001];
ll dis[4200001],id[4200001],vis[4200001];
ll lson(ll l)
{
    return l*2;
}
ll rson(ll l)
{
    return l*2+1;
}
void build(ll rt,ll l,ll r,ll n)
{
	e[rt+4*n].push_back(make_pair(rt,0));
	if(l==r)
	{
		id[l]=rt;
		return;
	}
	e[lson(rt)].push_back(make_pair(rt,0));
	e[rson(rt)].push_back(make_pair(rt,0));
	e[rt+4*n].push_back(make_pair(lson(rt)+4*n,0));
	e[rt+4*n].push_back(make_pair(rson(rt)+4*n,0));
	ll mid=(l+r)/2;
	build(lson(rt),l,mid,n);
	build(rson(rt),mid+1,r,n);
}
void update(ll rt,ll l,ll r,ll L,ll R,ll pd,ll n,ll t)
{
	if(L<=l&&r<=R)
	{
		if(pd==0)
		{
			e[rt].push_back(make_pair(8*n+t,0));
		}
		else
		{
			e[8*n+t].push_back(make_pair(rt+4*n,pd));
		}
		return;
	}
	ll mid=(l+r)/2;
	if(L<=mid)
	{
		update(lson(rt),l,mid,L,R,pd,n,t);
	}
	if(mid<R)
	{
		update(rson(rt),mid+1,r,L,R,pd,n,t);
	}
}
void dijkstra(ll s)
{
    ll x,i;
	priority_queue<pair<ll,ll> >q;
	memset(dis,0x3f,sizeof(dis));
	dis[id[s]]=0;
    q.push(make_pair(0,id[s]));
	while(q.empty()==0)
	{
		x=q.top().second;
		q.pop();
		if(vis[x]==0)
		{
			vis[x]=1;
			for(i=0;i<e[x].size();i++)
			{
				if(dis[e[x][i].first]>dis[x]+e[x][i].second)
				{
					dis[e[x][i].first]=dis[x]+e[x][i].second;
					q.push(make_pair(-dis[e[x][i].first],e[x][i].first));
				}
			}
		}
	}
}
int main()
{
    ll n,m,p,t=0,i,a,b,c,d,pd,w;
	cin>>n>>m>>p;
    build(1,1,n,n);
    for(i=1;i<=m;i++)
    {
		cin>>pd;//某人因为这个位置调了一下午
		if(pd==1)
		{
			cin>>a>>c>>w;
			b=a;
			d=c;
			t++;
			update(1,1,n,a,b,0,n,t);
			update(1,1,n,c,d,w,n,t);
		}
		if(pd==2)
		{
			cin>>a>>c>>d>>w;
			b=a;
			t++;
			update(1,1,n,a,b,0,n,t);
			update(1,1,n,c,d,w,n,t);
		}
		if(pd==3)
		{
			cin>>a>>c>>d>>w;
			b=a;
			t++;
			update(1,1,n,c,d,0,n,t);
			update(1,1,n,a,b,w,n,t);
		}
    }
    dijkstra(p);
    for(i=1;i<=n;i++)
    {
        if(i==p)
        {
			cout<<"0 ";
        }
        else
        {
			if(dis[id[i]+4*n]==0x3f3f3f3f3f3f3f3f)
			{
				cout<<"-1 ";
			}
			else
			{
				cout<<dis[id[i]+4*n]<<" ";
			}
        }
    }
    return 0;
}

标签:rt,int,ll,back,pair,建图,push,线段,模板
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17572381.html

相关文章

  • 【模板】图的计数相关:行列式及求值、Matrix-Tree 定理、BEST 定理、LGV 引理
    归类为线性代数、图论。证明都是神仙,特别是名字带“理”的,不证了。行列式定义行列式(Determinant)是对\(n\)阶方阵\(A\)定义的,是一个标量。\(A\)的\(n\)阶行列式\(det(A)\)或\(|A|\)定义如下:\[det(A)=\sum_p(-1)^{\mu(p)}\prod_{i}A[i][p_i].\]这里将排列的逆序对数......
  • 三维凸包 模板
    只会写增量法orz例题:P2287随机种子0x383494被卡了精度,eps=1e-10太大了#include<cstdio>#include<iostream>#include<bitset>#include<list>#include<random>#include<cmath>#include<algorithm>#defineUP(i,s,e)for(autoi=s;......
  • 洛谷 P8861 - 线段
    牛逼题。先考虑\(l\le10^5,10^5+1\ler\)的部分分:一种方法是线段树,即因为左右端点是独立的,因此对左右端点各维护一个权值线段树表示有多少个区间以这个值为左/右端点,这样对于修改,左端点的部分相当于先查询\(\lel\)的数的个数,然后将它们都挂到\(l\)上,最后把\(<l\)的部......
  • 基于vite的前端模板库create-xg
    一个类似于create-vite的快速生成模板,因为create-vite创建的项目模板只有最基础的东西,仍然需要安装第三方依赖如ui库等,还未达到开箱即用的程度。于是自己动手实现一个类似的模板库,包含vue/react、路由、ui库、axios、mock数据,可以在此基础上直接开发业务代码,避免重复的环境搭......
  • HTML模板继承导入
      include导入 include可以导入多次,extend继承只能一次......
  • 那些你不要的模板
    打qoj板子赛打的。有的是会的,只是之前没写过。就题论题,所以写的不一定是正解。回文自动机题意对于\(S\),记\(c_S(T)\)表示\(T\)在\(S\)中的出现次数。对所有回文串\(T\),求\(\max_T(c_S(T)\cdot|T|^2)\)。对于所有数据,\(|S|\leq10^6\)。题解经典结论:本质......
  • 线段树--区间最大值模板
    Smiling&Weeping----你是我绕过的山河错落,才找到的人间烟火ProblemDescriptionThereisasequence a oflength n.Weuse ai todenotethe i-thelementinthissequence.Youshoulddothefollowingthreetypesofoperationstoth......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......
  • html 数据可视化大屏展示模板源码分享(第一期)
    1、angular+echart.js统计数据图表读取投屏数据大屏2、生意参谋大数据可视化HTML模板3、大数据可视化展板通用模板4、基于echarts实现的销售统计数据可视化大屏模板5、新能源车联网综合大数据平台6、厅店效能大屏监控看板7、东海省交通大数据分析平台8、基于echarts......
  • 小旋风超级模板站群788套整站html5模板(已经过xxfseo处理)免费下载
    这784套整站模板来源于市面上的html5英文模板,经过机器处理(替换、过滤、精简、压缩)后,生成的。适用于超级模板站群。本来是1千多套的,删除了后台模板、单页模板。剩下784套不错的模板。整站多页面模板。----------------------------------------------------------------------使......