烏古娜黑暗之神超級無敵傳送門嚶嚶嚶
emmmmm首先看到這道題的時候,因爲兩個數組的一一對應關係,很顯然能夠想到用結構體存儲
又由於解題與讀入順序無關,那麼會想到按照一條岸做爲關鍵字進行排序,那麼排完序後,咱們獲得了一個有序數列和一個無序數列
因爲航線不能交叉,那麼假設在有序數列中的城市a必然鏈接着無序數列中與有序數列中a前的城市及a後的城市相連的兩個城市中間(好吧我認可有點繞),簡而言之,就是求無序數列的最長上升(不降低)子序列,由於這題不會出現兩個相同城市,so上升和不降低在這題是沒有區別的
那麼下面貼上代碼嘻嘻:node
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 }
恩,那就醬紫,白白~~ios
哦對了,新人開博鼓勵一下吧。。數組