A
朵拉有一个包含整数的集合 s s s 。一开始,她会将 [ l , r ] [l, r] [l,r] 中的所有整数放入集合 s s s 。也就是说,当且仅当 l ≤ x ≤ r l \leq x \leq r l≤x≤r 时,整数 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 1≤t≤500 )–测试用例数。( 1 ≤ t ≤ 500 1 \leq t \leq 500 1≤t≤500 )–测试用例的数量。测试用例说明如下。
每个测试用例的唯一一行包含两个整数
l
l
l 和
r
r
r (
1
≤
l
≤
r
≤
1000
1 \leq l \leq r \leq 1000
1≤l≤r≤1000 ) - 初始集合中的整数范围。
输出
对于每个测试用例,输出一个整数 - 您能执行的最大操作数。
解题思路
易发现,只有三个数为两奇数和一个偶数,贪心想,即为连续的三个数,两个奇数和一个偶数
代码
#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 1≤i≤n 且 l ≤ a i ≤ r l \leq a_i \leq r l≤ai≤r ,设 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 1≤i≤n ,使得 l ≤ a i ≤ r l \leq a_i \leq r l≤ai≤r ,设 a i : = a i − 1 a_i := a_i - 1 ai:=ai−1 。
例如,如果初始数组为 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 1≤t≤2⋅104 ) - 测试用例数。测试用例说明如下。
每个测试用例的第一行包含两个整数 n n n 和 m m m ( 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1≤n≤105 , 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1≤m≤105 )–数组的长度和操作次数。
每个测试用例的第二行包含 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 1≤ai≤109 ) - 初始数组 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 1≤l≤r≤109 为操作说明。
请注意, a i a_i ai 元素在某些运算后可能不满足 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1≤ai≤109 ,如示例所示。
保证所有测试用例中
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 1≤i≤n 增加 c i c_i ci a a a 。
- 选择一个整数 i i i ,使得 1 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n ,并将 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 4−1=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 8−1=7 ,数组 [ 3 , 3 , 3 ] [3, 3, 3] [3,3,3] 的取值范围是 3 − 3 = 0 3 - 3 = 0 3−3=0 。
经过任意次数的运算后(可能是
0
0
0 ),Dora 会计算出新数组的范围。你需要帮助朵拉最小化这个值,但是因为朵拉喜欢自己探索,所以你只需要告诉她最小化的值。
输入
每个测试由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1≤t≤104 )–测试用例数。( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1≤t≤104 ) - 测试用例的数量。测试用例说明如下。
每个测试用例的第一行包含三个整数 n n n 、 a a a 和 b b b ( 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1≤n≤105 、 1 ≤ a , b ≤ 1 0 9 1 \leq a, b \leq 10^9 1≤a,b≤109 )–分别是数组 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 1≤ci≤109 ) - 数组 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;
}