Codeforces Round 969 (Div. 2) A B C

A

朵拉有一个包含整数的集合 s s s 。一开始,她会将 [ l , r ] [l, r] [l,r] 中的所有整数放入集合 s s s 。也就是说,当且仅当 l ≤ x ≤ r l \leq x \leq r lxr 时,整数 x x x 初始包含在集合中。然后,她允许你执行以下操作:

  • 从集合 s s s 中选择三个不同的整数 a a a b b b c c c ,使得 gcd ⁡ ( a , b ) = gcd ⁡ ( b , c ) = gcd ⁡ ( a , c ) = 1 † \gcd(a, b) = \gcd(b, c) = \gcd(a, c) = 1^\dagger gcd(a,b)=gcd(b,c)=gcd(a,c)=1
  • 然后,从集合 s s s 中删除这三个整数。

最多可以进行多少次运算?

† ^\dagger 回顾 gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y) 表示整数 x x x y y y最大公约数
输入

每个测试由多个测试用例组成。第一行包含一个整数 t t t 1 ≤ t ≤ 500 1 \leq t \leq 500 1t500 )–测试用例数。( 1 ≤ t ≤ 500 1 \leq t \leq 500 1t500 )–测试用例的数量。测试用例说明如下。

每个测试用例的唯一一行包含两个整数 l l l r r r ( 1 ≤ l ≤ r ≤ 1000 1 \leq l \leq r \leq 1000 1lr1000 ) - 初始集合中的整数范围。
输出

对于每个测试用例,输出一个整数 - 您能执行的最大操作数。

解题思路

易发现,只有三个数为两奇数和一个偶数,贪心想,即为连续的三个数,两个奇数和一个偶数
代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
#define fi first
#define se second
#define PII pair<int,int>
#define ALL(x) x.begin(),x.end() 
const int N=2e5+10;
void solve()
{
    int ans=0;
	int l,r;cin>>l>>r;
    for(int i=l;i<=r;i++)    if(i&1) ans++;
    cout<<ans/2<<'\n';
}
signed main()
{
    IOS
	int T;cin>>T;
	while(T--)solve();
	return 0;
}

B

Index 在生日派对上又收到了一个整数数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an ,她决定对其执行一些操作。

从形式上看,她要依次执行 m m m 个操作。每个操作都属于两种类型之一:

  • +   l   r \texttt{+ l r} + l r .给定两个整数 l l l r r r ,对于所有 1 ≤ i ≤ n 1 \leq i \leq n 1in l ≤ a i ≤ r l \leq a_i \leq r lair ,设 a i : = a i + 1 a_i := a_i + 1 ai:=ai+1 .
  • -   l   r \texttt{- l r} - l r .已知两个整数 l l l r r r ,对于所有 1 ≤ i ≤ n 1 \leq i \leq n 1in ,使得 l ≤ a i ≤ r l \leq a_i \leq r lair ,设 a i : = a i − 1 a_i := a_i - 1 ai:=ai1

例如,如果初始数组为 a = [ 7 , 1 , 3 , 4 , 3 ] a = [7, 1, 3, 4, 3] a=[7,1,3,4,3] ,执行运算 +   2   4 \texttt{+} \space 2 \space 4 + 2 4 之后,数组为 a = [ 7 , 1 , 4 , 5 , 4 ] a = [7, 1, 4, 5, 4] a=[7,1,4,5,4] 。然后,在执行操作 -   1   10 \texttt{-} \space 1 \space 10 - 1 10 之后,数组 a = [ 6 , 0 , 3 , 4 , 3 ] a = [6, 0, 3, 4, 3] a=[6,0,3,4,3]

Index 对数组 a a a 中的最大值很好奇。请帮助她找到每次 m m m 操作后的最大值。
输入

每个测试由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 2 ⋅ 1 0 4 1 \leq t \leq 2 \cdot 10^4 1t2104 ) - 测试用例数。测试用例说明如下。

每个测试用例的第一行包含两个整数 n n n m m m ( 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 , 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1m105 )–数组的长度和操作次数。

每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an ( 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109 ) - 初始数组 a a a

然后是 m m m 行,每行对应一个操作,格式如下: c   l   r \texttt{c l r} c l r c ∈ { + , - } c \in \{\texttt +, \texttt -\} c{+,-} l l l r r r 为整数, 1 ≤ l ≤ r ≤ 1 0 9 1 \leq l \leq r \leq 10^9 1lr109 为操作说明。

请注意, a i a_i ai 元素在某些运算后可能不满足 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1ai109 ,如示例所示。

