首页 > 其他分享 >[USACO24FEB] Bessla Motors G 题解

[USACO24FEB] Bessla Motors G 题解

时间:2024-03-28 12:58:17浏览次数:26  
标签:int 题解 hp Motors len vis inline USACO24FEB void

题目大意

对于每个充电站找它所能去到的非充电站的点 T T T($ C<T$ 同时两点的距离在 R R R 之内)。
然后对点 T T T进行统计,看共有多少不同的充电站经过它(设达成条件的充电站个数为 x x x)。

对于每个 x x x:

如果有 K ≤ x K\leq x K≤x 则该点被计入答案

分析

这道题直接跑全源最短路( J o h n s o n Johnson Johnson)。
用 J o h n s o n Johnson Johnson 的时间复杂度为 O ( N M log ⁡ M ) O(NM\log M) O(NMlogM)。

分两类,从充电站跑和从非充电站跑。

由于数据很水所以卡一下数据就能过。

Code

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+100;
const int MAXM=1e5+100;
const int inf=2147483647;
int n,m,c,r,k,cnt,sum,d[MAXN],hd[MAXM*2],nxt[MAXM*2],to[MAXM*2],val[MAXM*2],bz[MAXN];
bool vis[MAXN];
inline void myswap(int &x,int &y){int t=x;x=y;y=t;}
inline void add(int u,int v,int l)
{
	to[++cnt]=v;
	val[cnt]=l;
	nxt[cnt]=hd[u];
	hd[u]=cnt;
}
struct heap
{
	int q[MAXN],id[MAXN],len;
	inline void init(){len=0;}
	inline void push(int x,int iid)
	{
		len++;
		q[len]=x;
		id[len]=iid;
		int p=len;
		while(p/2&&q[p/2]>q[p])
		{
			myswap(q[p/2],q[p]);
			myswap(id[p/2],id[p]);
			p/=2;
		}
	}
	inline int getmin(){return id[1];}
	inline void pop()
	{
		id[1]=id[len];
		q[1]=q[len--];
		int p=1;
		while(p*2<=len)
		{
			int son=p*2;
			if(son+1<=len&&q[son+1]<q[son]) son++;
			if(q[p]<q[son]) break;
			myswap(q[son],q[p]);
			myswap(id[son],id[p]);
			p=son;
		}
	}
	inline bool empty(){return len>0?false:true;}
}hp;
inline void Dijkstra(int s)
{
	hp.init();
	int res=inf;
	for(int i=1;i<=n;i++) d[i]=inf,vis[i]=false;
	hp.push(0,s);
	d[s]=0;
	while(!hp.empty())
	{
		int x=hp.getmin();
		hp.pop();
		if(vis[x]) continue ;
		if(!vis[x]&&x>c)
		{
			bz[x]++;
			if(bz[x]==k) sum++;
		}
		vis[x]=true;
		for(int i=hd[x];i;i=nxt[i])
		{
			int v=to[i],l=val[i];
			if(d[v]>d[x]+l&&d[x]+l<=r)
			{
				d[v]=d[x]+l;
				if(!vis[v]) hp.push(d[v],v);
			}
		}
	}
}
inline void Dijkstra2(int s)
{
	hp.init();
	int res=inf;
	for(int i=1;i<=n;i++) d[i]=inf,vis[i]=false;
	hp.push(0,s);
	d[s]=0;
	while(!hp.empty())
	{
		int x=hp.getmin();
		hp.pop();
		if(vis[x]) continue ;
		vis[x]=true;
		for(int i=hd[x];i;i=nxt[i])
		{
			int v=to[i],l=val[i];
			if(d[v]>d[x]+l&&d[x]+l<=r)
			{
				d[v]=d[x]+l;
				if(v<=c) bz[s]++;
				if(bz[s]==k)
				{
					sum++;
					break;
				}
				if(!vis[v]) hp.push(d[v],v);
			}
		}
		if(bz[s]==k) break;
	}
}
int main()
{
//	freopen("bm.in","r",stdin);
//	freopen("bm.out","w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&c,&r,&k);
	for(int i=1;i<=m;i++)
	{
		int u,v,l;
		scanf("%d%d%d",&u,&v,&l);
		add(u,v,l),add(v,u,l);
	}
	if(c<=10000) for(int i=1;i<=c;i++)
	{
		Dijkstra(i);
	}
	else for(int i=c+1;i<=n;i++)
	{
		Dijkstra2(i);
	}
	printf("%d\n",sum);
	for(int i=c+1;i<=n;i++) if(bz[i]>=k) printf("%d\n",i);
	return 0;
}

