Lara Croft and the New Game CodeForces - 976B 水题排序
You are given a sequence a1, a2, ..., an of one-dimensional segments numbered 1through n. Your task is to find two distinct indices i and j such that segment ailies 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.
Output
Print 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.
Examples
5
1 10
2 9
3 9
2 3
2 9
2 1
3
1 5
2 6
6 20
-1 -1
Note
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.
关于cmp的写法我博客有专门文章讲
#include<stdio.h> #include<string.h> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define LL long long int const int N = 1e5 + 7; const int MOD = 1e9+7; struct point { LL l,r,index; bool operator < (const point &tmp) const { return l == tmp.l ? r > tmp.r : l < tmp.l; } } num[300004]; int main() { LL n; cin>>n; for(LL i=0; i<n; i++) { scanf("%lld %lld",&num[i].l,&num[i].r); //cin>>num[i].l>>num[i].r; num[i].index = i + 1; } //cout<<"1"<<endl; sort(num,num+n); LL i1=-1,i2=-1; for(LL i=1; i<n; i++) { if(num[i-1].r >= num[i].r ) { i1 = num[i-1].index; i2 = num[i].index; break; } } cout<<i2<<" "<<i1<<endl; }