题目表述不是特别好而且数据没有给全,比如m的数据规模没有给出。
正向的时间复杂度是
后缀数组+差分
实际上影响因子只有最末敌对最大点,也即:如果一个人后面没有比他更大的另一个队伍的人,那么他一定能活下来。
故从后往前看只需要不断锚定最大的点,逐步更新计数即可。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 1e6 + 7; const int N = 50005; int a[N], b[N], v[N], mx[2], c; int main() { ll n, m, T; cin >> T; while (T--) { cin >> n >> m; fill(v, v + N, 0); for (int i = 1; i <= n; ++i) cin >> a[i] >> b[i]; for (int i = 1; i <= m; ++i) cin >> c, ++v[c]; mx[a[n]] = b[n] + v[n]; //最后一人所属队伍的最大值 mx[!a[n]] = 0; //另一队所属队伍的最大值 int cnt = 1; //最后一个人一定能活下来 for (int i = n - 1; i; --i) { v[i] += v[i + 1]; if (v[i] + b[i] >= mx[!a[i]]) ++cnt; mx[a[i]] = max(mx[a[i]], v[i] + b[i]); //更新所属队伍最大值 } cout << cnt << endl; } return 0; }