ABC 235 的 DE
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABC 235 的 DE相关的知识,希望对你有一定的参考价值。
ABC 235 的 D、E
D - Multiply and Rotate(bfs)
看成边权为1的图,求最短路,就是 bfs了。
// Problem: D - Multiply and Rotate
// Contest: AtCoder - HHKB Programming Contest 2022(AtCoder Beginner Contest 235)
// URL: https://atcoder.jp/contests/abc235/tasks/abc235_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Date: 2022-01-15 22:54:44
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e7+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
int a,n;
int b[N];
int main()
scanf("%d%d",&a,&n);
queue<int>q;
mst(b,-1);
q.push(n);
//printf("len=%d\\n",len);
b[n] = 0;
while(!q.empty())
int x =q.front();q.pop();
//printf("x=%d,y=%d\\n",x,y);
if(x<2)
break;
if(x%a==0 && b[x/a]==-1) q.push(x/a),b[x/a]=b[x]+1;
if(x>=10)
string s =to_string(x);
int y = stoi(s.substr(1)+s[0]);
if(s[1] !='0' && b[y]==-1) b[y] = b[x] + 1,q.push(y);
printf("%d\\n",b[1]);
return 0;
E - MST + 1
考虑MST的kruskal。
对原边和所有询问边排序。
然后对于询问边只查询,不更新dsu。
对于非询问便更新dsu 不查询。
这样复杂度就是对的。
O ( m l o g m ) O(mlogm) O(mlogm)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=600005;
struct edge
int u,v,w,id;
bool operator<(const edge &rhs)const
return w<rhs.w;
e[N];
int n,m,q,fa[N],ans[N];
int find(int x)return x==fa[x]?x:fa[x]=find(fa[x]);
int main()
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;++i)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
for(int i=1;i<=q;++i)e[i+m].id=i,
scanf("%d%d%d",&e[i+m].u,&e[i+m].v,&e[i+m].w);
sort(e+1,e+m+q+1);for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m+q;++i)
int u=find(e[i].u),v=find(e[i].v);if(u==v)continue;
if(e[i].id)ans[e[i].id]=1;continue;fa[u]=v;
for(int i=1;i<=q;++i)printf(ans[i]?"Yes\\n":"No\\n");
return 0;
以上是关于ABC 235 的 DE的主要内容,如果未能解决你的问题,请参考以下文章