[ARC182A] Chmax Rush!
思路
分类讨论。
对于 \(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;
}

浙公网安备 33010602011771号