首页 > 其他分享 >「杂题乱刷2」CF1527B2

「杂题乱刷2」CF1527B2

时间:2024-09-17 12:35:11浏览次数:14  
标签:ll 此时 CF1527B2 先手 字符串 杂题 sum define

题目链接

CF1527B1(luogu)

CF1527B2(luogu)

CF1527B1(codeforces)

CF1527B2(codeforces)

解题思路

这篇题解分 B1,B2 两个部分来讲。

B1 sol:

考虑字符串中 \(0\) 的数量,设这个值为 \(sum\):

  • 若 \(sum \equiv 0 \pmod{2}\),且字符串回文时,那么此时,后手可以一直模仿先手的操作,直到字符串含有最后一个 \(0\) 时,后手可以反转这个字符串,那么此时后手的代价比先手要少 \(2\),综上,后手此时必胜。

  • 若 \(sum \equiv 1 \pmod{2}\),且字符串回文时,那么此时,字符串的长度一定奇数,且字符串中间的数字一定为 \(0\),那么此时,先手可以将中间的 \(0\) 变为 \(1\),此时若还有剩余的 \(0\),则先手必胜,否则后手必胜。

综上,这就是 B1 的做法。

B2 sol:

仍然考虑字符串中 \(0\) 的数量,设这个值为 \(sum\):

若字符串已经回文,则直接按照 B1 的做法来做。

否则,先手一定可以反转字符串,直到后手把这个字符串变为回文,那么此时:

  • 若 \(n \equiv 0 \pmod{2}\),由于此时先手仍然可以一直模仿后手的操作,由于前期先手比后手付出的代价要少,因此可以得出先手必胜。

  • 若 \(n \equiv 1 \pmod{2}\),如果字符串中间的数字不为 \(0\) 则先手仍然可以模仿后手的情况,此时先手必胜。否则,若此时 \(sum = 2\),则后手去掉最外侧的 \(0\),此时先手与后手平局,其余情况,我们发现先手的所需代价至少比后手少 \(1\),先手必胜。

参考代码

#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
ll _t_;
void _clear(){}
ll n;
string s;
bool check(string s)
{
	ll L=1,R=n;
	while(L<=R && s[L]==s[R])
		L++,R--;
	return L>=R;
}
/*
11010

11011 0:1

11111 1:1


1001101

1011001

1011101 0:1

1111101 1:1

1011111
*/
void solve()
{
	_clear();
	cin>>n>>s;
	s=' '+s;
	if(check(s))
	{
		ll sum=0;
		for(auto i:s)
			sum+=i=='0';
		if(sum%2==0)
		{
			cout<<"BOB\n";
			return ;
		}
		if(sum==1)
		{
			cout<<"BOB\n";
			return ;
		}
		cout<<"ALICE\n";
		return ;
	}
	ll sum=0;
	for(auto i:s)
		sum+=i=='0';
	if(n%2 && sum==2 && s[(n+1)/2]=='0')
		cout<<"DRAW\n";
	else
		cout<<"ALICE\n";
//	exit(-1);
}
int main()
{
//	freopen("tst.txt","r",stdin);
//	freopen("sans.txt","w",stdout);
	IOS;
	_t_=1;
 	cin>>_t_;
	while(_t_--)
		solve();
	QwQ;
}

标签:ll,此时,CF1527B2,先手,字符串,杂题,sum,define
From: https://www.cnblogs.com/wangmarui/p/18417069

相关文章

  • 杂题乱做 - 2000-
    目录写在前面CF1992F贪心,数学1900CF2008G贪心,数学1800CF2009G1数据结构1900CF1891D数学1900CF1996F二分,简单数学1900CF1985G数学1600写在最后写在前面简单题们。以后可以用来搬。唉唉现在2000及以下都能直接秒了真没意思。CF1992F贪心,数学1900显然直接贪心......
  • 9月杂题
    [ABC310F]Make10Again分母是\(\proda_i\),只需求分子。首先要发现投出了\(10\)以上的点数是无用的,所以只需考虑\(10\)以内的。思考如何计数,发现转移依赖于前面的点数和的方案数,而且\(10\)很小,考虑状压DP,设\(f_{i,s}\)表示前\(i\)个骰子,状态为\(s\)的方案数,转......
  • 杂题乱做
    BalticOI2021A.ADifficultyChoice蓝题做不出来?蓝题做不出来?蓝题做不出来?发现要求是这\(k\)个数和在\([A,2A]\)之间,这个\(2A\)肯定有说法。分类讨论有没有选择\(\geqA\)的数。如果选择了,一定是仅选择一个\(\geqA\)中最小的数,这时已经满足\(\geqA\)了,剩下的肯......
  • 「杂题乱刷2」CF1301C
    怎么没有二分的题解啊,写一篇。题目链接CF1301CAyoub'sfunction解题思路发现我们可以将问题转化成将\(n-m\)个\(1\)分成\(m\)份,设第\(i\)份的数字之和为\(sum_i\),则这样的分配方案的贡献为\(\frac{n\times(n+1)}{2}-\sum_{i=1}^{n}sum_i^2\)。容易发现要使......
  • 杂题总结
    杂题总结记号约定不难注意意味着我在初见的时候想到了难以注意意味着我没有注意到P8421[THUPC2022决赛]rsraogpsP8421[THUPC2022决赛]rsraogps-洛谷|计算机科学教育新生态(luogu.com.cn)首先套路性扫描线,然后这个问题就变成增量构造。不难注意不知怎么......
  • 「杂题乱刷2」CF862D
    简单题。题目链接CF862DMahmoudandEhabandthebinarystring解题思路首先我们可以发现,字符串的第一个字母不是\(1\)就是\(0\),因此我们可以容易花费\(2\)次询问来找到数字\(0\)或数字\(1\)所在的一个位置。然后,显然的,我们以先找到的数字为\(0\)为例,那么我们就......
  • 「杂题乱刷2」CF862C
    怎么题解区里都没有随机化的题解啊/jy。于是就有了这篇题解。题目链接CF862CMahmoudandEhabandthexor解题思路思路非常简单。首先容易发现在\(n=1\)时,直接构造一个\(x\)这个数即可。其次我们考虑\(n=2\)的情况,由于异或的基本性质,我们可以得出当\(x=0\)......
  • 「杂题乱刷2」CF1493C
    题目链接K-beautifulStringsCF1493C解题思路首先,如果原字符串是合法的直接输出原字符串即可。然后我们考虑一个最简单的暴力,你枚举第一个你构造的字符串比原串大的字符的位置,再枚举这个字符,然后后面的肯定是从后往前贪心放即可,在此不再赘述。这样的复杂度是\(O(|S|^2\tim......
  • 「杂题乱刷2」CF1567D
    duel到的。题目链接CF1567D解题思路发现在越高的数位上,你获取的利益就会越大。因此你肯定是每次将尽可能多的数分到最高的数位上是最优的。但是你会发现,有可能你这样分数位后后面的数就分不到权值了,你只需要保证去掉当前分掉的权值之后,剩下可以分的权值不小于还剩下没分到......
  • 8 月杂题记
    AT_joisc2017_c题目描述:过于复杂,略。答案明显具有单调性。考虑二分答案。有一个很自然的想法,没点燃的要向正在燃的靠近,且一定以最大速度走\(T\)秒。对于一个区间\([L,R]\),满足让它能用一个点燃的互相点燃。有一个条件为\(X_r-X_l\le2\times(r-l)\timesv\time......