101272024-03-27 18:09:36111Maximum felosztáscpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2092 KiB
2Elfogadva4ms4876 KiB
subtask210/10
3Elfogadva3ms3204 KiB
4Elfogadva3ms3568 KiB
5Elfogadva3ms3796 KiB
6Elfogadva3ms3780 KiB
7Elfogadva3ms3832 KiB
8Elfogadva3ms3968 KiB
subtask315/15
9Elfogadva3ms3916 KiB
10Elfogadva3ms4068 KiB
11Elfogadva3ms4124 KiB
12Elfogadva3ms4132 KiB
13Elfogadva3ms4436 KiB
14Elfogadva3ms4388 KiB
15Elfogadva3ms4680 KiB
16Elfogadva3ms4696 KiB
17Elfogadva3ms4720 KiB
18Elfogadva3ms4696 KiB
subtask415/15
19Elfogadva6ms6732 KiB
20Elfogadva6ms6936 KiB
21Elfogadva4ms7116 KiB
22Elfogadva4ms6768 KiB
23Elfogadva4ms7064 KiB
24Elfogadva4ms6884 KiB
25Elfogadva4ms6916 KiB
26Elfogadva4ms6956 KiB
27Elfogadva4ms7188 KiB
28Elfogadva4ms7228 KiB
29Elfogadva4ms7324 KiB
30Elfogadva4ms7392 KiB
31Elfogadva6ms7680 KiB
32Elfogadva4ms7732 KiB
33Elfogadva4ms7772 KiB
34Elfogadva4ms7880 KiB
35Elfogadva6ms7872 KiB
36Elfogadva4ms8096 KiB
37Elfogadva4ms7876 KiB
38Elfogadva4ms7972 KiB
subtask560/60
39Elfogadva226ms141980 KiB
40Elfogadva199ms137576 KiB
41Elfogadva203ms137812 KiB
42Elfogadva210ms129656 KiB
43Elfogadva216ms128092 KiB
44Elfogadva143ms146548 KiB
45Elfogadva172ms136540 KiB
46Elfogadva222ms134460 KiB
47Elfogadva195ms143552 KiB
48Elfogadva233ms134456 KiB
49Elfogadva200ms143572 KiB
50Elfogadva233ms136164 KiB
51Elfogadva167ms133008 KiB
52Elfogadva149ms140804 KiB
53Elfogadva173ms142608 KiB
54Elfogadva165ms128760 KiB
55Elfogadva152ms136580 KiB
56Elfogadva211ms139136 KiB
57Elfogadva223ms139140 KiB
58Elfogadva131ms146776 KiB
59Elfogadva130ms146724 KiB
60Elfogadva136ms136588 KiB
61Elfogadva128ms136536 KiB
62Elfogadva175ms136016 KiB
63Elfogadva173ms132896 KiB
64Elfogadva185ms137748 KiB
65Elfogadva175ms133384 KiB
66Elfogadva175ms139236 KiB
67Elfogadva159ms145580 KiB
68Elfogadva202ms135004 KiB
69Elfogadva152ms141044 KiB
70Elfogadva171ms130128 KiB
71Elfogadva170ms130076 KiB