Codeforces Round 951 (Div. 2) A~E

Codeforces Round 951 (Div. 2) A~E题解

A.Guess the Maximum(枚举)

题意:

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

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

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

分析:

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

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

代码:

#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(数学)

题意:

给你两个不同的非负整数xxxyyy。考虑两个无穷序列a1,a2,a3,…a_1,a_2,a_3,\ldotsa1,a2,a3,b1,b2,b3,…b_1,b_2,b_3,\ldotsb1,b2,b3,,其中

  • an=n⊕xa_n=n\oplus xan=nx
  • bn=n⊕yb_n=n\oplus ybn=ny

x⊕yx\oplus yxy表示整数xxxyyy的按位异或运算。

例如,有了x=6x=6x=6之后,序列aaa的前888个元素将如下所示:[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,]。请注意,元素的索引以111开始。

你的任务是找出序列aaabbb的最长公共子段†^\dagger的长度。换句话说,求某个i,j≥1i,j\ge 1i,j1的最大整数mmm,使得ai=bj,ai+1=bj+1,…,ai+m−1=bj+m−1a_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序列ppp的一个子段是序列pl,pl+1,…,prp_l,p_{l+1},\ldots,p_rpl,pl+1,,pr,其中1≤l≤r1\le l\le r1l

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值