101262024-03-27 18:05:18111Maximum felosztáscpp17Időlimit túllépés 40/1001.077s141668 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

#define MOD 1000000007

struct MI{
	int x;
	
	MI():x(0){
	}
	
	MI(int x):x(x){
	}
	
	MI operator*(MI o){
		return x*o.x%MOD;
	}
	
	void operator=(MI o){
		x=o.x;
	}
	
	void operator+=(MI o){
		x+=o.x;
		if(x>=MOD){
			x-=MOD;
		}
	}
	
	operator int(){
		return x;
	}
};

struct ST{
	int n,k;
	vector<MI>a,b,c;
	
	ST(int n):n(n),a(n*8),b(n*8),c(n*8){
	}
	
	void push(int i,int l,int r){
		if(c[i]==1){
			a[i*2+1]=0;
			a[i*2+2]=0;
			b[i*2+1]=0;
			b[i*2+2]=0;
			c[i*2+1]=1;
			c[i*2+2]=1;
			c[i]=0;
		}
		a[i*2+1]+=b[i]*MI((l+r)/2-l+1);
		a[i*2+2]+=b[i]*MI(r-(l+r)/2);
		b[i*2+1]+=b[i];
		b[i*2+2]+=b[i];
		b[i]=0;
	}
	
	void add(int i,int l,int r,int ll,int rr,MI x){
		if(l>rr||r<ll){
			return;
		}
		if(l>=ll&&r<=rr){
			a[i]+=x*MI(r-l+1);
			b[i]+=x;
			return;
		}
		push(i,l,r);
		add(i*2+1,l,(l+r)/2,ll,rr,x);
		add(i*2+2,(l+r)/2+1,r,ll,rr,x);
		a[i]=a[i*2+1]+a[i*2+2];
	}
	
	void add(int l,int r,MI x){
		add(0,0,n-1,l,r,x);
	}
	
	MI sum(int i,int l,int r,int ll,int rr){
		if(l>rr||r<ll){
			return 0;
		}
		if(l>=ll&&r<=rr){
			return a[i];
		}
		push(i,l,r);
		MI ans=0;
		ans+=sum(i*2+1,l,(l+r)/2,ll,rr);
		ans+=sum(i*2+2,(l+r)/2+1,r,ll,rr);
		return ans;
	}
	
	MI sum(int l,int r){
		return sum(0,0,n-1,l,r);
	}
	
	void clear(){
		c[0]=1;
	}
};

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,M;
	cin>>N>>M;
	vector<int>v(N+1),w(M+1);
	map<int,vector<int>>m;
	for(int i=1;i<=N;i++){
		cin>>v[i];
		m[v[i]].push_back(i);
	}
	for(int i=1;i<=M;i++){
		cin>>w[i];
	}
	vector<ST>dp(2,ST(N+1));
	dp[0].add(0,0,1);
	for(int i=1;i<=M;i++){
		dp[i&1].clear();
		for(int j:m[w[i]]){
			MI x=0;
			int k;
			for(k=j;k>0&&v[k]<=w[i];k--){
			}
			x+=dp[i&1^1].sum(k,j-1);
			for(k=j;k<=N&&(k==j||v[k]<w[i]);k++){
			}
			dp[i&1].add(j,k-1,x);
		}
		// for(int j=1;j<=N;j++){
			// cout<<setw(4)<<dp[i&1].sum(j,j)<<' ';
		// }
		// cout<<'\n';
	}
	cout<<dp[M&1].sum(N,N)<<'\n';
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1956 KiB
2Elfogadva6ms4860 KiB
subtask210/10
3Elfogadva3ms2908 KiB
4Elfogadva3ms3108 KiB
5Elfogadva3ms3044 KiB
6Elfogadva3ms3296 KiB
7Elfogadva3ms3640 KiB
8Elfogadva3ms3640 KiB
subtask315/15
9Elfogadva3ms3568 KiB
10Elfogadva3ms3528 KiB
11Elfogadva3ms3636 KiB
12Elfogadva3ms3808 KiB
13Elfogadva3ms3792 KiB
14Elfogadva3ms4040 KiB
15Elfogadva3ms3996 KiB
16Elfogadva3ms3996 KiB
17Elfogadva3ms4252 KiB
18Elfogadva3ms4452 KiB
subtask415/15
19Elfogadva6ms6512 KiB
20Elfogadva6ms6588 KiB
21Elfogadva4ms6924 KiB
22Elfogadva4ms6532 KiB
23Elfogadva4ms6808 KiB
24Elfogadva4ms6780 KiB
25Elfogadva4ms6756 KiB
26Elfogadva4ms6912 KiB
27Elfogadva7ms6952 KiB
28Elfogadva6ms7100 KiB
29Elfogadva4ms7104 KiB
30Elfogadva4ms7092 KiB
31Elfogadva4ms7052 KiB
32Elfogadva4ms7008 KiB
33Elfogadva6ms7044 KiB
34Elfogadva6ms6972 KiB
35Elfogadva6ms7092 KiB
36Elfogadva4ms7504 KiB
37Elfogadva4ms7192 KiB
38Elfogadva4ms7388 KiB
subtask50/60
39Elfogadva224ms136152 KiB
40Elfogadva200ms131864 KiB
41Elfogadva204ms131992 KiB
42Elfogadva215ms123936 KiB
43Elfogadva250ms122636 KiB
44Elfogadva138ms140972 KiB
45Elfogadva187ms131112 KiB
46Elfogadva252ms129276 KiB
47Elfogadva209ms138240 KiB
48Elfogadva238ms129028 KiB
49Elfogadva244ms138260 KiB
50Elfogadva273ms130464 KiB
51Elfogadva187ms127348 KiB
52Elfogadva247ms135184 KiB
53Elfogadva238ms136940 KiB
54Elfogadva481ms123292 KiB
55Elfogadva382ms131008 KiB
56Elfogadva238ms133708 KiB
57Elfogadva261ms133608 KiB
58Időlimit túllépés1.062s72412 KiB
59Elfogadva777ms141668 KiB
60Elfogadva171ms131232 KiB
61Időlimit túllépés1.059s67656 KiB
62Időlimit túllépés1.036s67496 KiB
63Időlimit túllépés1.07s65896 KiB
64Időlimit túllépés1.065s68068 KiB
65Időlimit túllépés1.077s65936 KiB
66Időlimit túllépés1.065s68888 KiB
67Elfogadva808ms140212 KiB
68Időlimit túllépés1.075s66804 KiB
69Elfogadva930ms135596 KiB
70Elfogadva529ms124568 KiB
71Elfogadva666ms124572 KiB