整理日期参照赛事或原文时间线安排,不代表原始发表时间。实际整理于 2026-10-24。
原文涉及的赛题或内容至少已到 2024-04-20,整理日期据此安排;其余保留难度排序。
时间依据
难度为阅读建议,可从 ACM 学习索引 按阶段阅读。
2024天梯赛L3-1https://pintia.cn/problem-sets/994805046380707840/exam/problems/1781658570803388428?type=7&page=1
题意:网格图上有障碍物,空地,给定若干起点,和一个终点,求唯一的最短路。也就是存在大于等于两个起点到终点距离相同的时候,这些起点无法贡献答案。
Solution:考虑直接从终点开始bfs,得到所有答案,最后统计起点即可更新答案。
实现细节:首先这个题目给的坐标是和以往反过来的,需要我们仔细读题和看样例。其次我们在统计答案的时候,直接维护值域的哈希表,不应该维护pair坐标的哈希表,不然肯定不会出现重复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| int n, m; int a[N][N]; map<pii,int>mp; int dx[5]={1,0,0,-1}; int dy[5]={0,-1,1,0}; void solve(){ cin>>n>>m; pii rt; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]==2)rt={i,j}; } } queue<pii>q; q.push(rt);mp[rt]=0; while(q.size()){ auto u=q.front();q.pop(); for(int i=0;i<4;i++){ int tx=u.fs+dx[i],ty=u.sec+dy[i]; if(tx<1||tx>n||ty<1||ty>m)continue; if(mp.count({tx,ty}))continue; if(a[tx][ty]!=1)continue; pii tmp={tx,ty}; mp[tmp]=mp[u]+1; q.push(tmp); } }
int k;cin>>k; map<int,int>ans1; map<int,int>id; for(int i=1;i<=k;i++){ int y,x;cin>>y>>x; pii tmp={x,y}; if(mp.count(tmp)==0)continue; ans1[mp[tmp]]++; id[mp[tmp]]=i; } int ansid=0,res=inf; for(auto [x,y]:ans1){ if(y>=2)continue; else { if(res>x){ res=x; ansid=id[x]; } } } if(res==inf)cout<<"No winner."; else { cout<<ansid<<" "<<res; } }
|