求调 玄关
查看原帖
求调 玄关
1144127
EARLY_SPRING楼主2025/7/23 21:12

wa13 20 21 22 29

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7 ;

int n,m,k;
struct node{
	int x,y,kind;
}a[100010];

bool cmp(node p,node q){
	if(p.x==q.x) return p.y<q.y;
	return p.x<q.x;
}
int qp(int x,int y){
	if(y==1) return x;
	if(y==0) return 1;
	int sum=qp(x,y/2);
	if(y%2==1) return sum*sum%mod*x%mod;
	else return sum*sum%mod;
}

int calc1(){
	int num=0,pre=0;
	for(int i=1,j=0;i<=k;i=j+1){
		while(j<k&&a[j+1].x==a[i].x){
			++j;	
		}
		for(int l=i;l<=j;l++){
			int x1=(a[l].y^a[i].y)&1,x2=(a[l].kind^a[i].kind);
			if(x1!=x2) return 0;
		}
		num+=a[i].x-pre-1;
		pre=a[i].x;
	}
	num+=n-pre;
	return qp(2,num)%mod;
} 
int calc2(){
	for(int i=1;i<=k;i++){
		swap(a[i].x,a[i].y);
	}
	sort(a+1,a+k+1,cmp);
	int ret=calc1();
	for(int i=1;i<=k;i++){
		swap(a[i].x,a[i].y);
	}
	sort(a+1,a+1+k,cmp);
	return ret%mod;
}
int calc3(){
	for(int i=2;i<=k;i++){
		int x1=(a[i-1].x^a[i].x^a[i-1].y^a[i].y)&1,x2=(a[i-1].kind^a[i].kind);
		if(x1!=x2) return 0;
	}
	return 1+(!k);
}
signed main( ){
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++){
		char op;int xx,yy;
		cin>>op>>xx>>yy;
		a[i].kind=(op=='+'?1:0);
		a[i].x=xx;
		a[i].y=yy;
	}
	sort(a+1,a+k+1,cmp);
	int c1=calc1();
	int c2=calc2();
	int c3=calc3();
	cout<<((c1+c2)%mod-c3+mod)%mod;
	return 0;
}
/*6576*/
2025/7/23 21:12
加载中...