AtCoder Beginner Contest 451(ABC451)

A - illegal

判一下字符串长度是否为\(5\)的倍数即可。

点击查看代码
//草扎的精神,从此万寿无疆。
#include<bits/stdc++.h>

using namespace std;

signed main(){
	
	string s;
	cin >> s;
	int n = s.length();
	
	if(n%5) cout << "No";
	else cout << "Yes";
	
	return 0;
	
}

B - Personnel Change

算一下一开始每个部门有多少人,更换后每个部门有多少人,有后者减前者就是答案。

点击查看代码
//草扎的精神,从此万寿无疆。
#include<bits/stdc++.h>

using namespace std;

int n,m;
int gs[105];
int fs[105];

signed main(){
	
	cin >> n >> m;
	for(int i = 1;i <= n;++ i){
		int a,b;
		cin >> a >> b;
		gs[a]++;fs[b]++;
	}
	
	for(int i = 1;i <= m;++ i)
		cout << fs[i]-gs[i] << '\n';
	
	return 0;
	
}

C - Understory

用一个小根堆来存储,每次加入的时候就把这个高度加入,每次删除的时候就不断取出堆顶知道堆顶元素大于\(h\)

点击查看代码
//草扎的精神,从此万寿无疆。
#include<bits/stdc++.h>

using namespace std;

int n;
priority_queue<int,vector<int>,greater<int> > q;

signed main(){
	
	cin >> n;
	while(n--){
		int op,h;
		cin >> op >> h;
		if(op == 1) q.push(h);
		else{
			while(!q.empty()&&q.top() <= h)
				q.pop();
		}
		cout << q.size() << '\n';
	}
	
	return 0;
	
}

D - Concat Power of 2

观察样例3可得,\(10^9\)以内的好整数大概在\(10^6\)个左右。
首先把\(10^9\)以内的所有\(2\)的幂都找出来存下来,然后考虑从\(0\)开始\(dfs\),每次如果这个数小于\(10^9\),那么就往这个数后面加上一个\(2\)的幂,继续\(dfs\),直到这个数大于了\(10^9\),就回溯。
\(dfs\)的过程中把\(dfs\)到的所有数加入一个\(vector\),最后排一下序,取出这个\(vector\)的第\(n\)小即可。要注意不要把\(0\)加进去,也不要重复加。
有的人可能觉得没有重复加的问题,但看一下\(164\)可以发现,它既可以是\(1,64\),也可以是\(16,4\)

点击查看代码
//草扎的精神,从此万寿无疆。
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n;
int bas[35],bcnt;
vector<int> s;
map<int,int> mp;

int lianjie(int x,int y){
	int t = y;
	while(t){
		x *= 10;
		t /= 10;
	}
	return x+y;
}

void dfs(int x){
	if(x <= 1e9){
		if(x != 0){
			if(!mp[x]) s.push_back(x);
			mp[x] = 1;
		}
	}
	else return;
	for(int i = 1;i <= bcnt;++ i)
		dfs(lianjie(x,bas[i]));
}

signed main(){
	
	cin >> n;
	
	bas[1] = 1;
	for(bcnt = 2;;++ bcnt){
		bas[bcnt] = bas[bcnt-1]*2;
		if(bas[bcnt] > 1e9){
			bcnt--;
			break;
		}
	}
	
	dfs(0);
	sort(s.begin(),s.end());
	cout << s[n-1];
	
	return 0;
	
}

E - Tree Distance

点击查看代码
//草扎的精神,从此万寿无疆。
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n;
struct edge{
	int u,v,w;
}e[4500005];
int ecnt;
int a[3005][3005];

bool cmp(edge a,edge b){
	return a.w < b.w;
}

int fa[3005];

int find(int x){
	if(x == fa[x]) return x;
	return fa[x] = find(fa[x]);
}

vector<pair<int,int> > ed[3005];

int dis[3005];
int st[3005][15];
int dep[3005];

void dfs(int x,int fa){
	dep[x] = dep[fa]+1;
	st[x][0] = fa;
	for(int i = 1;i <= 13;++ i)
		st[x][i] = st[st[x][i-1]][i-1];
	for(auto [y,w]:ed[x]){
		if(y == fa) continue;
		dis[y] = dis[x]+w;
		dfs(y,x);
	}
}

int lca(int x,int y){
	if(dep[x] < dep[y]) swap(x,y);
	for(int i = 13;i >= 0;-- i)
		if(dep[st[x][i]] >= dep[y])
			x = st[x][i];
	if(x == y) return x;
	for(int i = 13;i >= 0;-- i)
		if(st[x][i] != st[y][i])
			x = st[x][i],y = st[y][i];
	return st[x][0];
}

signed main(){
	
	cin >> n;
	
	for(int i = 1;i < n;++ i){
		fa[i] = i;
		for(int j = i+1;j <= n;++ j){
			cin >> a[i][j];
			e[++ecnt] = {i,j,a[i][j]};
		}
	}
	fa[n] = n;
	
	sort(e+1,e+1+ecnt,cmp);
	
	for(int i = 1;i <= ecnt;++ i){
		int u = e[i].u;
		int v = e[i].v;
		int w = e[i].w;
		if(find(u) == find(v)) continue;
		fa[find(u)] = find(v);
		ed[u].push_back({v,w});
		ed[v].push_back({u,w});
	}
	
	dfs(1,0);
	
	for(int i = 1;i < n;++ i){
		for(int j = i+1;j <= n;++ j){
			if(a[i][j] != dis[i]+dis[j]-2*dis[lca(i,j)]){
				cout << "No";
				return 0;
			}
		}
	}
	
	cout << "Yes";
	
	return 0;
	
}
posted @ 2026-03-29 09:39  u_uICLMFu_uX  阅读(17)  评论(0)    收藏  举报