1 条题解

  • 0
    @ 2026-8-23 21:39:54

    fi,0f_{i,0} 代表第 ii 次询问是否能修改左边,fi,1f_{i,1} 代表第 ii 次询问是否能修改右边。初始时假设 fi,0=fi,1=1f_{i,0}=f_{i,1}=1

    对于 ViVjV_i\leq V_ji<ji<j,显然第 ii 次询问不会对第 jj 次询问产生影响。所以产生影响的只能是逆序对。

    对于一对逆序对 i,ji,j,我们分类讨论:

    • Pi=PjP_i=P_j:显然第 jj 次询问向左和向右都不能修改。Snuke 不管怎样都会哭泣,故答案为 00
    • Pi<PjP_i<P_j:为使两次修改区间没有交集,第 ii 次询问只能修改左边,第 jj 次询问只能修改右边。fi,1=0,fj,0=0f_{i,1}=0,f_{j,0}=0
    • Pi>PjP_i>P_j:为使两次修改区间没有交集,第 ii 次询问只能修改右边,第 jj 次询问只能修改左边。fi,0=0,fj,1=0f_{i,0}=0,f_{j,1}=0

    显然,随着修改操作的进行,SiS_i 的值只会越来越大,不会出现形如 i<k<ji<k<jVk<Vj<ViV_k<V_j<V_i 的第 kk 次询问,使得原本不能被 VjV_j 修改的 S1PjS_{1\sim P_j}SPjnS_{P_j\sim n} 在第 kk 次询问后可以被修改。

    最后答案就是 i=1q(fi,0+fi,1)\prod_{i=1}^q(f_{i,0}+f_{i,1})

    #include<iostream>
    using namespace std;
    int n,q;
    int f[5005][2];
    int a[5005],b[5005];
    int ans=1;
    const int mod=998244353;
    int main(){
    	cin>>n>>q;
    	for(int i=1;i<=q;i++)cin>>a[i]>>b[i];
    	for(int i=1;i<=q;i++){
    		f[i][0]=f[i][1]=1;
    	}
    	for(int i=1;i<=q;i++){
    		for(int j=i+1;j<=q;j++){
    			if(b[i]>b[j]){
    				if(a[j]>a[i])f[i][1]=0,f[j][0]=0;
    				if(a[j]<a[i])f[i][0]=0,f[j][1]=0;
    				if(a[i]==a[j])f[j][0]=f[j][1]=0;
    			}
    		}
    	}
    	for(int i=1;i<=q;i++){
    		ans*=(f[i][0]+f[i][1]);
    		ans%=mod;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    1231
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者