10124 2024. 03. 27 17:48:49 111 Maximum felosztás cpp17 Időlimit túllépés 40/100 1.103s 137052 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;
	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]=0;
			b[i]=0;
			c[i]=0;
			c[i*2+1]=1;
			c[i*2+2]=1;
		}
		else{
			a[i]+=b[i]*MI(r-l+1);
			if(c[i*2+1]){
				a[i*2+1]=0;
				b[i*2+1]=0;
				c[i*2+1]=0;
			}
			if(c[i*2+2]){
				a[i*2+2]=0;
				b[i*2+2]=0;
				c[i*2+2]=0;
			}
			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,int x){
		if(l>rr||r<ll){
			return;
		}
		push(i,l,r);
		if(l>=ll&&r<=rr){
			b[i]+=x;
			push(i,l,r);
			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,int 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;
		}
		push(i,l,r);
		if(l>=ll&&r<=rr){
			return a[i];
		}
		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(){
		fill(a.begin(),a.end(),0);
		fill(b.begin(),b.end(),0);
	}
};

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 Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 2128 KiB
2 Elfogadva 9ms 4960 KiB
subtask2 10/10
3 Elfogadva 3ms 3144 KiB
4 Elfogadva 3ms 3372 KiB
5 Elfogadva 3ms 3480 KiB
6 Elfogadva 3ms 3664 KiB
7 Elfogadva 3ms 4008 KiB
8 Elfogadva 3ms 3932 KiB
subtask3 15/15
9 Elfogadva 4ms 3920 KiB
10 Elfogadva 4ms 4160 KiB
11 Elfogadva 4ms 4408 KiB
12 Elfogadva 3ms 4356 KiB
13 Elfogadva 3ms 4324 KiB
14 Elfogadva 3ms 4316 KiB
15 Elfogadva 4ms 4584 KiB
16 Elfogadva 4ms 4736 KiB
17 Elfogadva 4ms 4684 KiB
18 Elfogadva 4ms 5092 KiB
subtask4 15/15
19 Elfogadva 17ms 7024 KiB
20 Elfogadva 10ms 6980 KiB
21 Elfogadva 6ms 7048 KiB
22 Elfogadva 6ms 6784 KiB
23 Elfogadva 4ms 7320 KiB
24 Elfogadva 4ms 7284 KiB
25 Elfogadva 10ms 7324 KiB
26 Elfogadva 9ms 7324 KiB
27 Elfogadva 25ms 7416 KiB
28 Elfogadva 21ms 7412 KiB
29 Elfogadva 4ms 7196 KiB
30 Elfogadva 6ms 7072 KiB
31 Elfogadva 8ms 7040 KiB
32 Elfogadva 8ms 7044 KiB
33 Elfogadva 14ms 7056 KiB
34 Elfogadva 14ms 7472 KiB
35 Elfogadva 10ms 7556 KiB
36 Elfogadva 9ms 7496 KiB
37 Elfogadva 6ms 7380 KiB
38 Elfogadva 6ms 7484 KiB
subtask5 0/60
39 Időlimit túllépés 1.062s 69984 KiB
40 Időlimit túllépés 1.074s 67604 KiB
41 Időlimit túllépés 1.103s 67792 KiB
42 Időlimit túllépés 1.044s 63696 KiB
43 Időlimit túllépés 1.07s 62952 KiB
44 Időlimit túllépés 1.069s 72252 KiB
45 Időlimit túllépés 1.064s 67500 KiB
46 Időlimit túllépés 1.049s 66528 KiB
47 Időlimit túllépés 1.06s 70988 KiB
48 Időlimit túllépés 1.072s 66540 KiB
49 Időlimit túllépés 1.064s 71096 KiB
50 Időlimit túllépés 1.077s 67352 KiB
51 Időlimit túllépés 1.06s 65612 KiB
52 Elfogadva 584ms 135388 KiB
53 Elfogadva 301ms 137052 KiB
54 Elfogadva 568ms 123148 KiB
55 Elfogadva 382ms 131072 KiB
56 Időlimit túllépés 1.07s 68644 KiB
57 Időlimit túllépés 1.067s 68576 KiB
58 Időlimit túllépés 1.06s 72628 KiB
59 Időlimit túllépés 1.014s 72560 KiB
60 Elfogadva 356ms 131088 KiB
61 Időlimit túllépés 1.062s 67364 KiB
62 Időlimit túllépés 1.054s 67232 KiB
63 Időlimit túllépés 1.069s 65824 KiB
64 Időlimit túllépés 1.042s 67944 KiB
65 Időlimit túllépés 1.07s 65744 KiB
66 Időlimit túllépés 1.07s 68672 KiB
67 Időlimit túllépés 1.07s 71988 KiB
68 Időlimit túllépés 1.074s 66704 KiB
69 Időlimit túllépés 1.077s 69948 KiB
70 Időlimit túllépés 1.046s 64368 KiB
71 Időlimit túllépés 1.042s 64224 KiB