[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;
}
posted @ 2024-08-21 16:29  WuMin4  阅读(20)  评论(0)    收藏  举报