n个区间[li , ri],最少删除多少个区间,使得任何三个区间都不两两相交。
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <vector>
#include <algorithm>
struct Line{
int left , right , idx ;
Line(){} ;
Line(int left , int right , int idx){
this->left = left ;
this->right = right ;
this->idx = idx ;
}
};
Line lines[50008] ;
bool withLeftfromLessToBig(Line first , Line second) {
return first.left < second.left ;
}
bool withRightfromBigToLess(Line first , Line second) {
return second.right < first.right ;
}
bool intersect(Line a , Line b , Line c){
return b.left <= a.right && c.left <= b.right && c.left <= a.right ;
}
void solve() {
int t , n , l , r ;
scanf("%d" , &t) ;
while (t-- > 0) {
scanf("%d" , &n) ;
for(int i = 0 ; i < n ; i++){
scanf("%d%d" , &l , &r) ;
lines[i] = Line(l , r , i+1) ;
}
if(n <= 2){
puts("") ;
continue ;
}
std::vector<int> res;
std::sort(lines , lines + n ,withLeftfromLessToBig) ;
Line g[3] ;
g[0] = lines[0] ;
g[1] = lines[1] ;
for(int i = 2 ; i < n ; i++){
g[2] = lines[i] ;
std::sort(g , g + 3 , withLeftfromLessToBig) ;
bool isIntersect = intersect(g[0] , g[1] , g[2]) ;
std::sort(g , g + 3 , withRightfromBigToLess) ;
if(isIntersect){
res.push_back(g[0].idx) ;
g[0] = g[2] ;
}
}
std::sort(res.begin() , res.end()) ;
if(! res.empty()){
int size = res.size() ;
printf("%d\n" , size) ;
printf("%d" , res[0]) ;
for(int i = 1 ; i < size ; i++){
printf(" %d" , res[i]) ;
}
}
puts("") ;
}
}
int main(){
solve() ;
return 0;
}