You are given a sequence a1, a2, ..., an of one-dimensional segments numbered 1 through n. Your task is to find two distinct indices i and j such that segment ai lies within segment aj.
Segment [l1, r1] lies within segment [l2, r2] iff l1 ≥ l2 and r1 ≤ r2.
Print indices i and j. If there are multiple answers, print any of them. If no answer exists, print -1 -1.
Input
The first line contains one integer n (1 ≤ n ≤ 3·105) — the number of segments.
Each of the next n lines contains two integers li and ri (1 ≤ li ≤ ri ≤ 109) — the i-th segment.
OutputPrint two distinct indices i and j such that segment ai lies within segment aj. If there are multiple answers, print any of them. If no answer exists, print -1 -1.
Examples5 1 10 2 9 3 9 2 3 2 9
2 1
3 1 5 2 6 6 20
-1 -1
In the first example the following pairs are considered correct:
- (2, 1), (3, 1), (4, 1), (5, 1) — not even touching borders;
- (3, 2), (4, 2), (3, 5), (4, 5) — touch one border;
- (5, 2), (2, 5) — match exactly.
emm这题就是结构体排序先按照他们所给定的l值从小到大排序然后l值相等的就按照r排序......这样子刚开始设定的是lrid都是1的 ,然后....就是遍历一下2开始的结构体 看看 后面那个是否在我们设定的u的里面 或者说看看 我们设定的u是够在 这个遍历的结构体里面如果有就直接输出吧
要是没有的话 l 有两种情况是在我们假定的u的范围里面 还有一种是在u外面
1. 如果是在u的外面那么 这个u也就没有用了直接更新 新的
2.如果l在里面的话 因为这个l一定比那个u的l大 那么就看他的r 如果r比 u的r小 已经被输出了 所以就是在外面 ....... 同样 这样子 也不可能再有东西在这个里面了 其中要注意的就是当n==1的时候 是输出-1-1这边我输出1 1 wa了两发
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn = 3*1e5+100;
struct node{
int l,r;
int id;
}s[maxn];
bool cmp(node a,node b){
if(a.l!=b.l) return a.l<b.l;
else return a.r<b.r;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d%d",&s[i].l,&s[i].r);
s[i].id = i;
}
sort(s+1,s+1+n,cmp);//保证了后面的l一定是大于前面的l0
if(n==1){
printf("-1 -1\n");//这边我还以为是直接输出1 1 结果不是~~~
return 0;
}
int l = s[1].l;
int r = s[1].r;
int u = s[1].id;
for(int i = 2;i<=n;i++)
{
if(s[i].l>=l&&s[i].r<=r)
{
printf("%d %d\n",s[i].id,u);
return 0;
}//这个肯定要放在前面
else if(s[i].l==l&&s[i].r>=r){
printf("%d %d\n",u,s[i].id);
return 0;
}else if(s[i].l>=r)// l在边界外面
{
l = s[i].l;
r= s[i].r;
u = s[i].id;
}else if(s[i].r>r)
{
l = s[i].l;
r= s[i].r;
u = s[i].id;
}
}
printf("-1 -1\n");
return 0;
}