首页 > 其他分享 >Educational Codeforces Round 152 (Div. 2) D. Array Painting(双指针)

Educational Codeforces Round 152 (Div. 2) D. Array Painting(双指针)

时间:2023-10-10 10:46:40浏览次数:55  
标签:Educational 152 int Codeforces long Div

Educational Codeforces Round 152 (Div. 2) D. Array Painting

//思路:双指针找连续正数段
//若段中出现2,则更新两头的0的情况,若为涂色则改为true
//若无2,则优先更新左侧0,若左0已经为true,则更新右侧0
//数组开头结尾特判
#define int long long
#define ld long double

using namespace std;

bool st[200010];
int a[200010];

void op()
{
	int n;
	cin >> n;

	int cnt = n;
	for (int i = 1; i <= n; i++)cin >> a[i];

	int k = 0;

	for (int i = 1; i <= n; i++)
	{
		if (a[i] > 0)
		{
			k++;
			if (a[i] == 2)
			{
				if (i - 1 != 0 && !st[i - 1])
				{
					cnt--;
				}
				int fg = 0;
				for (int j = i + 1; j <= n; j++)
				{
					if (a[j] == 0)
					{
						
						st[j] = true;
						cnt -= (j - i + 1);
						
						fg = j;
						break;
					}
				}
				if (fg)i = fg;
				else
				{
					cnt -= (n - i + 1);
					i = n;
				}
			}
			else if (a[i] == 1)
			{
				if (i-1!=0&&!st[i - 1])cnt--;
				int fg = 0;
				bool fg2 = false;
				for (int j = i + 1; j <= n; j++)
				{
					if (!fg2 && a[j] == 2)fg2 = true;
					if (a[j] == 0)
					{
						cnt -= (j - i);
						if (a[j - 1] == 2 || (i - 1 != 0 && st[i - 1]) || i - 1 == 0 || fg2)
						{
							cnt--;
							st[j] = true;
						}
						fg = j;
						break;
					}
				}

				if (fg)i = fg;
				else
				{
					cnt -= (n - i + 1);
					i = n;
				}
			}
		}
	}

	cout << k + cnt << endl;
}

signed main()
{
	op();
	return 0;
}

标签:Educational,152,int,Codeforces,long,Div
From: https://www.cnblogs.com/ikunhuaji/p/17754020.html

相关文章

  • 练习记录-cf-Educational Codeforces Round 156 (Rated for Div. 2)(A-C)
    好久没打了还是就出了三道不过还好没掉分A.SumofThree就是问能不能把一个数拆成三个不同的且都不能被三整除的数我的思路就是拆成1+2+一个大于等于4的数如果拆了后另一个数是%3==0那么我拆成1+4它肯定就不被整除然后判下相同#include<bits/stdc++.h>#defineclose......
  • Codeforces Round 902 (Div. 2) C. Joyboard 规律
    CodeforcesRound902(Div.2)C.Joyboard//思路:在k=1,k=2,k=3时有解//当k=1时为全0//当k=2时,若m>=n,则先是0然后为1~n,最后一位可以为n的倍数也符合,即n+m/n-1//若m<n则为1~m即m//当k=3时,只能在n+1位是第3个不同情况(大于n),且不能为n的倍数,即(m-n)-(m/n-1)//只......
  • Codeforces Round 726 (Div. 2) B. Bad Boy
    给一个\(n\timesm\)的平面,一个初始位置\((i,j)\)。需要放两个废弃物在平面上,位置为\((x_1,y_1),(x_2,y_2)\)。使得从\((i,j)\)出发,捡起两个废弃物后,回到原位置,所经过的曼哈顿距离最长。询问一组合法的\((x_1,y_1),(x_2,y_2)\)。性质:二维平面上有关的曼哈......
  • Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
    Preface难得这么好时间的CF,我直接找来队友组队练题当然比赛的过程没有三人三机,就跟平时训练一样搞了个新号三人一机的写中间因为溜去先看F了导致E题留给徐神solo因此出的偏慢,不过后面一起讨论了一下还是出了最后开F结果好家伙我和祁神双双看错题,对着假题意苦战1h最后无奈投降,......
  • CodeForces 1876D Lexichromatography
    洛谷传送门CF传送门这说明你的能力还不足以维持IM。显然balanced的充要条件是,对于每个值,染色一定是RB交替。然后一种值只会有先染红或先染蓝两种情况。然后还剩下字典序严格小于的条件。我场上的想法是枚举\(\text{LCP}\),然后推出来一个巨大麻烦做法,根本写不出来。但......
  • Codeforces Round 902 (Div. 1, based on COMPFEST 15 - Final Round) A~D
    A.HelmetsinNightLight首先注意到一个关键性质\(b_i\geq1\),这就意味着当我们花\(p\)的代价解锁了\(b_i\)最小的后,仅凭接下来的“连锁反应”就能解锁全部的点。注意到我们“连锁反应”的一定是按\(b_i\)从小到大排序后的一段前缀(因为越往后连锁代价越昂贵),找到转折点......
  • Codeforces Round 902 (Div. 2) (CF1877) B、C、D 题解
    B题目大意你要传话给\(n\)个人,每传一下话需要花费\(p\),当一个人被传话后,他可以最多传给\(a_i\)个人,每次花费\(b_i\)。问把话传给\(n\)个人的最小花费。分析首先传给第一个人只少要\(p\)下来贪心,每次让花费最小、且能够传话的人去传话。考虑建一个堆,堆内的信息是......
  • Codeforces Round 902 Div. 2 - A B C D
    目录A.GoalsofVictoryB.HelmetsinNightLightnull传送门A.GoalsofVictory对给定n-1组队伍的净得分求和取负即为最后一组队伍的净得分B.HelmetsinNightLight赛时想法假了,赛后更正对所有人按照传递花费升序排序,从小到大逐步选取先花费p为传递花费最小的居......
  • Codeforces Round #902 (Div.1)
    A注意到\(a_i\ge1\),因此我们先花\(p\)的代价买下\(b\)最小的,然后一定可以一直用当前可能的最小代价买下后续的人。不难发现这一定是最优的方案。只需要将序列排序或者用std::multiset来维护。单组数据时间复杂度\(O(n\logn)\)。https://codeforces.com/contest/1876/......
  • 【题解】CodeForces-1874/1875
    CodeForces-1875AJellyfishandUndertale一定是等待降到\(1\)或者能补满到\(a\)时才使用工具,依题意模拟即可。提交记录:Submission-CodeForcesCodeForces-1874AJellyfishandGame这种题目有点思路但是不是很会。赛时第一发写得根据奇偶性判断,\(k\)为偶数错了,然后感......