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 }
恩,那就酱紫,白白~~
哦对了,新人开博鼓励一下吧。。