首页 > 其他分享 >Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful

Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful

时间:2023-10-18 21:48:24浏览次数:36  
标签:Beautiful 150 Educational last int geq std 数组 断点

数组 \(a = [a_1, a_2, \cdots, a_n]\) 被称为是美丽的,如果可以将 \([1, x]\) 段移到 \([x + 1, n]\) 段后面,\(x \geq 0\) ,数组可以构成非降序。

现在有一个数组 \(a\) (一开始为空)和 \(q\) 个询问,第 \(i\) 个询问给一个正整数 \(x_i\) 。需要逐步执行以下操作。

  • 若 \(x_i\) 拼接到 \(a\) 末尾,可以使得 \(a\) 为美丽的,则拼接。并输出 \(1\) 。
  • 否则输出 \(0\) 。

显然是个涉及到细节的分类讨论题,两种思路。

思路一。不难观察到 \(a\) 要么是一段非降序。要么是两端非降序,假设断点在 \(x(a_x < a_{x - 1})\) 。需要满足 \(\forall i \in [2, x - 1], a_i \geq a_{i - 1}\) , \(\forall i \in [x + 1, n], a_i \geq a_{i - 1}, max_{i = x}^{n} a_i \leq a_1\) 。

于是有如下的模拟算法:

设输入数组 \(b\) ,指针 \(i\) 从 \(1\) 到 \(n\) ,维护 \(a\) 的末尾值 \(last\) ,且显然 \(b_1 = a_1\) 。

  • 断点未出现:
    若 \(i = 1\) 或者 \(b_i \geq last\) ,则 \(last = b_i\) ,输出 \(1\) 。否则,定义断点出现,若 \(b_i \leq b_1\) ,\(last = b_i\) 。输出 \(0\) 。
  • 断点出现:
    若 \(b_i \geq last\) 并且 \(b_i \leq b_1\) ,\(last = b_i\) ,输出 \(1\) 。否则,输出 \(0\) 。
view
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve(){
	int n; std::cin >> n;
	std::vector<int> a(n+1);
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	int brk_p = 0, last = 0;
	for (int i = 1; i <= n; i++) {
		if (brk_p == 0) {
			if (i == 1 || a[i] >= last) {
				last = a[i];
				std::cout << 1;
			}
			else if (a[i] <= a[1]) {
				last = a[i];
				std::cout << 1;
				brk_p = i;
			}
			else {
				std::cout << 0;
			}
		}
		else if (brk_p != 0) {
			if (a[i] >= last && a[i] <= a[1]) {
				last = a[i];
				std::cout << 1;
			}
			else {
				std::cout << 0;
			}
		}
	}
	std::cout << '\n';
}
		                
int main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
}

第二种思路。不妨真的维护一个数组 \(a\) 。且可以把他视为一个循环移位的数组,即 \(1, n\) 相邻。

  • 若 \(a\) 满足 \(\forall i \in [2, n], a_i \geq a_{i - 1}\) 。则显然 \(a\) 是美丽的。
  • 若 \(a\) 中存在一个 \(j\) 使 \(a_j > a_{j + 1}\) 。让循环数组 \(a\) 选择在 \(j + 1\) 断开,于是只需 \(a_{1} \geq a_{j + 1}\) 即可。
  • 若 \(a\) 中存在两个或以上 \(j\) 使 \(a_j > a_{j + 1}\) ,无论选择哪个位置断开 \(a\) ,总会存在至少一个 \(a_x > a_{x + 1}\) 的位置。
view
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve(){
	int n; std::cin >> n;
	std::vector<int> a;
	int bad = 0;
	for (int i = 1; i <= n; i++) {
		int x; std::cin >> x;
		if (a.empty()) {
			a.push_back(x);
			std::cout << 1;
		}
		else {
			int nxt_bad = bad + (x < a.back());
			if (nxt_bad == 0 || (nxt_bad == 1 && x <= a[0])) {
				a.push_back(x);
				bad = nxt_bad;
				std::cout << 1;
			}
			else {
				std::cout << 0;
			}
		}
	}
	std::cout << '\n';
}
		                
int main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
}

标签:Beautiful,150,Educational,last,int,geq,std,数组,断点
From: https://www.cnblogs.com/zsxuan/p/17773358.html

