首页 > 其他分享 >Codeforces Round 800 (Div. 2)

Codeforces Round 800 (Div. 2)

时间:2023-12-04 20:35:58浏览次数:35  
标签:include 结尾 int Codeforces long 字串 Div 800

Codeforces Round 800 (Div. 2)

基本情况

A题秒了。

B题写了个递推,但是T了,这种构造题还是得多练。

B. Paranoid String

我的解法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using ll = long long;
const int N = 2e5 + 10;
int t, n;
char ch;
int F[N], a[N];

void solve()
{
	std::cin >> n;
	for (int i = 1; i <= n; i++)
		std::cin >> ch, a[i] = F[i] = ch == '1' ? 1 : 0;
	ll tot = 0;
	tot += n;
	for (int i = 2; i <= n; i++)
	{
		for (int j = 1; j + i - 1 <= n; j++)
		{
			int l = j, r = j + i - 1;
			if (F[l] != a[r])
			{
				if (F[l] == 1)
					F[l] = 0;
				else
					F[l] = 1;
				tot++;
			}
		}
	}
	std::cout << tot << std::endl;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	std::cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

用 F 保存上一轮长度下以 l 开头的区间的值,然后对比,修改,更新答案。复杂度 \(\operatorname O(n^2)\)。

显然超时了。

构造解法

思路

可以发现,这两种操作的本质都是删去两个不同字符中左边的一个。

以样例的倒数第二组数据为例,也就是 \(1001\)。

我们分别计算以第 \(i\) 个字符结尾并最终能转化为只有一个字符的字串有多少个。

  • 以第 \(1\) 个字符结尾的显然只有它本身;

  • 以第 \(2\) 个结尾的有 \(10,0\);

  • 以第 \(3\) 个结尾的也只有它本身;

  • 以第 \(4\) 个结尾的可以有 \(1001,001,01,1\)。

可以发现一个有趣的性质:

  • 如果 \(s_i\ne s_{i-1}\),那么以 \(s_i\) 结尾,从 \(s_1,s_2,s_3,\cdots,s_i\) 开头的字串最终都能转化为只有一个字符的字串,一共有 \(i\) 个。

  • 如果 \(s_i=s_{i-1}\),那么以 \(s_i\) 结尾并能能转化为只有一个字符的字串的只有 \(s_i\) 本身。

时间复杂度 \(O(Tn)\),可以接受。

注意:因为答案最大可能是

\(\sum\limits_{i=1}^ni=\dfrac{200000\times200000}{2}=2\times10^{10}\)

所以答案需要开 long long

代码

#include<bits/stdc++.h>
using namespace std;
long long ans;
int main(){
    int t;
    cin>>t;
    while(t--){
        ans=0;
        int n;
        string s;
        cin>>n>>s;
        s=' '+s;//往后挪一格
        for(int i=1;i<=n;i++)
            if(s[i]!=s[i-1]) ans+=i;
            else ans++;
        cout<<ans<<endl;
    }
}

标签:include,结尾,int,Codeforces,long,字串,Div,800
From: https://www.cnblogs.com/kdlyh/p/17875884.html

相关文章

  • Codeforces Beta Round 10 C
    111发现d(x)只有0-9的值我们可以把按d(x)来分类发现要只计算我们就可以枚举d(C)d(a)d(b)贡献就是这三个任选要是有前面限制呢我打了一下表发现要是AB=C那么肯定满足后面这样我们就只用枚举C然后算他有多少对因子即可然后发现C是1-n连续的可以直接枚举因子A就可以快速算出有......
  • Codeforces Round 912 (Div. 2) - sol
    CodeforcesRound912(Div.2)-solCodeforcesRound912(Div.2)一直是因为晚上打太晚了就没有打过cf,所以只能vp了。/kk四道题有关位运算——不好评价。A.HalloumiBoxes给出\(n\)个数\(a_1,\dots,a_n\),和一个数\(k\)。问是否能通过任意次翻转\(\lek\)的连......
  • Codeforces Round 910 (Div. 2)
    CodeforcesRound910(Div.2)A.MilicaandStringwa麻了,,,不知道自己在干什么#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){intk,n;strings;cin>>n>>k>>s;in......
  • Codeforces Round 909 (Div. 3)
    CodeforcesRound909(Div.3)A#include<bits/stdc++.h>#defineintlonglong#defineendl'\n';usingnamespacestd;intn;voidsolve(){cin>>n;for(inti=1;i<=10;i++){if(i&1){if(n%3==0)n++;......
  • Codeforces Round 911 (Div. 2)
    CodeforcesRound911(Div.2)A.CoverinWater,,,mc无限水#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){intn;strings;cin>>n>>s;s=""+s+......
  • Codeforces Round 912 (Div. 2)
    CodeforcesRound912(Div.2)什么位运算专场A.HalloumiBoxes#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;inta[110];intn,k;voidsolve(){cin>>n>>k;for(inti=0;i<n;i++)cin&......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    EducationalCodeforcesRound158(RatedforDiv.2)AEDU的题总是感觉写起来怪怪的#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;inta[101];voidsolve(){intn,x;cin>>n>>x;intans=0;......
  • Codeforces Round 912 (Div. 2)补题B、C、D1
    CodeforcesRound912(Div.2)B.StORageroom思路\(a_i\)=\(M_i\)\(_1\)&\(M_i\)\(_2\)&\(M_i\)\(_3\)&...&\(M_i\)\(_n\)\((i!=j)\)ac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong......
  • CF1901 C Add, Divide and Floor 题解
    LinkCF1901CAdd,DivideandFloorQuestion给定一个长度为\(n\)的序列,每次操作你需要选择一个整数\(x\),并将所有\(a_i\)替换为\(\lfloor\frac{a_i+x}{2}\rfloor\)。求至少多少次操作后能将所有\(a_i\)变相同若最少次数小于等于\(n\),输出操作次数和每次操作所选......
  • Educational Codeforces Round 159 (Rated for Div. 2)
    EducationalCodeforcesRound159(RatedforDiv.2)基本情况A题秒了。B题想出来贪心思想,也想出来怎么找最优解了,但实现极其复杂繁琐,最后以先超时优化后又错误的结果告终。B.GettingPoints明显越后面开始学收益越高。然后写了个简单粗暴的纯模拟,T了。#include<iostrea......