标签:int,题解,hp,Motors,len,vis,inline,USACO24FEB,void
From: https://blog.csdn.net/2301_82143651/article/details/137108224

相关文章

  • 2006 年考研英语真题 - 翻译题解析
    2006 年考研英语真题 - 翻译题解析IsittruethattheAmericanintellectualisrejectedandconsideredofnoaccountinhissociety?[1] 翻译:难道美国的知识分子被嫌弃,在社会中不受重视吗?1.it 是形式主语,代指后面的 that 从句。2.Americanintellectual 美......
  • 2007 年考研英语真题 - 翻译题解析
    2007 年考研英语真题 - 翻译题解析ThestudyoflawhasbeenrecognizedforcenturiesasabasicintellectualdisciplineinEuropeanuniversities.[1]                  翻译:几个世纪以来,欧洲的各所大学一直认为法学学习是一门基础知识学科。1.......
  • P5470 [NOI2019]序列 题解
    P5470:NOI2019序列题意:给定两个长度\(n\)的序列\(a,b\)。要求各选出\(k\)个数,使得这\(2k\)个数之和最大,且两个序列选出的数至少有\(l\)个位置相同。\(n\le2\times10^5\)。command_block的题解但是这个貌似有一些小问题,后文有写。算法:模拟费用流。【费用流模......
  • 2003 年考研英语真题 - 翻译题解析
    2003 年考研英语真题 - 翻译题解析Humanbeingsinalltimesandplacesthinkabouttheirworldandwonderattheirplaceinit.[1]             翻译:各时期各地区的人们都思考各自的世界并想知道自己在其中的位置。1.Humanbeing 人;人类。2.inal......
  • 2002 年考研英语真题 - 翻译题解析
    2002年考研英语真题- 翻译题解析Almostallourmajorproblemsinvolvehumanbehavior,andtheycannotbesolvedbyphysicalandbiologicaltechnologyalone.[1]            翻译:几乎我们所有主要问题都涉及到人类行为,而这些问题仅靠物理和生物技术手......
  • 「CF1677D」Tokitsukaze and Permutations的题解
    「CF1677D」TokitsukazeandPermutations首先,若\(v\)的后\(k\)个数中有一个\(>0\),或有\(v_i>i-1(i\in[1,n])\),则无解。我们发现,每次对\(p\)进行了一次操作后,\(v\)也一定会对应的进行一次变化,所以统计\(p\)的个数就相当于统计\(v\)的个数。我们对于每一次冒泡排序......
  • [THUWC2018]城市规划的题解
    [THUWC2018]城市规划连通块问题,我们考虑树形DP。设\(f_{u,j}\)表示在以\(u\)为根的子树内,选的颜色集合为\(a_{u},j\)(两个颜色都必须选)且必须选点\(u\)的情况下的连通块个数。特殊的,\(f_{u,a_{u}}\)表示颜色只有\(a_{u}\)的情况数。对于\(v\inson_u\),有:若\(a_{u......
  • 【题解】P10235 [yLCPC2024] C. 舞萌基本练习
    P10235舞萌基本练习题解思路看到最大值最小首先考虑二分答案。由于答案满足单调性,可以二分不优美度的最大值,也就是逆序对数的最大值。我们在每次增加一个元素的时候都要求解当前区间的逆序对数,所以不能用归并排序求逆序对数,考虑树状数组解法。如果不会树状数组求逆序对,请出......
  • 【题解】P4553 80人环游世界
    一眼丁真,鉴定为费用流思路类似于路径覆盖问题。考虑把每个点拆成入点\(x\)和出点\(y\)。对于每个点的入点\(x\)都向这个点的出点\(y\)连一条容量为\(V_i\),费用为\(0\)的边来控制每个点会被访问\(V_i\)次。然后建一个中间点\(p\),连一条\(s\Rightarrowp\)容量......
  • 2023第14届蓝桥杯大赛软件赛省赛C/C++大学A组第6题题解
    目录问题描述:方法一:dfs暴力模拟(45%)方法二:dfs剪枝(100%)问题描述:        小蓝正在一个瓜摊上买瓜。瓜摊上共有n个瓜,每个瓜的重量为Ai。小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。小蓝希望买到的瓜的重量的和恰好为m。请问小蓝至......