MnZn爆零求调(悬5关)
查看原帖
MnZn爆零求调(悬5关)
751791
HGENDAS楼主2024/11/12 13:59

树形dp,感觉思路很对,三个样例都过了,求神犇帮调。

#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int n,f[27][100005],sum[27][100005],cnt[37],ans=1;
vector<int>v[27];
const int mod=1000000007;
struct nam{
	string x,y;
	int a,b;
}a[38];
void dfs(int k){
	for(int i=1;i<=100000;++i)f[k][i]=1;
	for(auto i:v[k]){
		dfs(i);
		for(int j=1;j<=100000;++j){
			if(a[i].a==0){
				if(j<=a[i].b)f[k][j]=f[k][j]*(sum[i][a[i].b]-sum[i][j-1]+mod+mod)%mod;
			}else{
				if(a[i].b==0){
					if(a[i].a<=j)f[k][j]=f[k][j]*(sum[i][j]-sum[i][a[i].a-1]+mod+mod)%mod;
				}else{
					f[k][j]=f[k][j]*(sum[i][a[i].b]-sum[i][a[i].a-1]+mod+mod)%mod;
				}
			}
		}
	}
	for(int i=1;i<=100000;++i)sum[k][i]=(sum[k][i-1]+f[k][i]+mod)%mod;
	return;
}
main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i].x>>a[i].y;
		if('a'<=a[i].x[0]&&a[i].x[0]<='z')v[a[i].x[0]-'a'+1].emplace_back(i),++cnt[i];
		else for(auto j:a[i].x)a[i].a=a[i].a*10+j-'0';
		if('a'<=a[i].y[0]&&a[i].y[0]<='z')v[a[i].y[0]-'a'+1].emplace_back(i),++cnt[i];
		else for(auto j:a[i].y)a[i].b=a[i].b*10+j-'0';
	}
	for(int i=1;i<=n;++i)if(cnt[i]==0)dfs(i),(ans*=(sum[i][a[i].b]-sum[i][a[i].a-1]+mod+mod))%=mod;
	cout<<ans;
	return 0;
}
2024/11/12 13:59
加载中...