思路
分类讨论。
对于 $Q$ 次操作中的第 $i$ 次 操作和第 $j$ 次操作 $(i<j)$:
- 若 $V_i\le V_j$,则这两次操作之间不会影响。
- 若 $V_i>V_j$ 且 $P_i=P_j$,则这两次操作之间一定冲突,因为 $i$ 这个位置一定会修改。
- 若 $V_i>V_j$ 且 $P_i<P_j$,则操作 $i$ 一定替换前 $P_i$ 个元素,操作 $j$ 一定替换从 $P_j$ 开始到末尾的元素。
- 若 $V_i>V_j$ 且 $P_i>P_j$,则操作 $i$ 一定替换从 $P_i$ 开始到末尾的元素,操作 $j$ 一定替换前 $P_j$ 个元素。
注意到 $1\le Q\le 5000$,于是可以 $O(Q^2)$ 枚举 $i,j$。设 $k$ 为不确定的操作数量(及替换前面或后面都可以的操作),答案即为 $2^k\bmod 998244353$。
代码
#include<bits/stdc++.h>
#define md 998244353
using namespace std;
int n,q,ans=1,dir[5005];//0为不确定,1为向前,2为向后
struct node{
int p,v;
}a[5005];
signed main(){
cin>>n>>q;
for(int i=1;i<=q;i++){
cin>>a[i].p>>a[i].v;
for(int j=1;j<i;j++){
if(a[j].v>a[i].v){
if(a[j].p>a[i].p){
if(dir[j]==1||dir[i]==2){//与之前确定的方向冲突
cout<<0;
return 0;
}
dir[j]=2;
dir[i]=1;
}
else if(a[j].p<a[i].p){
if(dir[j]==2||dir[i]==1){//同理
cout<<0;
return 0;
}
dir[j]=1;
dir[i]=2;
}
else{//位置相同冲突
cout<<0;
return 0;
}
}
}
}
for(int i=1;i<=q;i++)
if(!dir[i])
ans=(ans*2)%md;
cout<<ans;
return 0;
}
标签:Rush,le,int,ARC182A,操作,Chmax,dir
From: https://www.cnblogs.com/WuMin4/p/18371938