101242024-03-27 17:48:49111Maximum felosztáscpp17Időlimit túllépés 40/1001.103s137052 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2128 KiB
2Elfogadva9ms4960 KiB
subtask210/10
3Elfogadva3ms3144 KiB
4Elfogadva3ms3372 KiB
5Elfogadva3ms3480 KiB
6Elfogadva3ms3664 KiB
7Elfogadva3ms4008 KiB
8Elfogadva3ms3932 KiB
subtask315/15
9Elfogadva4ms3920 KiB
10Elfogadva4ms4160 KiB
11Elfogadva4ms4408 KiB
12Elfogadva3ms4356 KiB
13Elfogadva3ms4324 KiB
14Elfogadva3ms4316 KiB
15Elfogadva4ms4584 KiB
16Elfogadva4ms4736 KiB
17Elfogadva4ms4684 KiB
18Elfogadva4ms5092 KiB
subtask415/15
19Elfogadva17ms7024 KiB
20Elfogadva10ms6980 KiB
21Elfogadva6ms7048 KiB
22Elfogadva6ms6784 KiB
23Elfogadva4ms7320 KiB
24Elfogadva4ms7284 KiB
25Elfogadva10ms7324 KiB
26Elfogadva9ms7324 KiB
27Elfogadva25ms7416 KiB
28Elfogadva21ms7412 KiB
29Elfogadva4ms7196 KiB
30Elfogadva6ms7072 KiB
31Elfogadva8ms7040 KiB
32Elfogadva8ms7044 KiB
33Elfogadva14ms7056 KiB
34Elfogadva14ms7472 KiB
35Elfogadva10ms7556 KiB
36Elfogadva9ms7496 KiB
37Elfogadva6ms7380 KiB
38Elfogadva6ms7484 KiB
subtask50/60
39Időlimit túllépés1.062s69984 KiB
40Időlimit túllépés1.074s67604 KiB
41Időlimit túllépés1.103s67792 KiB
42Időlimit túllépés1.044s63696 KiB
43Időlimit túllépés1.07s62952 KiB
44Időlimit túllépés1.069s72252 KiB
45Időlimit túllépés1.064s67500 KiB
46Időlimit túllépés1.049s66528 KiB
47Időlimit túllépés1.06s70988 KiB
48Időlimit túllépés1.072s66540 KiB
49Időlimit túllépés1.064s71096 KiB
50Időlimit túllépés1.077s67352 KiB
51Időlimit túllépés1.06s65612 KiB
52Elfogadva584ms135388 KiB
53Elfogadva301ms137052 KiB
54Elfogadva568ms123148 KiB
55Elfogadva382ms131072 KiB
56Időlimit túllépés1.07s68644 KiB
57Időlimit túllépés1.067s68576 KiB
58Időlimit túllépés1.06s72628 KiB
59Időlimit túllépés1.014s72560 KiB
60Elfogadva356ms131088 KiB
61Időlimit túllépés1.062s67364 KiB
62Időlimit túllépés1.054s67232 KiB
63Időlimit túllépés1.069s65824 KiB
64Időlimit túllépés1.042s67944 KiB
65Időlimit túllépés1.07s65744 KiB
66Időlimit túllépés1.07s68672 KiB
67Időlimit túllépés1.07s71988 KiB
68Időlimit túllépés1.074s66704 KiB
69Időlimit túllépés1.077s69948 KiB
70Időlimit túllépés1.046s64368 KiB
71Időlimit túllépés1.042s64224 KiB