本来觉得这不是经典的贪心吗。。果断水一次,wa了,看了看discuss,发现貌似不好水,土土的DP了一下,复杂度很高了,又T了。。。然后想想单调队列,二分什么的。。。不好往上加,直接搞了标记数组flag,暴力从大到小,遍历寻找,然后就过了。。。这算是优化吗,瞎搞。。。
1 #include <cstring> 2 #include <cstdio> 3 #include <string> 4 #include <iostream> 5 #include <algorithm> 6 #include <cmath> 7 using namespace std; 8 struct node 9 { 10 int x,y; 11 }p[100001]; 12 int dp[100001]; 13 int flag[100001]; 14 int cmp(node a,node b) 15 { 16 if(a.x == b.x) 17 return a.y < b.y; 18 else 19 return a.x < b.x; 20 } 21 int main() 22 { 23 int n,i,j,ans,maxz,top; 24 scanf("%d",&n); 25 for(i = 0;i < n;i ++) 26 { 27 scanf("%d%d",&p[i].x,&p[i].y); 28 } 29 memset(flag,-1,sizeof(flag)); 30 sort(p,p+n,cmp); 31 ans = 1; 32 dp[0] = 1; 33 flag[1] = p[0].y; 34 top = 1; 35 for(i = 1;i < n;i ++) 36 { 37 maxz = 0; 38 for(j = top;j >= 1;j --) 39 { 40 if(p[i].x > flag[j]) 41 { 42 maxz = j; 43 break; 44 } 45 } 46 dp[i] = maxz + 1; 47 if(flag[maxz+1] == -1) 48 { 49 flag[maxz+1] = p[i].y; 50 top ++; 51 } 52 else 53 flag[maxz+1] = min(flag[maxz+1],p[i].y); 54 } 55 printf("%d\n",top); 56 }