首页 > 其他分享 >Codeforces Round 830 (Div. 2) B. Ugu

Codeforces Round 830 (Div. 2) B. Ugu

时间:2023-09-10 17:44:31浏览次数:44  
标签:std 830 后缀 cnt Codeforces int Div neq 翻转

给一个 \(01\) 字符串,需要使它变为非降的,可以执行以下操作:

  • 选择一个下标 \(i, (1 \leq i \leq n)\) ,\(\forall j \geq i\) 的数位翻转。

经典的按无后效性翻转问题。

考虑从前往后,得到一个全 \(0\) 串。若开始存在 \(1\) ,则答案减 \(1\) 。

  • 如果存在 \(1\) ,遇到 \(1\) 便翻转后缀。最后一定会有一段连续 \(1\) 的后缀,导致多翻转一次,于是答案为 \(cnt - 1\) 。
  • 如果不存在 \(1\) ,答案为 \(0\) 。
  • 于是答案为 \(max(cnt - 1, 0)\) 。

直观考虑显然是用前缀和,这是对的。

但是“一维后缀翻转”问题具有性质: \(a_{i}\) 翻转后与 \(a_{i + 1}\) 的关系不变。

  • 若 \(a_{i + 1} \neq a_{i}\) ,此时 \(a_i\) 为 \(1\) ,将它的后缀翻转,若 \(a_{i + 1} \neq a_{i}\) ,翻转后 \(a_{i + 1}\) 为 \(1\) 。

于是可以设边界 \(s_{0} = 0\) ,记录 \(cnt = \sum_{i=1}^{n}[a_i \neq a_{i - 1}]\) 。答案为 \(max(cnt - 1, 0)\) 。

view
#include <bits/stdc++.h>
void solve() {
	int n; std::cin >> n;
	std::string s; std::cin >> s; s = "0" + s;
	int cnt = 0; for (int i = 1; i <= n; i++) cnt += (s[i] != s[i - 1]);
	std::cout << std::max(cnt - 1, 0) << '\n';
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

标签:std,830,后缀,cnt,Codeforces,int,Div,neq,翻转
From: https://www.cnblogs.com/zsxuan/p/17691494.html

相关文章

  • $Codeforces Round 891 (Div. 3)$
    \(A.ArrayColoring\)显然需要奇数个偶数即可满足题目。voidsolve(){intn=read(),res=0;for(inti=1;i<=n;i++){intx=read();if(x%2)res++;}puts(res%2==0?"YES":"NO");//puts(ans>0?"Yes":"No&......
  • Codeforces Round 824 (Div. 2) B. Tea with Tangerines
    有\(n\)块橘子皮,第\(i\)块大小为\(a_i\)。在一部操作中可以把一块橘子皮分成两块,即这块橘子皮为\(x\),让\(x\)变为\(y,z(x=y+z)\)。希望对于任意两块橘子皮,他们相差严格小于两倍。即两块中更小的为\(x\),更大的为\(y\),有\(2x>y\)。最少需要执行多少步操作......
  • 【题解】Educational Codeforces Round 143(CF1795)
    A.TwoTowers题目描述:有\(a,b\)两座由红蓝色方块垒成的塔,其中\(a\)的高度为\(n\);\(b\)的高度为\(m\),用R代表红色;用B代表蓝色。你可以多次把其中一座顶端的方块移到另一座的顶端(可以不移动)。问有没有一种方法可以使两座塔中均没有连续的同颜色方块。题目分析:可以......
  • Codeforces Round 827 (Div. 4) C. Stripes
    在一个\(8\times8\)的网格上,一开始无色。每次一整行或一整列地染色,后染的颜色会覆盖前染的颜色。染色方式有两种,一种是横着染\(R\)色,一种是竖着染\(B\)色。给出最终染色的网格,问最后染的色是哪种。对每行开\(R\)计数器、每列开\(B\)计数器。遍历行、列,如果计数器的......
  • Codeforces Round 832 (Div. 2) B. BAN BAN
    给一个正整数\(n\),定义\(S{n}\)为字符串\(BAN\)复制\(n\)次。比如\(S(3)=BANBANBAN\)。可以对\(S(n)\)执行任意次以下操作:选择\(i,j(1\leqi,j\leq3n,i\neqj)\)。\(swap(s_i,s_j)\)。希望\(BAN\)不作为一个子序列出现在\(S(n)\)中,输出最小交换......
  • [题解] Codeforces Round 895 (Div. 3) F~G
    CodeforcesRound895(Div.3)F~GF.SellingaMenageri考虑如何让卖出的价格翻倍,那么自然是从\(i\toa_i\)。通过这样连边,我们可以发现,边集构成了基环树森林。显而易见的是,如果不考虑环,那么图就是拓扑图,按照拓扑关系跑一遍,就可以使得所有点价值最多。现在考虑环上的问题......
  • SMU Autumn 2023 Round 1(Div.1)
    SMUAutumn2023Round1(Div.1)A.SetorDecrease(枚举)题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后使得\(\sum\limits_{i=1}^{n}a_i\leqk\),求最少的操作步数首先我们让一个大数变成一个最小数的贡献肯定是要比让大数减一产生的贡献更多,所以我......
  • Codeforces Round 895 (Div. 3)
    CodeforcesRound895(Div.3)比赛链接A.TwoVessels题目链接给你三个数a,b,c每次把a,b中较大的数中拿去最多等于c的数给较小的数字,问多少次使得a,b两个数字相等。A思路:可恶,在写的过程中出现了精度丢失的情况,导致出现了好多问题,问多少次使得a和b相等,就是\[abs(a-b)/2/c向上取......
  • 【题解】CF1830A Copil Copac Draws Trees
    你考虑对于每一条边打上时间标记,然后在树上DFS的时候维护一下以\(u\)为根的答案即可,然后将答案合并,反正很简单,看代码就懂。code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+8;intt,n;structEdge{ intto,next,val;}edge[NN<<1];inthead[......
  • CodeForces 960G Bandit Blues
    洛谷传送门CF传送门发现设排列最大值位置为\(i\),那么\([1,i]\)只可能存在前缀最大值,\([i,n]\)只可能存在后缀最大值。由此设\(f_{i,j}\)为长度为\(i\)的排列,前缀最大值有\(j\)个的方案数,有转移:\[f_{i,j}=f_{i-1,j-1}+(i-1)f_{i-1,j}\]意思是每......