2020 CCPC Wannafly Winter Camp Day1 Div.1&2(I K小数查询)(水题)
时间限制:C/C++ 6秒,其他语言12秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
热爱学习刻苦奋斗的九条可怜最近做了很多数据结构题,接触到了
K
K
K 小数查询这一系列的问题以及线段树的重磅打击这一套理论,她觉得这两样东西都很厉害,所以想要出一道题。
给出一个长度为
n
{n}
n 的数列
A
{A}
A ,接下来有
m
{m}
m 次操作,操作有两种:
1
l
r
x
1\ l\ r\ x
1 l r x,表示对
i
∈
[
l
,
r
]
i \in [l,r]
i∈[l,r],令
A
i
=
min
(
A
i
,
x
)
A_i=\min(A_i,x)
Ai=min(Ai,x)
2
l
r
k
2\ l\ r\ k
2 l r k,表示询问区间
[
l
,
r
]
{[l,r]}
[l,r] 中第
k
{k}
k 小的数。
这个问题对可怜来说有点难,你能帮帮她吗。
输入描述:
第一行输入两个整数
n
,
m
(
1
≤
n
,
m
≤
8
×
1
0
4
)
n,m(1 \leq n,m \leq 8 \times 10^4)
n,m(1≤n,m≤8×104)。
接下来一行
n
{n}
n 个整数描述数组
A
(
1
≤
A
i
≤
n
)
A(1 \leq A_i \leq n)
A(1≤Ai≤n)。
接下来
m
{m}
m 行每行描述一个操作,操作格式与题面中相同,保证
1
≤
l
≤
r
≤
n
,
1
≤
k
≤
r
−
l
+
1
,
1
≤
x
≤
1
0
9
1 \leq l \leq r \leq n, 1 \leq k \leq r-l+1, 1 \leq x \leq 10^9
1≤l≤r≤n,1≤k≤r−l+1,1≤x≤109。
输出描述:
对于每组询问,输出一个整数表示答案。
示例1
输入
3 5
1 2 3
2 1 3 2
1 3 3 1
2 1 3 2
1 1 2 3
2 1 3 2
输出
2
1
1
题解
水题,不过利用一个数组找到第 k k k 个数还是第一次见到
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int a[maxn], p[maxn];
int main() {
//freopen("in.txt", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i < n + 1; ++i) scanf("%d", &a[i]);
while (m--) {
int op, l, r, t;
scanf("%d%d%d%d", &op, &l, &r, &t);
if (op == 1)
for (int i = l; i < r + 1; ++i)
a[i] = min(a[i], t);
else {
memset(p, 0, sizeof(p));
for (int i = l; i < r + 1; ++i) ++p[a[i]];
int tem = 0;
for (int i = 1; i < n + 1; ++i) {
tem += p[i];
if (tem >= t) {
printf("%d\n", i);
break;
}
}
}
}
return 0;
}