首页 > 其他分享 >P7984 [USACO21DEC] Tickets P 题解

P7984 [USACO21DEC] Tickets P 题解

时间:2024-11-08 08:50:40浏览次数:1  
标签:Tickets rt 题解 ll make pair USACO21DEC id dis

题目传送门

前置知识

线段树优化建图 | 最短路

解法

考虑对票建虚点,从 \(c_{i}\) 向 \(i+n\) 连一条权值为 \(p_{i}\) 的边,然后从 \(i+n\) 向 \([a_{i},b_{i}]\) 连一条权值为 \(0\) 的边。

建出反图后 \(1 \to i\) 和 \(n \to i\) 的路径集合会有重复统计的部分,不妨以 \(dis_{1,i}+dis_{n,i}\) 作为初始值然后再进行一遍松弛操作(若没有重复部分就不需要松弛了)。

然后就是线段树优化建图板子了。

代码

struct SMT_Q_BG
{
	ll id[900010],dis[2][900010],d[900010],vis[900010];
	vector<pair<ll,ll> >e[900010];
	ll lson(ll x)
	{
		return x*2;
	}
	ll rson(ll x)
	{
		return x*2+1;
	}
	void build(ll rt,ll l,ll r,ll n)
	{
		e[rt+n*4].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+n*4].push_back(make_pair(lson(rt)+n*4,0));
		e[rt+n*4].push_back(make_pair(rson(rt)+n*4,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 x,ll y,ll pos,ll w,ll n)
	{
		if(x<=l&&r<=y)
		{
			e[rt].push_back(make_pair(pos+n*8,w));
			return;
		}
		ll mid=(l+r)/2;
		if(x<=mid)
		{
			update(lson(rt),l,mid,x,y,pos,w,n);
		}
		if(y>mid)
		{
			update(rson(rt),mid+1,r,x,y,pos,w,n);
		}
	}
	void dijkstra1(ll s,ll id)
	{
		memset(vis,0,sizeof(vis));
		memset(dis[id],0x3f,sizeof(dis[id]));
		priority_queue<pair<ll,ll> >q;
		dis[id][s]=0;
		q.push(make_pair(-dis[id][s],s));
		while(q.empty()==0)
		{
			ll x=q.top().second;
			q.pop();
			if(vis[x]==0)
			{
				vis[x]=1;
				for(ll i=0;i<e[x].size();i++)
				{
					if(dis[id][e[x][i].first]>dis[id][x]+e[x][i].second)
					{
						dis[id][e[x][i].first]=dis[id][x]+e[x][i].second;
						q.push(make_pair(-dis[id][e[x][i].first],e[x][i].first));
					}
				}
			}
		}
	}
	void dijkstra2(ll n,ll k)
	{
		memset(vis,0,sizeof(vis));
		priority_queue<pair<ll,ll> >q;
		for(ll i=1;i<=8*n+k;i++)
		{
			d[i]=dis[0][i]+dis[1][i];
			q.push(make_pair(-d[i],i));
		}
		while(q.empty()==0)
		{
			ll x=q.top().second;
			q.pop();
			if(vis[x]==0)
			{
				vis[x]=1;
				for(ll i=0;i<e[x].size();i++)
				{
					if(d[e[x][i].first]>d[x]+e[x][i].second)
					{
						d[e[x][i].first]=d[x]+e[x][i].second;
						q.push(make_pair(-d[e[x][i].first],e[x][i].first));
					}
				}
			}
		}
	}
}T;
int main()
{
	ll n,k,c,p,a,b,i;
	cin>>n>>k;
	T.build(1,1,n,n);
	for(i=1;i<=k;i++)
	{
		cin>>c>>p>>a>>b;
		T.e[i+n*8].push_back(make_pair(T.id[c]+n*4,p));
		T.update(1,1,n,a,b,i,0,n);
	}
	T.dijkstra1(T.id[1],0);
	T.dijkstra1(T.id[n],1);
	T.dijkstra2(n,k);
	for(i=1;i<=n;i++)
	{
		cout<<(T.d[T.id[i]]<1e15?T.d[T.id[i]]:-1)<<endl;
	}
	return 0;
}

标签:Tickets,rt,题解,ll,make,pair,USACO21DEC,id,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18534355

相关文章

