标签:des style class blog code ext
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 8311 | Accepted: 2883 |
Description
"Buy low; buy lower"
Day 1 2 3 4 5 6 7 8 9 10 11 12 Price 68 69 54 64 68 64 70 67 78 62 98 87
Day 2 5 6 10 Price 69 68 64 62
Input
Output
Sample Input
12 68 69 54 64 68 64 70 67 78 62 98 87
Sample Output
4 2
哎,做这道题目的时候天知道我都经历了一些什么,终于过了,哭的心都有。
题意:求最长的下降序列的个数
想法:对于最长的下降序列可以用nlog(n)的算法,然后就是构图,x->y,找出哪些点x能到y,满足如果rank(y) = a,
则rank(x) = a-1; val(x)<val(y);id(x)<id(y),如果x点不同,那直接加边就好了,如果x点有相同的,取最近的那个,这样就不会有重算的,因为最近的那个肯定包含了最远的在里面了
#include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> #include <cstdio> #include <cmath> #include <map> #define N 5100 #define M 800010 #define INF 0x7ffffff using namespace std; struct num { int id,next; }a[M],b[M]; int c[N],d[N],sum[N],tag[N]; int e[N],f[N],Top1,Top2; bool ch[N],ch2[N]; map<int,int>ma; int main() { //freopen("data.txt","r",stdin); void addeage1(int x,int y); void addeage2(int x,int y); int dfs(int x,int pt); int binary_search(int l,int r,int val); int n; while(scanf("%d",&n)!=EOF) { ma.clear(); for(int i=n;i>=1;i--) { scanf("%d",&e[i]); ma[e[i]] = i; } e[n+1] = INF; ma[INF] = n+1; memset(c,-1,sizeof(c)); Top1 = 0; memset(d,-1,sizeof(d)); Top2 = 0; f[0] = -1; int Top = 0; addeage1(n+1,n+1); for(int i=1;i<=n;i++) { if(f[Top]<e[i]) { f[++Top] = e[i]; addeage1(Top,i); }else { int pos = binary_search(1,Top,e[i]); //第一个大于||等于 f[pos] = e[i]; addeage1(pos,i); } } int biao = 0; sum[biao++] = n+1; for(int i=Top;i>=1;i--) { int ttag = 0; memset(ch2,false,sizeof(ch2)); for(int j=0;j<=biao-1;j++) { memset(ch,false,sizeof(ch)); for(int u = c[i];u!=-1;u=a[u].next) { int id = a[u].id; if(id<sum[j]&&e[id]<e[sum[j]]&&!ch[ma[e[id]]]) { ch[ma[e[id]]] = true; addeage2(sum[j],id); if(!ch2[id]) { tag[ttag++] = id; ch2[id] = true; } } } } for(int j=0;j<=ttag-1;j++) { sum[j] = tag[j]; } biao = ttag; } memset(ch,false,sizeof(ch)); memset(sum,0,sizeof(sum)); int ans = dfs(n+1,Top); printf("%d %d\n",Top,ans); } return 0; } int binary_search(int l,int r,int val) { int pos; while(l<=r) { int mid = (l+r)/2; if(f[mid]>=val) { pos = mid; r = mid-1; }else { l = mid+1; } } return pos; } void addeage1(int x,int y) { a[Top1].id = y; a[Top1].next = c[x]; c[x] = Top1++; } void addeage2(int x,int y) { b[Top2].id = y; b[Top2].next = d[x]; d[x] = Top2++; } int dfs(int x,int pt) { if(pt==0) { return 1; } if(ch[x]) { return sum[x]; } int res = 0; for(int i=d[x];i!=-1;i=b[i].next) { res+=dfs(b[i].id,pt-1); } ch[x] = true; sum[x] = res; return res; }
POJ 1952 BUY LOW, BUY LOWER,布布扣,bubuko.com
标签:des style class blog code ext
原文地址:http://blog.csdn.net/yongxingao/article/details/32309139