#include<bits/stdc++.h> using namespace std; #define pb push_back #define pii pair<int, int> #define st first #define nd second #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() const int MAXN = 10009; const int MOD = 1e9+7; int n, m; int ans[MAXN*2]; int tab[2][MAXN]; vector<pii> dp[MAXN]; vector<pii> dp2[MAXN]; int Ceil(int a, int b) { return (a+b-1)/b; } void f(int L, bool same) { int cur = same?n:m; for(int i=3;i<=(same?n:m);i++) dp2[i] = dp[i]; for(int i=1;i<L+same;i++) { int cnt = n-i+1; if(same) cnt = m-i+1; if(cnt==0) break; while(cur>=3&&sz(dp2[cur])==0) cur--; if(cur==2) { ans[2] += cnt; if(ans[2]>=MOD) ans[2]-=MOD; continue; } pii x = dp2[cur].back(); dp2[cur].pop_back(); int newx = Ceil(x.st+x.nd+1, x.nd+2); if(newx>2) { dp2[newx].pb({x.st, x.nd+1}); } while(cur>=3&&sz(dp2[cur])==0) cur--; ans[cur] += cnt; if(ans[cur]>=MOD) ans[cur]-=MOD; } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for(int i=0;i<n;i++) { cin >> tab[0][i]; } for(int i=0;i<m;i++) { cin >> tab[1][i]; } ans[2] = 1LL*n*m%MOD; for(int i=0;i<2;i++) { for(int j=0;j<(i?m:n)-1;j++) { for(int k=0;k<=(i?m:n);k++) { dp[k].clear(); } int cur = 2; dp[cur].pb({cur, 0}); f(2, 1-i); for(int k=j+2;k<(i?m:n);k++) { if((tab[i][k]<tab[i][k-1])==(tab[i][k-1]<tab[i][k-2])) { dp[cur].pop_back(); cur++; } else { cur = 2; } dp[cur].pb({cur, 0}); f(k-j+1, 1-i); } } } for(int i=1;i<=n+m;i++) { cout << ans[i] << " "; } cout << "\n"; }
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 | #include<bits/stdc++.h> using namespace std; #define pb push_back #define pii pair<int, int> #define st first #define nd second #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() const int MAXN = 10009; const int MOD = 1e9+7; int n, m; int ans[MAXN*2]; int tab[2][MAXN]; vector<pii> dp[MAXN]; vector<pii> dp2[MAXN]; int Ceil(int a, int b) { return (a+b-1)/b; } void f(int L, bool same) { int cur = same?n:m; for(int i=3;i<=(same?n:m);i++) dp2[i] = dp[i]; for(int i=1;i<L+same;i++) { int cnt = n-i+1; if(same) cnt = m-i+1; if(cnt==0) break; while(cur>=3&&sz(dp2[cur])==0) cur--; if(cur==2) { ans[2] += cnt; if(ans[2]>=MOD) ans[2]-=MOD; continue; } pii x = dp2[cur].back(); dp2[cur].pop_back(); int newx = Ceil(x.st+x.nd+1, x.nd+2); if(newx>2) { dp2[newx].pb({x.st, x.nd+1}); } while(cur>=3&&sz(dp2[cur])==0) cur--; ans[cur] += cnt; if(ans[cur]>=MOD) ans[cur]-=MOD; } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for(int i=0;i<n;i++) { cin >> tab[0][i]; } for(int i=0;i<m;i++) { cin >> tab[1][i]; } ans[2] = 1LL*n*m%MOD; for(int i=0;i<2;i++) { for(int j=0;j<(i?m:n)-1;j++) { for(int k=0;k<=(i?m:n);k++) { dp[k].clear(); } int cur = 2; dp[cur].pb({cur, 0}); f(2, 1-i); for(int k=j+2;k<(i?m:n);k++) { if((tab[i][k]<tab[i][k-1])==(tab[i][k-1]<tab[i][k-2])) { dp[cur].pop_back(); cur++; } else { cur = 2; } dp[cur].pb({cur, 0}); f(k-j+1, 1-i); } } } for(int i=1;i<=n+m;i++) { cout << ans[i] << " "; } cout << "\n"; } |