Loading

AtCoder Beginner Contest 299 (Tokio Marine & Nichido Fire Insurance Programming Contest 2023)



A - Treasure Chest

题意

思路

模拟

代码

点击查看代码
#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 = 2e3 + 10;

void solve()
{
	int n;
	cin >> n;
	string s;
	cin >> s;
	int a = -1, b, c;
	for (int i = 0; i < (int)s.size(); i++)
	{
		if (s[i] == '|')
		{
			if (a == -1)
			{
				a = i;
			}
			else
			{
				c = i;
			}
		}
		else if (s[i] == '*')
		{
			b = i;
		}
	}
	if (a < b && b < c)
	{
		cout << "in" << endl;
	}
	else
	{
		cout << "out" << endl;
	}
}

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

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

B - Trick Taking

题意

思路

模拟

代码

点击查看代码
#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 = 2e3 + 10;

void solve()
{
	int n, t;
	cin >> n >> t;
	vector<int> c(n), r(n);
	unordered_set<int> s;
	for (int i = 0; i < n; i++)
	{
		cin >> c[i];
		s.insert(c[i]);
	}
	for (int i = 0; i < n; i++)
	{
		cin >> r[i];
	}
	int ans = 1, maxn = -1;
	if (!s.count(t))
	{
		t = c[0];
	}
	for (int i = 0; i < n; i++)
	{
		if (c[i] == t && maxn < r[i])
		{
			maxn = r[i];
			ans = i + 1;
		}
	}
	cout << ans << endl;
}

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

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

C - Dango

题意

思路

模拟

代码

点击查看代码
#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 = 2e3 + 10;

void solve()
{
	int n;
	cin >> n;
	string s;
	cin >> s;
	if (s.find("-") == s.npos || s.find("o") == s.npos)
	{
		cout << -1 << endl;
		return;
	}
	int i = 0, j = 0, maxn = 0;
	while (i < n && j < n)
	{
		if (s[i] == '-')
		{
			i++;
			continue;
		}
		j = i;
		while (s[j] == 'o')
		{
			j++;
		}
		maxn = max(maxn, j - i);
		i = j;
	}
	cout << maxn << endl;
}

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

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

D - Find by Query

题意

思路

由于两端已知(左\(0\)\(1\)),那只需要“二分”(\(1\)向左\(0\)向右),根据回答向一端逼近,题目保证有解,最后一定会到\(l\)\(r\)相邻的情况
戳我看\(endl\)本质

代码

点击查看代码
#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;

void solve()
{
	int n;
	cin >> n;
	int l = 1, r = n;
	for (int q = 0; q < 20; q++)
	{
		if (l + 1 == r)
		{
			cout << "! " << l << endl;
			return;
		}
		int mid = l + r >> 1;
		cout << "? " << mid << endl;
		int c;
		cin >> c;
		if (c == 1)
		{
			r = mid;
		}
		else
		{
			l = mid;
		}
	}
}

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

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

E - Nearest Black Vertex

题意

思路

对于第\(i\)个限制条件中的点 \(p_i\),与它距离小于 \(d_i\) 的点必须是白色;距离等于 \(d_i\) 的点中至少要有一个是黑色。没被涉及的点尽量初始化成黑色

代码

点击查看代码
#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;

void solve()
{
	int n, m;
	cin >> n >> m;
	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);
	}
	vector<vector<int>> dis(n, vector<int>(m + 1, 1e18));
	for (int i = 0; i < n; i++)
	{
		dis[i][i] = 0;
		priority_queue<pii, vector<pii>, greater<pii>> q;
		vector<bool> vis(n, false);
		q.push(make_pair(dis[i][i], i));
		while (q.size())
		{
			auto [w, u] = q.top();
			q.pop();
			if (vis[u]) continue;
			vis[u] = true;
			for (auto& v : g[u])
			{
				if (dis[i][v] > dis[i][u] + 1)
				{
					dis[i][v] = dis[i][u] + 1;
					q.push(make_pair(dis[i][v], v));
				}
			}
		}
	}
	int k;
	cin >> k;
	vector<int> col(n, 1), p(k), d(k);
	for (int i = 0; i < k; i++)
	{
		cin >> p[i] >> d[i];
		p[i]--;
		for (int j = 0; j < n; j++)
		{
			// 距离小于d[i]的只能是白色
			if (dis[p[i]][j] < d[i])
			{
				col[j] = 0;
			}
		}
	}
	for (int i = 0; i < k; i++)
	{
		int u = p[i];
		bool f = false;
		for (int v = 0; v < n; v++)
		{
			// 距离恰为d[i]至少有一个黑色
			if (dis[u][v] == d[i] && col[v] == 1)
			{
				f = true;
			}
		}
		if (!f)
		{
			cout << "No" << endl;
			return;
		}
	}
	cout << "Yes" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << col[i];
	}
}

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

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


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

posted @ 2025-04-08 14:56  _SeiI  阅读(35)  评论(0)    收藏  举报