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 n−j+1个区间,这个数对对总答案的贡献为 i ∗ ( n − j + 1 ) i*(n-j+1) i∗(n−j+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)∗(n−j+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 #721 (Div. 2)
C. Sequence Pair Weight——Codeforces Round #721 (Div. 2)
Codeforces Round #721 (Div. 2) C. Sequence Pair Weight(计算贡献/STL)