101272024-03-27 18:09:36111Maximum felosztáscpp17Accepted 100/100233ms146776 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),pg(N+1),nge(N+1),s(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];
	}
	s.clear();
	for(int i=1;i<=N;i++){
		while(!s.empty()&&v[s.back()]<=v[i]){
			s.pop_back();
		}
		pg[i]=s.empty()?0:s.back();
		s.push_back(i);
	}
	s.clear();
	for(int i=N;i>=1;i--){
		while(!s.empty()&&v[s.back()]<v[i]){
			s.pop_back();
		}
		nge[i]=s.empty()?N+1:s.back();
		s.push_back(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=dp[i&1^1].sum(pg[j],j-1);
			dp[i&1].add(j,nge[j]-1,x);
		}
	}
	cout<<dp[M&1].sum(N,N)<<'\n';
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2092 KiB
2Accepted4ms4876 KiB
subtask210/10
3Accepted3ms3204 KiB
4Accepted3ms3568 KiB
5Accepted3ms3796 KiB
6Accepted3ms3780 KiB
7Accepted3ms3832 KiB
8Accepted3ms3968 KiB
subtask315/15
9Accepted3ms3916 KiB
10Accepted3ms4068 KiB
11Accepted3ms4124 KiB
12Accepted3ms4132 KiB
13Accepted3ms4436 KiB
14Accepted3ms4388 KiB
15Accepted3ms4680 KiB
16Accepted3ms4696 KiB
17Accepted3ms4720 KiB
18Accepted3ms4696 KiB
subtask415/15
19Accepted6ms6732 KiB
20Accepted6ms6936 KiB
21Accepted4ms7116 KiB
22Accepted4ms6768 KiB
23Accepted4ms7064 KiB
24Accepted4ms6884 KiB
25Accepted4ms6916 KiB
26Accepted4ms6956 KiB
27Accepted4ms7188 KiB
28Accepted4ms7228 KiB
29Accepted4ms7324 KiB
30Accepted4ms7392 KiB
31Accepted6ms7680 KiB
32Accepted4ms7732 KiB
33Accepted4ms7772 KiB
34Accepted4ms7880 KiB
35Accepted6ms7872 KiB
36Accepted4ms8096 KiB
37Accepted4ms7876 KiB
38Accepted4ms7972 KiB
subtask560/60
39Accepted226ms141980 KiB
40Accepted199ms137576 KiB
41Accepted203ms137812 KiB
42Accepted210ms129656 KiB
43Accepted216ms128092 KiB
44Accepted143ms146548 KiB
45Accepted172ms136540 KiB
46Accepted222ms134460 KiB
47Accepted195ms143552 KiB
48Accepted233ms134456 KiB
49Accepted200ms143572 KiB
50Accepted233ms136164 KiB
51Accepted167ms133008 KiB
52Accepted149ms140804 KiB
53Accepted173ms142608 KiB
54Accepted165ms128760 KiB
55Accepted152ms136580 KiB
56Accepted211ms139136 KiB
57Accepted223ms139140 KiB
58Accepted131ms146776 KiB
59Accepted130ms146724 KiB
60Accepted136ms136588 KiB
61Accepted128ms136536 KiB
62Accepted175ms136016 KiB
63Accepted173ms132896 KiB
64Accepted185ms137748 KiB
65Accepted175ms133384 KiB
66Accepted175ms139236 KiB
67Accepted159ms145580 KiB
68Accepted202ms135004 KiB
69Accepted152ms141044 KiB
70Accepted171ms130128 KiB
71Accepted170ms130076 KiB