首页 > 其他分享 >Codeforces Round 990 (Div. 2) 题解 (A ~ E)

Codeforces Round 990 (Div. 2) 题解 (A ~ E)

时间:2024-12-04 14:47:43浏览次数:4  
标签:std cin int 题解 Codeforces long back ++ Div

A. Alyona and a Square Jigsaw Puzzle

模拟即可

#include <bits/stdc++.h>

using i64 = long long;

void solve()
{
	int n; std::cin >> n;

	int cur = 0;
	int ans = 0;
	for(int i = 0, j = 1; i < n; i++)
	{
		int x; std::cin >> x;
		cur += x;
		while(cur > j * j) j += 2;
		
		if(cur == j * j) ans++;
	}

	std::cout << ans << "\n";
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t; std::cin >> t;
	while(t--) solve();

	return 0;
}

B. Replace Character

把出现次数最少的字母变成最多的即可

#include <bits/stdc++.h>

using i64 = long long;

void solve()
{
	int n; std::cin >> n;
	std::string s; std::cin >> s;
	std::vector<int> cnt(26);
	for(auto c : s) cnt[c - 'a']++;

	auto t = s;
	std::ranges::sort(s);
	std::ranges::sort(s, [&](char x, char y) { return cnt[x - 'a'] > cnt[y - 'a']; });
	
	for(auto &c : t) 
	{
		if(c == s.back())
		{
			c = s[0];
			break;
		}
	}
	s = t;

	std::cout << s << "\n";
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t; std::cin >> t;
	while(t--) solve();

	return 0;
}

C. Swap Columns and Find a Path

第一行大就选第一行,第二行大就选第二行,再从剩下的格子里面选一个最大的用来转弯

#include <bits/stdc++.h>

using i64 = long long;

constexpr int INF = 1e9;

void solve()
{
	int n; std::cin >> n;
	std::vector a(2, std::vector<i64>(n));
	for(int i = 0; i < n; i++) std::cin >> a[0][i];
	for(int i = 0; i < n; i++) std::cin >> a[1][i];

	i64 ans = 0, max = -INF;
	for(int i = 0; i < n; i++)
	{
		if(a[0][i] > a[1][i]) ans += a[0][i];
		else ans += a[1][i];
		max = std::max(max, std::min(a[0][i], a[1][i]));
	}
	ans += max;

	std::cout << ans << "\n";
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t; std::cin >> t;
	while(t--) solve();

	return 0;
}

D. Move Back at a Cost

注意到每个数最多只会被加一次,因为如果存在一个数需要加两次,只可能是一个比它小的数在它之后加一,所以我们只需要让那个数先加一即可。由于要字典序最小,所以我们尽可能不要加数,我们可以维护一个栈和一个优先队列,维持栈内单调,弹出来的数都加一放进队列,然后再从队列放回栈里面,直到队列为空。

#include <bits/stdc++.h>

using i64 = long long;

void solve()
{
	int n; std::cin >> n;
	std::vector<int> a(n);
	for(int i = 0; i < n; i++) std::cin >> a[i];

	std::vector<int> x;
	std::priority_queue<int, std::vector<int>, std::greater<>> y;
	for(auto i : a)
	{
		if(x.empty() || i >= x.back()) x.emplace_back(i);
		else
		{
			while(!x.empty() && i < x.back())
			{
				y.emplace(x.back() + 1);
				x.pop_back();
			}
			x.emplace_back(i);
		}
	}

	while(!y.empty())
	{
		int t = y.top(); y.pop();
		while(!x.empty() && t < x.back())
		{
			y.emplace(x.back() + 1);
			x.pop_back();
		}
		x.emplace_back(t);
	}

	for(int i = 0; i < n; i++) std::cout << x[i] << " \n"[i == n - 1];
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t; std::cin >> t;
	while(t--) solve();

	return 0;
}

E. Adventurers

两个log的做法

答案显然可以二分,考虑如何 \(check\)。首先我们可以把这些点按 \(x\) 坐标排序,然后从左往右扫,扫的过程中这些点会被分成两个部分,我们在这两个部分从下往上取第 \(mid\) 大的点,以 \(y\) 最大的那个点再横着分出上下两部分,这样就把区域分成了四个部分,最后再检查一下是不是四个部分都有 \(mid\) 个点即可。具体实现用了 \(pbds\) 的平衡树。

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using i64 = long long;

constexpr int INF = 1e9;

