Codeforces Round 951 (Div. 2) A~E

A.Guess the Maximum(枚举)

题意:

爱丽丝和鲍勃想出了一个相当奇怪的游戏。他们有一个整数数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an。爱丽丝选择了某个整数 k k k并告诉了鲍勃,然后就发生了下面的事情:

  • 鲍勃选择两个整数 i i i j j j( 1 ≤ i < j ≤ n 1\le i\lt j\le n 1i<jn),然后找出整数 a i , a i + 1 , … , a j a_i,a_{i+1},\ldots,a_j ai,ai+1,,aj中的最大值;
  • 如果得到的最大值严格大于 k k k,则爱丽丝获胜,否则鲍勃获胜。

请帮助爱丽丝找出保证她获胜的 k k k的最大值。

分析:

为了最大值尽可能小,爱丽丝会选择所有区间最大值的最小值 − 1 -1 1,那么选择的连续子串越短越优。注意到区间长度越大,这个区间的最大值是随着它不减的,所以如果鲍勃要让爱丽丝选的最小的话,区间长度一定是 2 2 2

枚举所有长度为 2 2 2的连续子串,求出它们最大值的最小值,然后减去 1 1 1输出即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 1e6 + 10;

LL n, a[N];

void solve() {
   
    LL ans = 1e9;
    cin >> n;
    for (int i = 1; i <= n; i++) {
   
        cin >> a[i];
        if (i > 1)
            ans = min(ans, max(a[i], a[i - 1]));
    }
    cout << ans - 1 << endl;
}

int main() {
   
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

B.XOR Sequences(数学)

题意:

给你两个不同的非负整数 x x x y y y。考虑两个无穷序列 a 1 , a 2 , a 3 , … a_1,a_2,a_3,\ldots a1,a2,a3, b 1 , b 2 , b 3 , … b_1,b_2,b_3,\ldots b1,b2,b3,,其中

  • a n = n ⊕ x a_n=n\oplus x an=nx
  • b n = n ⊕ y b_n=n\oplus y bn=ny

x ⊕ y x\oplus y xy表示整数 x x x y y y的按位异或运算。

例如,有了 x = 6 x=6 x=6之后,序列 a a a的前 8 8 8个元素将如下所示: [ 7 , 4 , 5 , 2 , 3 , 0 , 1 , 14 , … ] [7,4,5,2,3,0,1,14,\ldots] [7,4,5,2,3,0,1,14,]。请注意,元素的索引以 1 1 1开始。

你的任务是找出序列 a a a b b b的最长公共子段 † ^\dagger 的长度。换句话说,求某个 i , j ≥ 1 i,j\ge 1 i,j1的最大整数 m m m,使得 a i = b j , a i + 1 = b j + 1 , … , a i + m − 1 = b j + m − 1 a_i=b_j,a_{i+1}=b_{j+1},\ldots,a_{i+m-1}=b_{j+m-1} ai=bj,ai+1=bj+1,,ai+m1=bj+m1

† ^\dagger 序列 p p p的一个子段是序列 p l , p l + 1 , … , p r p_l,p_{l+1},\ldots,p_r pl,pl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值