裸的匹配题,下午做比赛的时候算错了复杂度,以为匈牙利会超时,当时还想怎么离散化坐标。唉,真是图样图森破了啊,两道图论水题都没出,可惜了……
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 65
vector<int> g[MAXN],ans;
int match[100005]; //第一次交的时候这里开小了,RE了一次
bool vis[100005];
bool dfs(int k)
{
for(int i=0;i<g[k].size();i++)
{
int j=g[k][i];
if(!vis[j])
{
vis[j]=true;
if(!match[j]||dfs(match[j]))
{
match[j]=k;
return true;
}
}
}
return false;
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++)
g[i].clear();
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
for(int j=x;j<=y;j++)
{
g[i].push_back(j);
}
}
int tot=0;
ans.clear();
for(int i=n;i;i--)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
{
tot++;
ans.push_back(i);
}
}
printf("%d\n",tot);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
if(i)
printf(" %d",ans[i]);
else printf("%d",ans[i]);
printf("\n");
}
}