题意:
给你n个区间,然后任意三个连续的区间不能两两相交,问满足这样的情况需要删去的最少区间数量以及编号。
题解:
首先按L 升序排序 然后三个三个判断,如果三个相交,那么删去R 最大的那条边,这样向后推移的时候,就尽可能避免了相交的情况。达到最优。
开始理解错题意,以为如果一个区间包含别的区间,就删除,,,,,超时。。。。
#include<string>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#define ll long long
#define x first
#define y second
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int mod=11;
const int maxn=50050;
struct node{
int l,r,id;
}p[maxn],t[5];
int vis[maxn];
int cmp(node a,node b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int cmp2(node a,node b){
return a.r>b.r;
}
int judge(node x,node y,node z){
int f1=y.l<=x.r;
int f2=(z.l<=x.r)&&(z.l<=y.r);
return f1&&f2;
}
int ans[maxn];
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d %d",&p[i].l,&p[i].r),p[i].id=i;
sort(p+1,p+n+1,cmp);
int cnt=1;
t[1]=p[1],t[2]=p[2];
for(int i=3;i<=n;++i){
t[3]=p[i];
sort(t+1,t+4,cmp);
int f=judge(t[1],t[2],t[3]);
//printf("%d %d %d \n",t[i].id,t[2].id,t[3].id);
sort(t+1,t+4,cmp2);
if(f){
ans[cnt++]=t[1].id;
swap(t[1],t[3]);
}
}
printf("%d\n",cnt-1);
sort(ans+1,ans+cnt);
if(cnt>1){
for(int i=1;i<cnt-1;++i)
printf("%d ",ans[i]);
printf("%d\n",ans[cnt-1]);
}
}
return 0;
}