首页 > 其他分享 >暑假集训CSP提高模拟11

暑假集训CSP提高模拟11

时间:2024-07-29 19:08:04浏览次数:6  
标签:11 cnt ll 集训 短路 CSP vis id dis

暑假集训CSP提高模拟11

组题人: @KafuuChinocpp

\(T1\) P152. Fate \(24pts\)

  • 强化版: HDU1688 Sightseeing

  • 设 \(dis_{i,0/1}\) 表示从 \(s\) 到 \(i\) 的最短路/次短路长度, \(f_{i,0/1}\) 表示从 \(s\) 到 \(i\) 的最短路/次短路条数。

  • \(dijkstra\) 过程中按照路径长度与最短路、次短路的大小关系四种情况进行反讨。

  • 由于需要统计最短路及次短路,vis 数组同样需要记录当前是最短路还是次短路去更新状态

  • 最后判断一下次短路长度是否等于最短路长度减一。

    点击查看代码
    const ll p=1000000007;
    struct node
    {
    	ll nxt,to,w;
    }e[400010];
    struct quality
    {
    	ll dis,x,id;
    	bool operator < (const quality another) const
    	{
    		return dis>another.dis;
    	}
    };
    ll head[400010],vis[400010][2],dis[400010][2],f[400010][2],cnt=0;
    void add(ll u,ll v,ll w)
    {
    	cnt++;
    	e[cnt].nxt=head[u];
    	e[cnt].to=v;
    	e[cnt].w=w;
    	head[u]=cnt;
    }	
    void dijkstra(ll s)
    {
    	ll x,id,i;
    	priority_queue<quality>q;
    	memset(dis,0x3f,sizeof(dis));
    	memset(vis,0,sizeof(vis));
    	dis[s][0]=0;
    	f[s][0]=1;
    	q.push((quality){dis[s][0],s,0});
    	while(q.empty()==0)
    	{
    		x=q.top().x;
    		id=q.top().id;
    		q.pop();
    		if(vis[x][id]==0)
    		{
    			vis[x][id]=1;
    			for(i=head[x];i!=0;i=e[i].nxt)
    			{
    				if(dis[e[i].to][0]>dis[x][id]+e[i].w)
    				{
    					dis[e[i].to][1]=dis[e[i].to][0];
    					f[e[i].to][1]=f[e[i].to][0];
    					dis[e[i].to][0]=dis[x][id]+e[i].w;
    					f[e[i].to][0]=f[x][id];
    					q.push((quality){dis[e[i].to][0],e[i].to,0});
    					q.push((quality){dis[e[i].to][1],e[i].to,1});
    				}
    				else
    				{
    					if(dis[e[i].to][0]==dis[x][id]+e[i].w)
    					{
    						f[e[i].to][0]=(f[e[i].to][0]+f[x][id])%p;
    					}
    					else
    					{
    						if(dis[e[i].to][1]>dis[x][id]+e[i].w)
    						{
    							dis[e[i].to][1]=dis[x][id]+e[i].w;
    							f[e[i].to][1]=f[x][id];
    							q.push((quality){dis[e[i].to][1],e[i].to,1});
    						}
    						else
    						{
    							if(dis[e[i].to][1]==dis[x][id]+e[i].w)
    							{
    								f[e[i].to][1]=(f[e[i].to][1]+f[x][id])%p;
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	ll n,m,s,t,u,v,i;
    	cin>>n>>m>>s>>t;
    	for(i=1;i<=m;i++)
    	{
    		cin>>u>>v;
    		add(u,v,1);
    		add(v,u,1);
    	}
    	dijkstra(s);
    	cout<<(dis[t][1]-1==dis[t][0])*f[t][1]<<endl;
    	return 0;
    }
    

\(T2\) P153. EVA \(5pts\)

  • 原题: [ABC274F] Fishing

  • 从贪心的角度分析,网的一端和至少一条鱼重合一定不劣。

  • 考虑枚举与左端点重合的鱼,然后固定这条鱼,令其他鱼与其做相对运动,处理出进入网的左右 \(t\) 边界,差分后,由于左端点已经固定,所以直接继承即可。

  • 特判速度相等的情况。

  • 略卡精度。

    点击查看代码
    const double eps=1e-10;
    int w[2010],x[2010],v[2010];
    map<double,int>d;
    map<double,int>::iterator it;
    int main()
    {
    	int n,a,ans=0,sum,i,j;
    	double l,r;
    	cin>>n>>a;
    	for(i=1;i<=n;i++)
    	{
    		cin>>w[i]>>x[i]>>v[i];
    	}
    	for(i=1;i<=n;i++)
    	{
    		d.clear();
    		sum=w[i];
    		for(j=1;j<=n;j++)
    		{
    			if(i!=j)
    			{
    				if(v[i]==v[j])
    				{
    					if(x[i]<=x[j]&&x[j]<=x[i]+a)
    					{
    						sum+=w[j];
    					}
    				}
    				else
    				{
    					l=1.0*(x[i]-x[j])/(v[j]-v[i]);
    					r=1.0*(x[i]+a-x[j])/(v[j]-v[i]);	
    					if(l-r>eps)//左右端点颠倒了要颠倒回来
    					{
    						swap(l,r);
    					}
    					if(r>=0)//保证存在区间
    					{
    						l=max(l,0.0);
    						d[l]+=w[j];
    						d[r+eps]-=w[j];
    					}
    				}
    			}
    		}
    		ans=max(ans,sum);
    		for(it=d.begin();it!=d.end();it++)
    		{
    			sum+=it->second;
    			ans=max(ans,sum);
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

\(T3\) P166. 嘉然登场 \(5pts\)

\(T4\) P178. Clannad \(0pts\)

总结

  • \(T1\)
    • 没想到在 \(dijkstra\) 过程中同样也能更新次短路,说明对 \(dijkstra\) 节点标记的认识不清楚。
    • 在最短路 \(DAG\) 上统计答案上仅考虑到了最短路径上的点,没考虑到非最短路径上的点也能转移过来。

后记

标签:11,cnt,ll,集训,短路,CSP,vis,id,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18330814

相关文章

  • 『模拟赛』暑假集训CSP提高模拟11
    Rank昨天积攒的rp生效了!A.Fate签到题。次短路计数,感觉做过类似的,不过这里次短路定义为最短路长度+1,赛时把自环想成环了,原谅我犯唐。还是用dijkstra,我们这次开两个dis数组存最短路和次短路长度,然后两个cnt数组存二者的个数,稍微想想就能想到一共的四种可能:更新后......
  • 【C++11】C++11新纪元:深入探索右值引用与移动语义
    ......
  • CSP11
    CSP11T1暴力#include<bits/stdc++.h>#definespeed()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);#definelllonglong#defineullunsignedlonglong#definelid(rt<<1)#definerid(rt<<1|1)//#defineendl'\n'//#d......
  • 都是全志T113处理器,“-i”和“-S3”有什么区别?
    自9个月前,创龙科技“1片含税就79元”的全志T113-i双核[email protected]的工业核心板(SOM-TLT113)推出之后,不少嵌入式软硬件工程师、用户都咨询我们,究竟T113-i和T113-S3这两款处理器有什么区别?不同后缀型号的处理器,哪个更适合工业场景?今天,创龙科技就为大家深度揭秘,详细讲解......
  • spellman电源维修XRM50P50X3839 NY11788
    电源维修的常见故障包括:无法开机、电源烧、短路、输出偏小、电源不通电、电源风扇不转,无输出,缺项,输出过高,电源烧毁,灯不亮,不动作等故障维修。Spellman的专有高压技术,再加上MT电路,导致了一个紧凑和轻量级的模块,是理想的OEM应用布置来获得的高压输出,而较低的电压单元则采用稳健......
  • GLSL教程 第11章:性能优化和调试
    目录11.1GLSL着色器的性能考量11.1.1减少计算复杂度避免不必要的计算使用适当的数据类型优化数学操作11.1.2减少内存访问减少纹理采样次数使用纹理缓存11.1.3优化数据传输减少数据传输量批处理(Batching)11.1.4使用高级渲染技术LevelofDetail(LOD)延迟渲染......
  • 911、基于51单片机的温度报警(上下限,LCD)
    完整资料或代做滴滴我(有偿)目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能温度报警系统1、实时显示当前温度2、对上下限进行设定,通过按键设置3、温度高于上限或低于下限显示屏有相应提示,蜂鸣器响二、proteus仿真三......
  • CF1178D Prime Graph 题解
    首先考虑一个问题:如果没有边数是素数的限制,应该怎么构造?这其实很简单,把原图连成一个环即可,每个点度数为\(2\)。接着考虑在原图上加边,注意到\(3\)也是个素数,所以每次可以任意选两个度数为\(2\)的点连边,此时仍然符合条件。这样加边最多可以加\(\left\lfloor\frac{n}{2}\rig......
  • CSP2023&NOIP2023游记
    CSP(10.21)早上8:30开考,根据以往的经验,去考场去早了也只能白等着,所以这次差不多8:10才进考场(指的是进学校大门),到的时候发现我们机房的几个同学都先走了。先是普及组,希望拿个400,还是比较有信心的。J组8:30开始考试。先看了一下四道题,前三道都是直接看出了思路,T4感觉有点难度,到时候可......
  • (BS ISO 11898-1:2015)CAN_FD 总线协议详解5- MAC子层描述4
    5.5帧编码帧中的比特流应按照不归零(NRZ,Non-Return-to-Zero)方法进行编码。这意味着在整个比特时间内生成的比特电平是恒定不变的。为了限制可用于同步的最大边沿(即信号波形的上升沿或下降沿)间距,帧的不同部分如起始边界(SOF,StartofFrame)、仲裁字段、控制字段、数据字段以......