题 目 中 有 两 种 情 况 题目中有两种情况 题目中有两种情况

一 种 是 偶 数 位 置 大 于 相 邻 的 数 , 另 一 种 是 小 于 , 这 里 只 讨 论 大 于 的 情 况 一种是偶数位置大于相邻的数,另一种是小于,这里只讨论大于的情况 一种是偶数位置大于相邻的数,另一种是小于,这里只讨论大于的情况

因 为 另 一 种 情 况 是 对 称 的 因为另一种情况是对称的 因为另一种情况是对称的

a 1 < b 1 > a 2 < b 2 > a 3 < b 3 . . . . . . . . . a_1<b_1>a_2<b_2>a_3<b_3......... a1<b1>a2<b2>a3<b3.........

容 易 发 现 , 这 种 情 况 下 每 对 数 应 该 满 足 a i < b i , 于 是 我 们 删 去 其 中 一 些 数 容易发现,这种情况下每对数应该满足a_i<b_i,于是我们删去其中一些数 容易发现,这种情况下每对数应该满足ai<bi,于是我们删去其中一些数

那 接 下 来 怎 么 放 置 最 优 呢 ? 那接下来怎么放置最优呢? 那接下来怎么放置最优呢?

因 为 每 一 组 数 满 足 a i < b i , 所 以 现 在 我 们 应 该 满 足 b i > a i + 1 因为每一组数满足a_i<b_i,所以现在我们应该满足b_i>a_{i+1} 因为每一组数满足ai<bi,所以现在我们应该满足bi>ai+1

容 易 发 现 , 当 按 照 每 组 数 的 b i 从 大 到 小 排 序 时 一 定 满 足 条 件 容易发现,当按照每组数的b_i从大到小排序时一定满足条件 容易发现,当按照每组数的bi从大到小排序时一定满足条件

因 为 此 时 b i > b i + 1 > a i + 1 , 就 一 定 满 足 大 小 关 系 , 而 且 可 以 全 部 放 置 因为此时b_i>b_{i+1}>a_{i+1},就一定满足大小关系,而且可以全部放置 因为此时bi>bi+1>ai+1,就一定满足大小关系,而且可以全部放置

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int n;
struct p{
int l,r,num;
}a[maxn];
struct dd{
bool operator () (p a,p b){
return a.r<b.r;
}
};
struct ss{
bool operator () (p a,p b){
return a.r>b.r;
}
};
priority_queue<p,vector<p>,dd >q;
priority_queue<p,vector<p>,ss >e;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].l>>a[i].r;
a[i].num=i;
if(a[i].l>a[i].r) e.push(a[i]);
else q.push(a[i]);
}
if(q.size()>e.size())//
{
cout<<q.size()<<endl;
while(!q.empty())
{
cout<<q.top().num<<" ";
q.pop();
}
}
else
{
cout<<e.size()<<endl;
while(!e.empty())
{
cout<<e.top().num<<" ";
e.pop();
}
}
}