使用一个set维护当前被占用的点。每次插入/删除的时候检查是否值域在[1,x] , [y , n]内,更新答案,每次输出即可。
t = int(input())
for _ in range(t):
n , m , x , y = map(int , input().split())
ans1 , ans2 = 0 , 0
st = set()
for i in range(m):
p = int(input())
if p not in st:
st.add(p)
if p <= x:
ans1 += 1
if p >= y:
ans2 += 1
else:
st.remove(p)
if p <= x:
ans1 -= 1
if p >= y:
ans2 -= 1
print(x - ans1 , n - y + 1 - ans2)
OJ会员可以通过点击题目上方《已通过》查看其他通过代码来学习。
已知小红有n份资源,编号为1,2,...,n初始均处于未上锁状态。
m次操作,每一次操作给出一个编号p,如果p所对应的资源未上锁,则为其上锁;否则,解除锁,使其回到未上锁状态;
每一次操作之后,小红都希望分别统计闭区间[1,x],[y,n]中可访问的资源数量。
这里规定,一个资源可访问,当且仅当其处于未上锁状态。
本题为多组测试数据,第一行输入一个正整数T(1≤T≤1000)代表测试数据的组数。
对于每组测试数据,第一行输入四个正整数
n,m,x,y(1≤n≤2×105;1≤m≤4×105;1≤x,y≤n),依次代表资源数量,操作次数,以及两个闭区间范围的边界。
接下去m行,每行输入一个正整数p(1≤p≤n),代表对编号为P的资源进行操作。
题目保证,所有测试数据的n之和不会超过2×105,m之和不会超过4×105。
对于每一个操作,一行输出两个整数,第一个整数代表闭区间[1,x]中可访问的资源数量;第二个整数代表闭区间[y,n]中可访问的资源数量。
输入
2
4 3 2 3
2
3
3
6 6 4 2
1
3
6
4
4
2
输出
1 2
1 1
1 2
3 5
2 4
2 3
1 2
2 3
1 2
说明
用y表示资源上锁,n表示资源未上锁。
以第一组测试数据为例:
第一次操作后,资源上锁情况为:n,y,n,n,可以发现,区间[1,2]中只有编号1可访问,而区间[3,4]均未上锁,所以输出1 2;
第二次操作后,资源上锁情况为:n,y,y,n,可以发现,区间[1,2]情况不变,区间[3,4]中只剩下编号4可访问,所以输出1 1;
第三次操作,将资源3解锁,重新回到了第一次操作后的状态,因此输出与第一次操作后的输出相同,输出1 2。