#include<iostream> #include<sstream> #include<string> #include<vector> #include<list> #include<set> #include<map> #include<stack> #include<queue> #include<algorithm> #pragma warning(disable:4996) #include<cstdio> #include<cstdlib> using std::cin; using std::cout; using std::endl; using std::stringstream; using std::string; using std::vector; using std::list; using std::pair; using std::set; using std::multiset; using std::map; using std::multimap; using std::stack; using std::queue; using std::priority_queue; vector<int> dfs(vector<int>&line, const vector<pair<int, int>>&segment, int i) { vector<int>count; for (; i < segment.size(); i++) { vector<int>temp; //如果除去这个段,仍能保证区间上所有数都被覆盖 if (std::all_of(line.begin() + segment[i].first, line.begin() + segment[i].second + 1, [](int i) {return i >1; })) { //那么区间的段上的都-1 for (int j = segment[i].first; j <= segment[i].second; j++) { line[j]--; } temp = dfs(line, segment, i + 1); temp.push_back(i); //回溯--恢复现场 for (int j = segment[i].first; j <= segment[i].second; j++) { line[j]++; } } count = count.size() > temp.size() ? count : temp; } return count; } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int T; while (cin >> T) { while (T--) { int n; if (cin >> n) { ; } else { break; } vector<pair<int, int>>segment; map<pair<int, int>, pair<int, int>>Map; int left, right; while (cin >> left >> right) { if (!left&&!right) { break; } if (right<0 || left>n) { continue; } segment.push_back({ std::max(0,left),std::min(n,right) }); Map.insert({ { std::max(0,left),std::min(n,right) },{ left,right } }); } std::sort(segment.begin(), segment.end()); auto iter = std::unique(segment.begin(), segment.end()); segment.resize(iter - segment.begin()); vector<int>line(n + 1); for (size_t i = 0; i < segment.size(); i++) { for (left = segment[i].first; left <= segment[i].second; left++) { line[left]++; } } if (std::any_of(line.begin(), line.end(), [](int i) {return i == 0; })) { cout << '0' << endl; if (T) { cout << endl; } continue; } auto count = dfs(line, segment, 0); cout << segment.size() - count.size() << endl; vector<bool>hash(segment.size()); for (size_t i = 0; i < count.size(); i++) { hash[count[i]] = true; } for (size_t i = 0; i < hash.size(); i++) { if (!hash[i]) { cout << Map[segment[i]].first << ' ' << Map[segment[i]].second << endl; } } if (T) { cout << endl; } } } return 0; }