记录编号 |
575606 |
评测结果 |
AAAAAAAAAA |
题目名称 |
嵌套矩形 |
最终得分 |
100 |
用户昵称 |
┭┮﹏┭┮ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2022-09-22 21:31:28 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,f[N],nx[N];
vector<int>q[N];
struct made{
int x,y,b;
}a[N];
bool cmp(made x,made y){
if(x.x == y.x)return x.y < y.y;
return x.x < y.x;
}
void init(){
//输入,以宽为x,长为y
scanf("%d",&n);
for(int i = 1;i <= n;i++){
int x,y;
scanf("%d%d",&x,&y);
a[i].x = min(x,y),a[i].y = max(x,y);
a[i].b = i;
}
//排序优化
sort(a+1,a+1+n,cmp);
}
int sou(int x,int s){
//没有包括它的就返回
if(q[x].size() == 0){
f[x] = 1;
return 1;
}
//ma为最大的长度,st为ma长度的初始下标
int ma = 1,st = x;
//遍历每一条出边
for(int i = 0;i < q[x].size();i++){
int ss = 0;
if(f[q[x][i]])ss = f[q[x][i]]+1;//记忆化
else ss = sou(q[x][i],s+1)+1;
//字典序
if(ss > ma){
ma = ss;
st = q[x][i];
}
else if(ss == ma && a[q[x][i]].b < a[st].b){
st = q[x][i];
}
}
nx[x] = st;//字典序
f[x] = ma;//记忆化
return ma;
}
void build() {
//建图
for(int i = 1;i <= n;i++){
for(int j = i+1;j <= n;j++){
if(a[i].x < a[j].x && a[i].y < a[j].y) {
q[i].push_back(j);
}
}
}
}
void dfs(){
//枚举每个初始包括点,倒序保证记忆化
//ma为最大的长度,st为ma长度的初始下标
int ma = 1,st = n;
for(int i = n;i >= 1;i--){
int ss = sou(i,1);
//字典序
if(ss > ma){
ma = ss;st = i;
}
else if(ss == ma && a[i].b < a[st].b){
st = i;
}
}
printf("%d\n",ma);
//字典序,因为排序所以输出a[x].b,st存的是排序过后的下标,要转化为排序前下标
cout<<a[st].b;
while(nx[st] != 0){
cout<<' '<<a[nx[st]].b;
st = nx[st];
}
printf("\n");
}
int main(){
freopen("qiantao.in","r",stdin);
freopen("qiantao.out","w",stdout);
init();
build();
dfs();
return 0;
}