  • 快速上手Docker部署Flask项目 附常见问题解决
    一、准备Flask项目1.项目结构有一个app.py文件作为主应用程序入口,内容示例:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=='__main__':app.run(host='0.0.0.0&#......
  • P9192 [USACO23OPEN] Pareidolia P 题解
    P9192[USACO23OPEN]PareidoliaP题解首先自然考虑不带修的情况。考虑问题的本质就是求序列中尽量短的bessie序列个数。对于尽量短的理解是对于bessiebessie序列,不考虑其由\(1,8\sim12\)构成的序列,只考虑\(1\sim6,7\sim12\)组成的序列。于是考虑dp:设\(dp_{i......
  • CF1956F Nene and the Passing Game 题解
    处理很妙的题,部分细节请教了未来姚班zyl和LYH_cpp,在此鸣谢。首先考虑把题目给的式子进行转化,设\(i<j\),那么\(i\)和\(j\)能传球当且仅当\(l_i+l_j\lej-i\ler_i+r_j\)。移项并拆开得到,\(i+l_i\lej-l_i\)且\(i+r_i\gej-r_j\),如果画到数轴上的话......
  • 题解:P11253 [GDKOI2023 普及组] 小学生数学题
    所求的式子带除法,模意义下除法计算复杂度带\(\log\)太慢了,先改写成乘法:\(\sum_{i=1}^ni!\timesi^{-k}\)。想求这个式子,最简单的思路就是对于每个整数\(i\in[1,n]\),分别预处理出\(i!\)和\(i^{-k}\)的值,最后乘起来再\(O(n)\)暴力加起来就好了!对于\(i!\),注意到:\[i!=\b......
  • P4621 [COCI2012-2013#6] BAKTERIJE 题解
    一道很好的数学题。首先不难想到每个细菌的移动路线是有循环节的,循环节外的时间最多就是每个格子的四个方向都走一遍,也就是\(4\timesN\timesM\)。可以预处理每个细菌分别通过四个方向第一次到达终点的时间\(b_{i,0/1/2/3}\)和再次回到当前状态的循环节长度\(md_{i,0/1/2/......
  • 题解:[BZOJ2958] 序列染色
    ProblemLinkBZOJ2958序列染色题意给出一个长度为\(n\),由\(\ttB,W,X\)三种字符组成的字符串\(S\),你需要把每一个\(\ttX\)染成\(\ttB\)或\(\ttW\)中的一个。Solution字符串,染色,方案数,一眼\(dp\)。要求前半段是B,后半段是W。考虑容斥。\(f_{i,0/1},g_{i,......
  • IOR的脚本化、版本兼容性及常见问题解答
    脚本化IOR可以使用-f选项在命令行中使用输入脚本。在-f选项之前设置的命令行选项将被视为运行脚本的默认设置。例如:mpirun./ior-W-fscript将使用隐式-W运行脚本中的所有测试。脚本本身可以覆盖这些设置,并且可以设置为在一次执行下运行许多不同的IOR测试,重要的是要注意在-......
  • 【题解】CF1944
    CF1944A简要题意给定完全图删k条边使得从一号点开始的可达点最少Solution注意到最多需要删n-1条边就可以使得任意一个其他点都到达不了又注意到只要删的边少于n-1就可以从一号点走出去,主要走出去就可以走到任何点所以这题答案只有两种如果k≤n-1答案为n否则答案为1......
  • 题解:P11248 [GESP202409 七级] 矩阵移动
    题目传送门题目大意给出一个nnn行mmm列的只包含0、1、?的矩......
  • 【记录】Cordial Sync具身智能协作源码复现及问题解决
    论文简要总结智能体需要合作将家具移动到客厅的指定位置。这个任务与现有的任务不同,它要求智能体在每个时间步都必须进行协调。模型部分1.SYNC-policies(SynchronizeYourActionsCoherently)为了解决智能体在每个时间步都需要协调的问题,研究者提出了SYNC-policies。这......