#define MAX(a, b) (a > b ? a : b) #define MIN(a, b) (a < b ? a : b)
long n, m1, m2, num[100005], sum[100005]; long a, b; multiset<long, less<long>> subarr;
intmain(){ cin >> n >> m1 >> m2; for(int i = 1; i <= n; i++) { cin >> num[i]; sum[i] = num[i] + sum[i - 1]; }
subarr.insert(num[1]); int l = 1, r = 1; while (l <= n && r <= n && l <= r) { long ans = *(--subarr.end()) - *subarr.begin(); if (m1 <= ans && ans <= m2) { if (r - l + 1 > a) { a = r - l + 1; b = sum[r] - sum[l - 1]; } elseif (r - l + 1 == a) { b = MAX(b, sum[r] - sum[l - 1]); } subarr.insert(num[++r]); } elseif (ans > m2) { subarr.erase(subarr.find(num[l++])); } elseif (ans < m1) { subarr.insert(num[++r]); } }
cout << a << ' ' << b << endl; return0; }
题目描述•其二
设B = {b1, b2, …, bn} 和 W = {w1, w2, …, wn}分别为平面上黑点和白点的两个集合。一黑点bi = (xi, yi) 与一白点wj = (xj, yj) 匹配当且仅当 xi <= xj 和 yi <= yj 同时成立,每个点最多只能用于一次匹配,请找出黑白点之间的最大匹配数目。
黑点和白点各自的数量均不超过100000;
平面为(0, 0)到(10000, 10000)的矩形中的整数点
黑点白点坐标可能相同,B集合、W集合中也可能包含相同的元素
输入的第一行包括一个整数T (1 <= T <= 10),表示有T组测试数据. 对于每组测试数据: 第一行两个整数,n(黑点个数) m(白点个数),0 < n, m <= 100000 接下来n行每行有两个整数并用空格隔开: 黑点的横坐标x 黑点的纵坐标y 再接下来m行每行有两个整数同样用空格隔开: 白点的横坐标x 白点的纵坐标y