P2782 友好城市

乌古娜黑暗之神超级无敌传送门嘤嘤嘤
emmmmm首先看到这道题的时候,由于两个数组的一一对应关系,很显然可以想到用结构体存储
又因为解题与读入顺序无关,那么会想到按照一条岸作为关键字进行排序,那么排完序后,我们得到了一个有序数列和一个无序数列
由于航线不能交叉,那么假设在有序数列中的城市a必然连接着无序数列中与有序数列中a前的城市及a后的城市相连的两个城市中间(好吧我承认有点绕),简而言之,就是求无序数列的最长上升(不下降)子序列,因为这题不会出现两个相同城市,so上升和不下降在这题是没有区别的
那么下面贴上代码嘻嘻:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int n,ans=1;
 9 int d[200005];
10 struct node{
11     int z,y;
12 }a[200005];
13 
14 bool cmp(node a,node b){
15     return a.z<b.z;
16 }
17 
18 int main(){
19     scanf("%d",&n);
20     for(int i=1;i<=n;i++){
21         scanf("%d%d",&a[i].z,&a[i].y);
22     }
23     sort(a+1,a+1+n,cmp);
24     d[1]=a[1].y;
25     for (int i=2;i<=n;i++){
26         if (a[i].y>=d[ans]){
27             d[++ans]=a[i].y;
28         }
29         else{
30             int j=upper_bound(d+1,d+ans+1,a[i].y)-d;//lower_bonud
31             d[j]=a[i].y; 
32         }
33     }
34     printf("%d\n",ans);
35     return 0;
36 }

恩,那就酱紫,白白~~

哦对了,新人开博鼓励一下吧。。

posted @ 2019-07-02 21:25  喵呜,颜儿ღ  阅读(91)  评论(0编辑  收藏  举报