void solve()
{
	int n; std::cin >> n;
	std::vector<int> x(n), y(n);
	for(int i = 0; i < n; i++) std::cin >> x[i] >> y[i];

	std::vector<int> p(n);
	std::iota(p.begin(), p.end(), 0);
	std::ranges::sort(p, [&](int i, int j) 
	{ 
		return x[i] < x[j] || (x[i] == x[j] && y[i] < y[j]); 
	});

	std::array<int, 3> ans{};
	auto check = [&](int m) -> bool
	{
		__gnu_pbds::tree<std::array<int, 3>, __gnu_pbds::null_type, std::less<std::array<int, 3>>,
						__gnu_pbds::rb_tree_tag,
						__gnu_pbds::tree_order_statistics_node_update> a, b;

		for(auto i : p) b.insert({y[i], x[i], i});

		for(int j = 0; j < p.size(); j++)
		{
			int i = p[j];
			b.erase({y[i], x[i], i});
			a.insert({y[i], x[i], i});
			if(j + 1 < p.size() && x[p[j + 1]] == x[p[j]]) continue;
			if(a.size() >= 2 * m && b.size() >= 2 * m)
			{
				auto tmp1 = *a.find_by_order(m - 1), tmp2 = *b.find_by_order(m - 1);
				auto res = tmp1;
				if(res[0] < tmp2[0]) res = tmp2;
				res[0]++, res[1] = -INF;

				int rk1 = a.order_of_key(res), rk2 = b.order_of_key(res);

				if((int)a.size() - rk1 >= m && (int)b.size() - rk2 >= m)
				{
					ans = res;
					ans[1] = x[i] + 1;
					return true;
				}
			}
		}

		return false;
	};

	int lo = 0, hi = n / 4;
	while(lo < hi)
	{
		int m = (lo + hi + 1) >> 1;
		if(check(m)) lo = m;
		else hi = m - 1;
	}

	std::cout << lo << "\n" << ans[1] << " " << ans[0] << "\n";
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int t; std::cin >> t;
	while(t--) solve();

	return 0;
}

标签:std,cin,int,题解,Codeforces,long,back,++,Div
From: https://www.cnblogs.com/Repeater11/p/18586271

相关文章

  • 隐藏div内文字的方法有哪些?
    隐藏div内文字的方法有很多,以下是几种常见的方法,并附带一些示例和适用场景:1.display:none;效果:元素完全从文档流中移除,不占据空间,就像它不存在一样。后续的元素会填补它留下的空白。适用场景:当你想完全隐藏内容,并且不希望它影响页面布局时。示例:.hidden-div{di......
  • 【题解】CF2047
    A显然每次完整地放完都是一个正方形,正方形的边长每次+2,初始值为1所以只需要check每天的块数是否是奇数的平方,然后再做前缀和即可B显然字母出现顺序不重要而出现次数重要,直接放桶并不考虑出现次数为0的数考虑多重集意义下的排列,设序列总长度为\(n\),第\(i\)钟数出......
  • Educational Codeforces Round 172 (Rated for Div. 2)(A~D)
    比赛链接:https://codeforces.com/contest/2042这场爆了,卡死在C题了,QWQ.卡题得跳题啊!!!A.GreedyMonocarp题面:有\(n\)个箱子,第\(i\)个箱子最初包含\(a_i\)枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:所有箱子中的硬币总数必须变......
  • 题解:P11362 [NOIP2024] 遗失的赋值
    这里写一个我在考场上差点想出来的、比较另类的做法。若\(\existsc_i=c_j(i\nej),d_i\ned_j\),则答案显然为\(0\)。否则,我们可以将序列\(x\)中的数分为已确定和未确定两类。设\(f_0(i)\)为当\(x_i\)未确定时前\(i-1\)个二元限制的方案数,\(f_1(i)\)为当\(x_i\)确......
  • Educational Codeforces Round 172 (Rated for Div. 2) A ~ D
    EducationalCodeforcesRound172(RatedforDiv.2)广告:starrycoding九折优惠码(FV7B04LL)A思路需要拿至少\(k\)枚硬币.从大到小拿.拿到的硬币最少.题目没有要求补硬币的数目,要求回答的是拿最少硬币时至少补多少.而拿取的最小值最少为\(k\).求从大到小拿取到......
  • 牛客周赛 Round 70 个人题解
    牛客周赛Round70个人题解(A~G)牛客周赛Round70A.小苯晨跑#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voidsolve(){ inta,b,c,d;cin>>a>>b>>c>>d; if(a==b&&b==c&&c==d){ cout<<&qu......
  • Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations
    算法听别人说这题比较简单,我来看看怎么个事转化题意,对于\(n\)条线段\([l_i,r_i]\),求每条线段被哪些线段完全覆盖,并求这些线段的交集减去其的长度显然的,\(j\)线段覆盖\(i\)线段,应该满足\(l_j\leql_i,r_i\leqr_j\)那么我们考虑将每一条线段当做一个点......
  • 题解:AT_arc139_d [ARC139D] Priority Queue 2
    题面发现我们不好算到最后还剩些什么。考虑计算\(\sum\limits_{i=1}^m\sum\limits_{j=1}^n[s_j\gei]\),容易发现这和原式等价。记\(b_i\)表示\(s\)中不小于\(i\)的数的个数,每次删去第\(x\)小的等价于将所有超过\(n-x+1\)的地方减1,加入\(k\)等价于将\(b_{1,k}\)......
  • 常见问题解决 --- nginx反向代理接口返回404
    可能原因反向代理地址写错了,还有一种可能是没有配置host请求头,导致不能正确找到服务器解决办法:修改nginx反向代理,配置虚拟主机名称,配置举例server{listen8082;server_name172.16.68.3;root/usr/local/nginx/html/;location......
  • P3750 [六省联考 2017] 分手是祝愿 题解
    P3750[六省联考2017]分手是祝愿题面ZeitundRaumtrennendichundmich.时空将你我分开。B君在玩一个游戏,这个游戏由\(n\)个灯和\(n\)个开关组成,给定这\(n\)个灯的初始状态,下标为从\(1\)到\(n\)的正整数。每个灯有两个状态亮和灭,我们用\(1\)来表示这个灯......