Loading

AtCoder Beginner Contest 401



A - Status Code

题意

思路

模拟

代码

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e3 + 10;

void solve()
{
	int s;
	cin >> s;
	if (s >= 200 && s <= 299)
	{
		cout << "Success" << endl;
		return;
	}
	cout << "Failure" << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--)
	{
		solve();
	}
	return 0;
}

B - Unauthorized

题意

思路

模拟

代码

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e3 + 10;

void solve()
{
	int n, cnt = 0;
	bool f = false;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		if (s == "login")
		{
			f = true;
		}
		else if (s == "logout")
		{
			f = false;
		}
		else if (s == "public")
		{

		}
		else
		{
			if (!f)
			{
				cnt++;
			}
		}
	}
	cout << cnt << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--)
	{
		solve();
	}
	return 0;
}

C - K-bonacci

题意

思路

模拟

代码

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e3 + 10;
const int mod = 1e9;

void solve()
{
	int n, k;
	cin >> n >> k;
	if (k >= n + 1)
	{
		cout << 1 << endl;
		return;
	}
	vector<int> a(n + 1, 0);
	for (int i = 0; i < k; i++)
	{
		a[i] = 1;
	}
	int sum = k;
	for (int i = k; i < n + 1; i++)
	{
		a[i] = sum;
		sum += a[i] - a[i - k];
		sum += mod;
		sum %= mod;
	}
	cout << a[n] << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--)
	{
		solve();
	}
	return 0;
}

D - Logical Filling

题意

思路

对于所有的"\(o\)",其两边一定是".",把这个先填上,然后对于每段连续的"\(?\)",此时两段一定是".",若区间长度为奇数,填法就固定了(如\(.o.o.o.\));若为偶数则有两种填法(\(.o.o..\)\(..o.o.\))。统计出最多能有多少\(o\),记为 \(cnt\),若 \(cnt=k\),则奇数区间确定,偶数区间不确定;若 \(cnt>k\),则都不能确定;不存在 \(cnt<k\)的情况。

代码

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 1e6 + 10;

void solve()
{
	int n, m;
	bool f = false;
	string s, t;
	cin >> n >> m >> s;
	if (count(s.begin(), s.end(), 'o') == m)
	{
		for (int i = 0; i < n; i++)
		{
			cout << (s[i] == '?' ? '.' : s[i]);
		}
		cout << endl;
		return;
	}
	for (int i = 0; i < n; i++)
	{
		if (s[i] == 'o')
		{
			if (i)
			{
				s[i - 1] = '.';
			}
			if (i != n - 1)
			{
				s[i + 1] = '.';
			}
		}
	}
	int cnt = 0;
	for (int i = 0; i < n; i++)
	{
		if (s[i] == '?')
		{
			int j = i;
			while (s[++j] == '?');
			cnt += j - i + 1 >> 1;
			i = j - 1;
		}
	}
	if (cnt > m)
	{
		cout << s << endl;
		return;
	}
	for (int i = 0; i < n; i++)
	{
		if (s[i] == '?')
		{
			int j = i;
			while (s[++j] == '?');
			if (j - i & 1)
			{
				for (int k = i; k < j; k++)
				{
					if ((!k || s[k - 1] == '.') && (k != n - 1 && s[k + 1] != 'o'))
					{
						s[k] = 'o';
					}
					else
					{
						s[k] = '.';
					}
				}
			}
			i = j - 1;
		}
	}
	cout << s << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--)
	{
		solve();
	}
	return 0;
}

E - Reachable Set

题意

思路

用并查集维护当前的连通分量,对于\(k\),大于\(k\)的点需要删除,为防止重复用\(set\)储存;小于等于\(k\)的点需要保留,但是最后需要判断\([1,k]\)是否只有一个连通分量

代码

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;

const int mxn = 2e5 + 10;

vector<int> pre;
int find(int x)
{
	return x == pre[x] ? x : pre[x] = find(pre[x]);
}

bool join(int a, int b)
{
	int fa = find(a), fb = find(b);
	if (fa == fb) return false;
	pre[fb] = fa;
	return true;
}

void solve()
{
	int n, m;
	cin >> n >> m;
	pre.resize(n);
	iota(pre.begin(), pre.end(), 0);
	vector<vector<int>> g(n);
	for (int i = 0; i < m; i++)
	{
		int u, v;
		cin >> u >> v;
		u--, v--;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	set<int> del;
	int cnt = 0; // [1,k]连通分量的数量
	for (int k = 0; k < n; k++)
	{
		cnt++;
		for (auto& j : g[k])
		{
			if (j > k) del.insert(j);
			else cnt -= join(j, k); // 如果以前没相连那连通分量数量就-1
		}
		while (del.size() && *del.begin() <= k)
		{
			del.erase(del.begin());
		}
		cout << (cnt == 1 ? (int)del.size() : -1) << endl;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int __ = 1;
	//cin >> __;
	while (__--)
	{
		solve();
	}

	return 0;
}


比赛链接 https://atcoder.jp/contests/abc401

posted @ 2025-04-16 20:36  _SeiI  阅读(52)  评论(0)    收藏  举报