Codeforces Round #735 (Div. 2)部分题解

A
枚举相邻元素的乘积即可。

我的思路:贪心思维,对于任意一个区间,区间越大,最小值只可能缩小而不会增大。所以要求最大值,只需要枚举最小的合法区间。

B
观察到a中的元素没有任何规律,就觉得大概率这个题可能直接算不了。
但是k以及a中元素都有范围,两个a中的元素取|运算,结果不会超过 2 ∗ n 2*n 2n
所以显然 i ∗ j i * j ij 部分对整体结果影响更大(个人理解,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吧,这分段的我从没写过。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaaaterinaX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值