1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
using namespace std; #define forl(i, l, r) for (int i = l; i <= r; i++) #define forr(i, r, l) for (int i = r; i >= l; i--) #define for1(i, n) for (int i = 1; i <= n; i++) #define fro1(i, n) for (int i = 1; i <= n; i++) #define for0(i, n) for (int i = 0; i < n; i++) #define fro0(i, n) for (int i = 0; i < n; i++) #define meminf(a) memset(a, inf, sizeof(a)) #define mem_1(a) memset(a, -1, sizeof(a)) #define mem0(a) memset(a, 0, sizeof(a)) #define memcp(a,b) memcpy(a,b,sizeof(b)) #define oper(type) bool operator <(const type y)const #define mp make_pair #define pu_b push_back #define pu_f push_front #define po_b pop_back #define po_f pop_front #define fi first #define se second #define whiel while #define retrun return typedef pair<long long, long long> pll; typedef vector<long long> vll; typedef pair<int, int> pii; typedef unsigned long long ull; typedef vector<int> vii; typedef double db; typedef long long ll; typedef int itn; int (int &a,int &b,int &c,int &d){return scanf("%d%d%d%d",&a,&b,&c,&d);} int (int &a,int &b,int &c){return scanf("%d%d%d",&a,&b,&c);} int (int &a,int &b){return scanf("%d%d",&a,&b);} int (ll &a){return scanf("%lld",&a);} int (int &a){return scanf("%d",&a);} int in(char *s){return scanf("%s",s);} int in(char &s){return scanf("%c",&s);} int in(db &a){return scanf("%lf",&a);} void out(int a){printf("%d ",a);} void outln(int a){printf("%dn",a);} void out(ll a){printf("%lld ",a);} void outln(ll a){printf("%lldn",a);} const db pi = acos((db)-1); const ll inf =0x3f3f3f3f; const db eps = 1e-8; const int N = 3.1e5; const int M = 2.1e5; const ll mod = 1e9+7; int sign(db a) { return a < -eps ? -1 : a > eps;} int db_cmp(db a, db b){ return sign(a-b); }
int a[N],f[N],g[N],pre[N],ans[N]; int main() { #ifdef PerpEternal #endif int n; while(~in(n)){ for1(i,n)in(a[i]); int len=0; for1(i,n){ int posi=upper_bound(pre+1,pre+1+len,a[i])-pre; if(posi==len+1){ if(a[i]>pre[len]){ pre[++len]=a[i]; f[i]=len; }else f[i]=len; }else{ if(a[i]>pre[posi-1]){ pre[posi]=a[i]; f[i]=posi; }else{ f[i]=posi-1; } } } len=0; for1(i,n){ int j=n-i+1; int posi=upper_bound(pre+1,pre+1+len,a[j])-pre; if(posi==len+1){ if(a[j]>pre[len]){ pre[++len]=a[j]; g[j]=len; }else g[j]=len; }else{ if(a[j]>pre[posi-1]){ pre[posi]=a[j]; g[j]=posi; }else{ g[j]=posi-1; } } } int maxx=0,Fi=0,La=0; for1(i,n)maxx=max(maxx,f[i]+g[i]-1); for1(i,n){ if(f[i]+g[i]-1==maxx){ if(!Fi)Fi=i; La=i; } }
int tail=f[Fi]; ans[tail]=Fi; for(int i=Fi-1;i>0;i--){ if(f[i]+1>=tail&&f[i]<f[Fi]){ if(a[ans[f[i]+1]]>a[i]){ tail=f[i]; ans[f[i]]=i; } } } tail=f[Fi]; for(int i=Fi+1;i<=n;i++){ if(a[i]<a[ans[tail]]&&g[i]+1==g[ans[tail]]){ ans[++tail]=i; } } for1(i,maxx){ printf("%d%c",ans[i]," n"[i==maxx]); }
tail=maxx-g[La]+1; ans[tail]=La; for(int i=La+1;i<=n;i++){ if(g[i]+tail>=maxx&&g[i]<g[La]){ if(a[ans[maxx-g[i]]]>a[i]){ tail=maxx-g[i]+1; ans[tail]=i; } } } tail=maxx-g[La]+1; for(int i=La-1;i>0;i--){ if(a[i]<a[ans[tail]]&&f[i]+1==f[ans[tail]]){ ans[--tail]=i; } } for1(i,maxx){ printf("%d%c",ans[i]," n"[i==maxx]); } } return 0; }
|
近期评论