Codeforces Round #735 (Div. 2)部分题解
Posted KaaaterinaX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #735 (Div. 2)部分题解相关的知识,希望对你有一定的参考价值。
A
枚举相邻元素的乘积即可。
我的思路:贪心思维,对于任意一个区间,区间越大,最小值只可能缩小而不会增大。所以要求最大值,只需要枚举最小的合法区间。
B
观察到a中的元素没有任何规律,就觉得大概率这个题可能直接算不了。
但是k以及a中元素都有范围,两个a中的元素取|运算,结果不会超过
2
∗
n
2*n
2∗n。
所以显然
i
∗
j
i * j
i∗j 部分对整体结果影响更大(个人理解,cf上有详细证明),所以只需要枚举数组后面一截,最大值一定在里面。(我取了后1000个元素,反正过了,应该更小一点也行。)
C
对于任意一个数字
k
k
k,如果能出现在序列中,那么一定有
n
n
n ^
x
x
x
=
k
=k
=k
(
x
<
=
m
)
(x<=m)
(x<=m)
根据异或性质,可知 k k k ^ n = x n=x n=x,所以只需要找到最小的 k k k,令 k k k ^ n n n > = m + 1 >=m+1 >=m+1
所以进行贪心构造,从高位开始让 n n n与 m + 1 m+1 m+1进行比对,只要遇到同二进制位上 m + 1 m+1 m+1为1而 n n n为0就让 k k k的这一位为1,如果遇到同二进制位上 n n n为1而 m + 1 m+1 m+1为0,直接退出循环。
int main()
int t;
cin>>t;
while(t--)
ll n,m;
cin>>n>>m;
m++;
ll ans=0;
for(int i=30;i>=0;i--)
int t1=(n>>i)&1;
int t2=(m>>i)&1;
if(t1==0&&t2==1)
ans+=(1<<i);
else if(t1==1&&t2==0)
break;
cout<<ans<<endl;
D
原来这里的子串的定义是一定要连续的一段。。
(一开始看错题了一点思路都没有,看了官方题解回头去看题,恍然大悟。)
关键就是奇数+偶数=奇数,所以把一段一样的分成两截,一截是奇数,一截是偶数即可。。
int main()
int t;
cin>>t;
while(t--)
int n;
cin>>n;
if(n==1)
cout<<'b'<<endl;
continue;
if(n%2==0)
for(int i=1;i<=n/2-1;i++)
cout<<'a';
cout<<"b";
for(int i=1;i<=n/2;i++)
cout<<'a';
cout<<endl;
else
for(int i=1;i<=n/2;i++)
cout<<'a';
cout<<"bc";
for(int i=1;i<=n/2-1;i++)
cout<<'a';
cout<<endl;
尝试写一下E吧,这分段的我从没写过。。
以上是关于Codeforces Round #735 (Div. 2)部分题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #735 (Div. 2)-C. Mikasa-题解
Codeforces Round #735 (Div. 2)-B. Cobb-题解
Codeforces Round #735 (Div. 2)-A. Cherry-题解
Codeforces Round #735 (Div. 2)-C. Mikasa-题解