相关文章

  • Educational Codeforces Round 154 (Rated for Div. 2) B. Two Binary Strings
    给定两个长度相等的\(01\)字符串\(a\)和\(b\)。每个字符串都是以\(0\)开始以\(1\)结束。在一步操作中,你可以选择任意一个字符串:选择任意两个位置\(l,r\)满足\(s_l=s_r\),然后让\(\foralli\in[l,r],s_i=s_l\)。询问经过若干次操作后能否使得\(a=b......
  • Educational Codeforces Round 91 (Rated for Div. 2) A. Three Indices
    给一个\(n\)个整数的排列\(p_1,p_2,\cdots,p_n\),需要找到三个数\(i,j,k\)满足:\(1\leqi<j<k\leqn\)\(p_i<p_j\),\(p_j<p_k\)否则回答不可能。\(key\):若存在上述\(i,j,k\),则存在\(x\)满足\(p_{x-1}<p_{x},p_{x}>p_{x+1......
  • CF1264D2 Beautiful Bracket Sequence
    第二次听这道题,写个推导过程。考虑对于给定的括号序列如何算答案,考虑最终答案对应回原序列的位置,于是我们要找到一个位置让其左边的左括号与右边的右括号一样多。因为挪指针时两者之一一定变化,并且两边均单调,所以这个分界点是唯一的。考虑枚举分界点算答案。假设左边有\(x\)个......
  • ABC324F Beautiful Path
    给出一张DAG,每条边有两种边权\(b\)与\(c\),求一条从\(1\)到\(n\)的路径,问路径经过的边的\(\dfrac{\sumb}{\sumc}\)的最大值是多少。\(n,m\le2\times10^5\)。这不是经典01分数规划吗?将题目中的要求写成如下形式:\[\begin{aligned}&\text{Maximize}\dfrac......
  • Atcoder Beginner Contest 324 F Beautiful Path 题解-分数规划
    为了更好的阅读体验,请点击这里分数规划小技巧:尽可能将式子写成存在某种取值,使得不等式成立的形式。不然可能需要绕几个弯才能想出来。题目链接题目大意:给出一个DAG,每条边有一个\(b_i,c_i\),保证从编号小的边向编号大的边连边,且\(1\)到\(n\)必有路径,求\(1\)到\(n\)......
  • Educational Codeforces Round 116 (Rated for Div. 2) A. AB Balance
    给一个长为\(n\)的字符串\(s\),只包含\(0\)\(1\)两种字符。定义\(AB(s)\)是\(s\)中出现的\(01\)子串个数,\(BA(s)\)是\(s\)中出现的\(10\)子串个数。在一步操作中,可以选择一个字符进行异或。询问最小的操作次数使得\(AB(s)=BA(s)\)。显然连续的\(11\)或连......
  • Educational Codeforces Round 96 (Rated for Div. 2) A. Number of Apartments
    有三种建筑:三室厅、五室厅、七室厅。每个房间严格有一扇窗户。现在有\(n\)扇窗户,询问完全用完这些窗户的情况下,\(3,5,7\)室厅各有多少间。输出任意一种答案,或者回答不可能。假设一定有解,显然可以选择\(mod\)任意一个数贪心,不妨选最小的\(3\)。假设答案为\(a,b,c\):......
  • C#与S7-1500通信和控制(1)
    西门子安装:解决重启问题:删除HEEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\SESSIONMANAGE\下的PendingFileRemameOpeaations键首先安装博途TIAPortalV15,01-STEP7+WinccProfesionalV15(PLC编程软件+WINCC触摸屏和上位机组态软件),安装完重启安装Simulation,在02-P......
  • Educational Codeforces Round 156 (Rated for Div. 2) A-E
    A题签到题分余1余2余0讨论 #include<bits/stdc++.h>usingnamespacestd;#definemaxn400100#defineintlonglongintread(){intans=0,f=1;charch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}......
  • python beautifulsoup
    beautifulsoup1.安装pipinstallbeautifulsoup4如果这个安装不了,就手动下载安装:下载地址:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.5/解压后执行pythonsetup.pyinstall拷贝python安装目录下的C:\ProgramFiles\python\Tools\scripts\2to3.py文......