一、AcWing 799. 最长连续不重复子序列
【题目描述】 给定一个长度为
n
n
n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
【输入格式】 第一行包含整数
n
n
n。 第二行包含
n
n
n个整数(均在
0
~
1
0
5
0\sim 10^5
0~105范围内),表示整数序列。
【输出格式】 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
【数据范围】
1
≤
n
≤
1
0
5
1≤n≤10^5
1≤n≤105
【输入样例】
5
1 2 2 3 5
【输出样例】
3
【代码】
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], s[N];
int n;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
int res = 0;
for (int i = 0, j = 0; i < n; i++)
{
s[a[i]]++;
while (s[a[i]] > 1)
{
s[a[j]]--;
j++;
}
res = max(res, i - j + 1);
}
printf("%d\n", res);
return 0;
}
二、AcWing 800. 数组元素的目标和
【题目描述】 给定两个升序排序的有序数组
A
A
A和
B
B
B,以及一个目标值
x
x
x。 数组下标从
0
0
0开始。 请你求出满足
A
[
i
]
+
B
[
j
]
=
x
A[i]+B[j]=x
A[i]+B[j]=x的数对
(
i
,
j
)
(i,j)
(i,j)。 数据保证有唯一解。
【输入格式】 第一行包含三个整数
n
,
m
,
x
n,m,x
n,m,x,分别表示
A
A
A的长度,
B
B
B的长度以及目标值
x
x
x。 第二行包含
n
n
n个整数,表示数组
A
A
A。 第三行包含
m
m
m个整数,表示数组
B
B
B。
【输出格式】 共一行,包含两个整数
i
i
i和
j
j
j。
【数据范围】 数组长度不超过
1
0
5
10^5
105。 同一数组内元素各不相同。
1
≤
数
组
元
素
≤
1
0
9
1≤数组元素≤10^9
1≤数组元素≤109
【输入样例】
4 5 6
1 2 4 7
3 4 6 8 9
【输出样例】
1 1
【代码】
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], b[N];
int n, m, x;
int main()
{
scanf("%d%d%d", &n, &m, &x);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < m; i++) scanf("%d", &b[i]);
for (int i = 0, j = m - 1; i < n; i++)
{
while (j >= 0 && a[i] + b[j] > x) j--;
if (a[i] + b[j] == x)
{
printf("%d %d\n", i, j);
break;
}
}
return 0;
}
三、AcWing 2816. 判断子序列
【题目描述】 给定一个长度为
n
n
n的整数序列
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots ,a_n
a1?,a2?,…,an?以及一个长度为
m
m
m的整数序列
b
1
,
b
2
,
…
,
b
m
b_1,b_2,\dots ,b_m
b1?,b2?,…,bm?。 请你判断
a
a
a序列是否为
b
b
b序列的子序列。 子序列指序列的一部分项按原有次序排列而得的序列,例如序列
{
a
1
,
a
3
,
a
5
}
\left\{ a_1,a_3,a_5\right\}
{a1?,a3?,a5?}是序列
{
a
1
,
a
2
,
a
3
,
a
4
,
a
5
}
\left\{ a_1,a_2,a_3,a_4,a_5\right\}
{a1?,a2?,a3?,a4?,a5?}的一个子序列。
【输入格式】 第一行包含两个整数
n
,
m
n,m
n,m。 第二行包含
n
n
n个整数,表示
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots ,a_n
a1?,a2?,…,an?。 第三行包含
m
m
m个整数,表示
b
1
,
b
2
,
…
,
b
m
b_1,b_2,\dots ,b_m
b1?,b2?,…,bm?。
【输出格式】 如果
a
a
a序列是
b
b
b序列的子序列,输出一行Yes 。 否则,输出No 。
【数据范围】
1
≤
n
≤
m
≤
1
0
5
1≤n≤m≤10^5
1≤n≤m≤105
?
1
0
9
≤
a
i
,
b
i
≤
1
0
9
?10^9≤a_i,b_i≤10^9
?109≤ai?,bi?≤109
【输入样例】
3 5
1 3 5
1 2 3 4 5
【输出样例】
Yes
【代码】
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int a[N], b[N];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < m; i++) scanf("%d", &b[i]);
int i = 0, j = 0;
while (i < n && j < m)
{
if (a[i] == b[j]) i++;
j++;
}
if (i == n) puts("Yes");
else puts("No");
return 0;
}
|