Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
map,vector飘过......#include <iostream> #include <vector> #include <map> using namespace std; int dp[5001]; int value[5001]; int ans; map<pair<int,int>,int> m; vector<int> vec[66000]; int Max(int a,int b){ return (a>b)? a:b; } void GetAns(int n){ int cnt=0; int D[5001]; for (int i=0;i<n;i++){ if (cnt && D[cnt]>value[i]) D[++cnt]=value[i],dp[i]=cnt; else if (!cnt) D[++cnt]=value[i],dp[i]=1; else { int left=1,right=cnt,mid; while (left<=right){ mid=(left+right)/2; if (D[mid]<=value[i]) right=mid-1; else left=mid+1; } D[left]=Max(D[left],value[i]); dp[i]=left; } } ans=cnt; } int main() { int n,i,j;cin>>n; for (i=0;i<n;i++) scanf("%d",value+i); GetAns(n); for (i=0;i<n;i++){ vec[value[i]].clear(); for (j=0;j<i;j++){ if (value[j]>value[i] && dp[j]==dp[i]-1){ if ( vec[value[i]].empty() || value[j]>vec[value[i]].back()) vec[value[i]].push_back(value[j]); } } int size=vec[value[i]].size(); int temp=0; for (j=0;j<size;j++) temp+=m[make_pair(vec[value[i]][j],dp[i]-1)]; if (dp[i]==1) { if (m.find(make_pair(value[i],1))==m.end()) m.insert(make_pair(make_pair(value[i],1),1)); }else { pair<int,int> p=make_pair(value[i],dp[i]); if (m.find(p)==m.end()) m.insert(make_pair(p,temp)); else m[p]=temp; } } int Cnt=0; map<pair<int,int>,int> ::iterator e,End=m.end(); for (e=m.begin();e!=End;e++) if (e->first.second==ans) Cnt+=e->second; cout<<ans<<' '<<Cnt<<endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator