原题
题目大意
题目是给出一系列区间,然后问有没有哪个区间是被其他区间包含的,输出被包含区间的序号和包含区间的序号.[l1,r1],[l2,r2],当l1>=l2,r2>=r1时,第一个区间被第二个区间包含.
题目分析
这里讲一下贪心做法,先把每个区间用结构体数组存起来,记得存id号,在对结构体里的left排序,排完序后用一个maxn记录右边界最大的区间的下标(刚开始maxn=1),从第二开始往下扫,如果区间右边界小于等于maxn区间的右边界,那么maxn区间可以是可以包含该区间的;如果区间右边界大于maxn区间的右边界,则得看看区间左边界是否与maxn左边界相等,如果不等则这两个区间没有包含关系.如果相等这该区间可以包含maxn区间.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 const int INF=0x3f3f3f3f; 12 using namespace std; 13 14 struct N 15 { 16 int id; 17 int l; 18 int r; 19 } f[300001]; 20 21 bool cmp(N a,N b) 22 { 23 return a.l<b.l; 24 } 25 26 int main() 27 { 28 int n; 29 cin>>n; 30 for(int i=1;i<=n;i++) scanf("%d%d",&f[i].l,&f[i].r),f[i].id=i; 31 sort(f+1,f+1+n,cmp); 32 //检测代码 33 /* 34 for(int i=1;i<=n;i++) 35 printf("id=%d,left=%d,right=%d\n",f[i].id,f[i].l,f[i].r); 36 */ 37 int maxn=1,ans=0,res=0; //如果没更新过则ans=res=0,用来判定是否为输出-1的情况. 38 for(int i=2;i<=n;i++) 39 { 40 if(f[maxn].r<f[i].r) 41 { 42 if(f[maxn].l==f[i].l) 43 { 44 ans=f[maxn].id,res=f[i].id; 45 break; 46 } 47 else maxn=i; 48 } 49 else 50 { 51 ans=f[i].id,res=f[maxn].id; 52 break; 53 } 54 } 55 if(!ans) cout<<-1<<' '<<-1<<endl; 56 else cout<<ans<<' '<<res<<endl; 57 return 0; 58 }