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的主要内容,如果未能解决你的问题,请参考以下文章

ABC235 F Variety of Digits

ABC235 F Variety of Digits

ABC 297 DE

大小不同的两个等腰直角△ABC和△BDE如图放置,其中ACE在同一直线上,求证:AC⊥DE

刘汝佳,竖式问题

竖式问题