1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <iostream> #include <utility> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <unordered_map> #include <unordered_set> #include <algorithm> #include <numeric>
#include <fstream>
using namespace std;
istream &in = cin; ostream &out = cout;
bool beautiful(int n, int mid, vector<pair<int, int>>& segments, vector<int>& ops) { vector<int> nums(n, 0); for (int i = 0; i <= mid; i++) { nums[ops[i] - 1] = 1; } vector<int> preSum(n + 1, 0); for (int i = 0; i < n; i++) { preSum[i + 1] = preSum[i] + nums[i]; } for (auto& s : segments) { int l = s.first - 1; int r = s.second; int length = r - l; if (2 * (preSum[r] - preSum[l]) > length) { return true; } } return false; }
void solve(int n, vector<pair<int, int>>& segments, vector<int>& ops) { int left = 0, right = ops.size(); while (left < right) { int mid = (right - left) / 2 + left; if (beautiful(n, mid, segments, ops)) { right = mid; } else { left = mid + 1; } } out << (left == ops.size() ? -1 : left + 1) << endl; }
int main() { int tc; in >> tc; for (int t = 1; t <= tc; t++) { int m, n; in >> n >> m; vector<pair<int, int>> segments; for (int i = 0; i < m; i++) { int l, r; in >> l >> r; segments.push_back({l, r}); } int q; in >> q; vector<int> ops; for (int i = 0; i < q; i++) { int x; in >> x; ops.push_back(x); } solve(n, segments, ops); } return 0; }
|