Codeforces Round #721 (Div. 2)A,B1,C题解

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #721 (Div. 2)A,B1,C题解相关的知识,希望对你有一定的参考价值。

Codeforces Round #721 (Div. 2)A,B1,C题解

A

求能够使and位运算为0的最大值,只要知道这个数的二进制有多少位,把第一位变成0,后边的全变成1就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
int a[N];

void solve()
{
	int n;
	cin>>n;
	int nn = log2(n);//二进制位数
	ll s = 0;
	for(int i=0;i<nn;i++) 
		s+=pow(2,i);
	cout<<s<<'\\n';
	
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int _;
	cin>>_;
	while(_--)
	{
		solve();
	}
	return 0; 
 } 

B1

因为刚开始为回文字符串,先手A必须找到一个0变成1,B再reverse,但是如果奇数长度位的回文串中间为0的话,A就可以先翻中间的0,然后B只能把所有的0变成1
所以如果中间为0,A只变一次,B变的次数为所有0的个数
中间为1,A变的次数为所有0的个数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+5;
char a[N];

void solve()
{
	int n,aa=0,bb=0;
	cin>>n;
	cin>>(a+1);
	int flag=0;//记录是否中间为0
	if(n&1)
	{
		if(a[n/2+1]=='0') flag=1,aa++,a[n/2+1]='1';
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]=='0'&&flag) bb++;
		else if(a[i]=='0') aa++;
	}
	if(bb<aa) cout<<"BOB\\n";
	else if(aa==bb) cout<<"DRAW\\n";
	else cout<<"ALICE\\n";
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int _;
	cin>>_;
	while(_--)
	{
		solve();
	}
	return 0; 
 } 

C

求每个相同数对的贡献
对一个数组 a 1 , a 2 , a 3 , a 4 , a 5 , a 6 . . . . a j a_1,a_2,a_3,a_4,a_5,a_6....a_j a1,a2,a3,a4,a5,a6....aj,如果 a 4 = a j a_4=a_j a4=aj,那么 a 4 a_4 a4向左可以扩展3个数,也就是存在四个子区间 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4 a 2 , a 3 , a 4 a_2,a_3,a_4 a2,a3,a4 a 3 , a 4 a_3,a_4 a3,a4 a 4 a_4 a4,共四个,同理,右边可以扩展 n − j + 1 n-j+1 nj+1个区间,这个数对对总答案的贡献为 i ∗ ( n − j + 1 ) i*(n-j+1) i(nj+1)

下面考虑存在多个相同的数对
如果 a 1 , a 2 , a 3 . . . a k , a j a_1,a_2,a_3...a_k,a_j a1,a2,a3...ak,aj这几个数相同,对于 a j a_j aj来说,前面的数每个数与 a j a_j aj组成对数的贡献和为 ( 1 + 2 + 3 + k ) ∗ ( n − j + 1 ) (1+2+3+k)*(n-j+1) (1+2+3+k)(nj+1),第一个括号里面就是前面的下标之和(对应每个前面的数与后面的 a j a_j aj组成对数的贡献),这是对于每个 a j a_j aj来说的贡献
如果求所有的数的贡献,只要记录相同数出现的下标之和,每次结果加上 (当前数出现过的下标之和)*(n-i+1)

注意:mp的second要开long long,乘法可能为溢出

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
void solve()
{
	ll n;cin>>n;
	map<int,ll>mp;
	ll ans = 0;
	for(ll i=1;i<=n;i++)
	{
		int num;cin>>num;
		ans += mp[num]*(n-i+1);
		mp[num] += i;
	}
	cout<<ans<<'\\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int _;
	cin>>_;
	while(_--)
	{
		solve();
	}
	return 0;
}

以上是关于Codeforces Round #721 (Div. 2)A,B1,C题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #721 (Div. 2) Codeforces-1527

codeforces round#721c

codeforces Round 721 (Div 2)

Codeforces Round #721 (Div. 2)

C. Sequence Pair Weight——Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight(计算贡献/STL)