这道题的题意就不解释了,建图比较抽象,刚开始时按照常规建图,结果就TLE了,然后想着离散化,最后得到的结果还是wrong,上网看了一下别人的构思,之后在原有的基础上改改就AC了。
以下是我的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
const int N=106000;
int n1,n2;
bool vis[N];
int llink[N];
struct node {
int st;
int ed;
};
node point[100];
int n;
stack<int >p;
int find(int x) {
int i;
for(i=point[x].st; i<=point[x].ed; i++) {
if(!vis[i]) {
vis[i]=true;
if(llink[i]==-1||find(llink[i])) {
llink[i]=x;
return true;
}
}
}
return false;
}
int mach() {
int ans=0;
memset(llink,-1,sizeof(llink));
for(int i=n; i>=1; i--) {
memset(vis,false,sizeof(vis));
if(find(i)) {
p.push(i);
ans++;
}
}
return ans;
}
int main() {
int T;
int x,y;
bool temp[N];
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d%d",&point[i].st,&point[i].ed);
}
int ans=mach();
printf("%d\n",ans);
if(ans==0) {
continue;
}
printf("%d",p.top());
p.pop();
while(!p.empty()) {
printf(" %d",p.top());
p.pop();
}
printf("\n");
}
return 0;
}