题解:P9522 [JOISC 2022] 错误拼写
https://www.luogu.com.cn/problem/P9522
-
A<B
如果
设
对于
这样我们就是
首先我们可以消掉
我们接着对每个起点
因为我们知道了起点和终点,这样便于我们把对
#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
const int N=500000+10,mod=1e9+7;
int n,m,tot;
int f[N][26][2],ans;
int s[N][26];
int mx0[N],mx1[N];
int l0[N],l1[N];
int S[26][N];
vector<int> V0[N],V1[N];
priority_queue<pair<int,int>> q0,q1;
signed main(){
// freopen("misspelling.in","r",stdin);
// freopen("misspelling.out","w",stdout);
cin>>n>>m;
rep(i,1,m){
int x,y; cin>>x>>y;
if(x==y) continue;
++tot;
if(x>y) mx0[y]=max(mx0[y],x);
else mx1[x]=max(mx1[x],y);
}
rep(i,1,n-1){
if(mx0[i]>0) V0[i+1].push_back(i);
if(mx1[i]>0) V1[i+1].push_back(i);
}
rep(i,1,n){
for(auto st:V0[i]) q0.push({st,mx0[st]});
for(;!q0.empty()&&q0.top().second<i;) q0.pop();
l0[i]=q0.empty()?0:q0.top().first;
for(auto st:V1[i]) q1.push({st,mx1[st]});
for(;!q1.empty()&&q1.top().second<i;) q1.pop();
l1[i]=q1.empty()?0:q1.top().first;
}
rep(i,0,25) f[1][i][1]=1;
rep(j,0,25) s[1][j]=j+1;
rep(t,0,25) S[t][1]=s[1][t];
rep(i,2,n){
rep(j,0,25){
f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1])%mod;
int R=i-1;
if(j<25&&l0[i]<=R){
f[i][j][1]=(f[i][j][1]+S[25][R]-S[j][R]-(S[25][l0[i]]-S[j][l0[i]])+mod)%mod;
}
if(j>0&&l1[i]<=R){
f[i][j][1]=(f[i][j][1]+S[j-1][R]-S[j-1][l1[i]]+mod)%mod;
}
}
s[i][0]=f[i][0][1];
rep(j,1,25) s[i][j]=(s[i][j-1]+f[i][j][1])%mod;
rep(t,0,25) S[t][i]=(S[t][i-1]+s[i][t])%mod;
}
rep(i,0,25){
ans=(ans+f[n][i][0]+f[n][i][1])%mod;
}
cout<<ans;
return 0;
}