2019 GDUT WPTC 1 ProblemB(题解) codeforces 976C

原题

2019 GDUT WPTC 1 ProblemB(题解) codeforces 976C2019 GDUT WPTC 1 ProblemB(题解) codeforces 976C

题目大意

题目是给出一系列区间,然后问有没有哪个区间是被其他区间包含的,输出被包含区间的序号和包含区间的序号.[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 }

 

上一篇:python中函数作为反回值时


下一篇:FZU2105 Digits Count(按位建线段树)题解