AtCoder Beginner Contest 388



A - A - ?UPC#

题意#

给定字符串s,输出s首个字符与UPC组成的字符串

思路#

模拟

代码#

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

const int mxn = 1e6 + 5;

void solve()
{
	string s;
	cin >> s;
	cout << s[0] << "UPC" << endl;
}

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

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

	return 0;
}


B - Heavy Snake#

题意#

n条蛇,最初第i条蛇的长度为Li、厚度为Ti。定义第i条蛇的重量为Ti×Li。对于满足1kD的每个整数k,求每条蛇的长度增加k时最重的蛇的重量

思路#

自定义排序

代码#

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

const int mxn = 1e6 + 5;

bool cmp(pii& a, pii& b)
{
	return a.first * a.second > b.first * b.second;
}

void solve()
{
	int n, k;
	cin >> n >> k;
	vector<pii> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i].first >> v[i].second;
	}
	for (int i = 1; i <= k; i++)
	{
		for (int j = 0; j < n; j++)
		{
			v[j].second++;
		}
		sort(v.begin(), v.end(), cmp);
		cout << v[0].first * v[0].second << endl;
	}
}

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

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

	return 0;
}


C - Various Kagamimochi#

题意#

n个年糕,第i个年糕大小为ai,按升序输入。对于两个年糕i,j,当且仅当aiaj时可以将i叠在j上组成一个年糕。问两两叠加一共能组成多少不同的年糕

思路#

由于是升序输入,对于每个年糕,只需要二分找第一个不小于自己大小两倍的年糕的位置累加即可。

代码#

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

const int mxn = 1e6 + 5;

void solve()
{
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	int ans = 0;
	for (int i = 0; i < n; i++)
	{
		auto p = lower_bound(v.begin(), v.end(), 2 * v[i]);
		if (p != v.end())
		{
			ans += n - (p - v.begin());
		}
	}
	cout << ans << endl;
}

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

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

	return 0;
}

D - Coming of Age Celebration#

题意#

n个未成年人,第i个人有ai个宝石,并在第i年成年。当有人成年时,有宝石的成年人会每人会给刚成年的人1个宝石。求n年后每人各有多少宝石。

思路#

"在第i年成年"就只用按编号往后推,第i成年时前i1个人都要给他石头(如果有的话);第i个人要给后ni每人一个石头

代码#

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lc p << 1
#define rc p << 1 | 1

const int mxn = 5e5 + 5;

int n;
int t[mxn];

struct tree
{
	int l, r, sum, lazy;
}tr[4 * mxn];

int a[mxn];

inline void pushup(int p)
{
	tr[p].sum = tr[lc].sum + tr[rc].sum;
}

void pushdown(int p)
{
	tr[lc].sum += tr[p].lazy * (tr[lc].r - tr[lc].l + 1);
	tr[lc].lazy += tr[p].lazy;
	tr[rc].sum += tr[p].lazy * (tr[rc].r - tr[rc].l + 1);
	tr[rc].lazy += tr[p].lazy;
	tr[p].lazy = 0;
}

void build(int p, int l, int r)
{
	tr[p].l = l;
	tr[p].r = r;
	tr[p].lazy = 0;
	if (l == r)
	{
		tr[p].sum = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(p);
}

void update(int p, int l, int r, int k)
{
	if (tr[p].l >= l && tr[p].r <= r) // 查询区间覆盖当前区间
	{
		tr[p].sum += (tr[p].r - tr[p].l + 1) * k;
		tr[p].lazy += k;
		return;
	}
	int mid = tr[p].l + tr[p].r >> 1;
	pushdown(p);
	if (l <= mid)
	{
		update(lc, l, r, k);
	}
	if (r > mid)
	{
		update(rc, l, r, k);
	}
	pushup(p);
}

int query(int p, int l, int r)
{
	if (tr[p].l >= l && tr[p].r <= r) // 查询区间覆盖当前区间
	{
		return tr[p].sum;
	}
	int mid = tr[p].l + tr[p].r >> 1;
	pushdown(p);
	int res = 0;
	// 有交集
	if (l <= mid)
	{
		res += query(lc, l, r);
	}
	if (r > mid)
	{
		res += query(rc, l, r);
	}
	return res;
}

void solve()
{
	cin >> n;
	vector<int> v(n + 1);
	for (int i = 1; i <= n; i++)
	{
		cin >> v[i];
	}
	build(1, 1, n);
	for (int i = 1; i <= n; i++)
	{
		int t = query(1, i, i); // 自己收到的
		// 给后面的发,直到没有
		update(1, i + 1, min(i + v[i] + t, n), 1);
		v[i] = max(0LL, v[i] + t - n + i);
	}
	for (int i = 1; i <= n; i++)
	{
		cout << v[i] << " ";
	}
}

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

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

	return 0;
}

E - Simultaneous Kagamimochi#

题意#

C,最后求最多同时能制作多少年糕

思路#

C一样二分选尽量小的根自己组合WA了很多点,应该不能这么做。
考虑二分答案,最少0个,最多n/2个,选择最前与最后的区间配对(小对小,大对大)。

代码#

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

const int mxn = 5e5 + 5;

int n;
int a[mxn];

bool check(int x)
{
	for (int i = 0; i < x; i++)
	{
		if (a[i] * 2 > a[n - x + i])
		{
			return false;
		}
	}
	return true;
}

void solve()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	int l = 0, r = n / 2, ans = 0;
	while (l <= r)
	{
		int mid = l + r >> 1;
		if (check(mid))
		{
			l = mid + 1;
			ans = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	cout << ans << endl;
}

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

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

	return 0;
}



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

posted @   _SeiI  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示