[ARC182A] Chmax Rush!

WuMin4發表於2024-08-21

思路

分類討論。
對於 $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;
}