保证所有测试用例中 n n n 的总和不超过 1 0 5 10^5 105 ,所有测试用例中 m m m 的总和不超过 1 0 5 10^5 105
输出

对于每个测试用例,输出一行包含 m m m 个整数的数据,其中 i i i 个整数描述了数组在 i i i 次操作后的最大值。

解题思路

数学的思路想,最大值变化后仍会是最大值,即只考虑最大值就行
代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
#define fi first
#define se second
#define PII pair<int,int>
#define ALL(x) x.begin(),x.end() 
const int N=2e5+10;
int a[N];
void solve()
{
    memset(a,0,sizeof a);
	int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++)    cin>>a[i];
    sort(a+1,a+n+1);
    int ans=a[n];
    while (m -- )
    {
        char s;
        int l, r;
        cin >> s >> l >> r;
        if(ans>=l&&ans<=r)
        {
            if(s=='+')  ans++;
            else    ans--;
        }
        cout<<ans<<' ';
    }
    cout<<'\n';
}
signed main()
{
    IOS
	int T;cin>>T;
	while(T--)solve();
	return 0;
}

C

多拉刚刚学会编程语言 C++!

然而,她完全误解了 C++ 的含义。她认为这是对有 n n n 个元素的数组 c c c 进行两种加法运算。Dora 有两个整数 a a a b b b 。在一次操作中,她可以从以下操作中选择一个。

  • 选择一个整数 i i i ,使得 1 ≤ i ≤ n 1 \leq i \leq n 1in 增加 c i c_i ci a a a
  • 选择一个整数 i i i ,使得 1 ≤ i ≤ n 1 \leq i \leq n 1in ,并将 c i c_i ci 增加 b b b

注意 a a a b b b常数,它们可以相同。

我们把数组 d d d 的范围定义为 max ⁡ ( d i ) − min ⁡ ( d i ) \max(d_i) - \min(d_i) max(di)min(di) 。例如,数组 [ 1 , 2 , 3 , 4 ] [1, 2, 3, 4] [1,2,3,4] 的取值范围是 4 − 1 = 3 4 - 1 = 3 41=3 ,数组 [ 5 , 2 , 8 , 2 , 2 , 1 ] [5, 2, 8, 2, 2, 1] [5,2,8,2,2,1] 的取值范围是 8 − 1 = 7 8 - 1 = 7 81=7 ,数组 [ 3 , 3 , 3 ] [3, 3, 3] [3,3,3] 的取值范围是 3 − 3 = 0 3 - 3 = 0 33=0

经过任意次数的运算后(可能是 0 0 0 ),Dora 会计算出新数组的范围。你需要帮助朵拉最小化这个值,但是因为朵拉喜欢自己探索,所以你只需要告诉她最小化的值。
输入

每个测试由多个测试用例组成。第一行包含一个整数 t t t 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1t104 )–测试用例数。( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1t104 ) - 测试用例的数量。测试用例说明如下。

每个测试用例的第一行包含三个整数 n n n a a a b b b 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 1 ≤ a , b ≤ 1 0 9 1 \leq a, b \leq 10^9 1a,b109 )–分别是数组 c c c 的长度和常量值。

每个测试用例的第二行包含 n n n 个整数 c 1 , c 2 , … , c n c_1, c_2, \ldots, c_n c1,c2,,cn ( 1 ≤ c i ≤ 1 0 9 1 \leq c_i \leq 10^9 1ci109 ) - 数组 c c c 的初始元素。

保证所有测试用例中 n n n 的总和不超过 1 0 5 10^5 105
输出

对于每个测试用例,输出一个整数 - 数组经过任意次数操作后的最小可能范围。

解题思路

极值问题,数的增加值可到增加 a ,b 的最大公约数,先排序求出最大的极值,然后依次比较相邻的两数的最小极值
代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
#define fi first
#define se second
#define PII pair<int,int>
#define ALL(x) x.begin(),x.end() 
const int N=2e5+10;
int c[N];
void solve()
{
    memset(c, 0, sizeof c);
	int n, a, b;
    cin >> n >> a >> b;
    int g= __gcd(a, b);
    for(int i=1; i<=n; i++)
    {
        cin >> c[i];
        c[i] = c[i]%g;
    }
    sort(c+1,c+n+1);
    int ans = c[n] - c[1];
    for(int i=2; i<=n; i++)    ans=min(ans,c[i-1]+g-c[i]);
    cout<<ans<<'\n';
}
signed main()
{
    IOS
	int T;cin>>T;
	while(T--)solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值