见祖宗求助
查看原帖
见祖宗求助
104292
YellowBean_Elsa楼主2022/12/28 15:56

这份代码处理 k=2k=2 的,去掉

#define int long long 

后会挂掉,不知为何?

//coder: Feliks*GM-YB
#include<bits/stdc++.h>
#define fu(i,a,b) for(register int i = a, I = (b) + 1; i < I; ++i)
#define fd(i,a,b) for(register int i = a, I = (b) - 1; i > I; --i)
#define go(x) for(int i=first[x],y=v[i];i;i=nex[i],y=v[i])
#define mk make_pair
#define int long long
typedef long long ll;
using namespace std;
const int N=2e4+10;
const int mod=1e9+7;

inline int read(){
    int x=0;char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return x;
}int T,n,m,k,t;
int x[N],y[N];
ll s,ans,qi[5];
map<pair<int,int>,int> mp;
inline void init(){
	fu(i,0,4)qi[i]=0;
	ans=0;
	mp.clear();
}inline ll power(ll x,int b){
    ll res=1;
    while(b){
        if(b&1)res=res*x%mod;
        b>>=1;
        x=x*x%mod;
    }return res;
}
signed main(){
//	freopen("DATA.in","r",stdin);
//	freopen("WTF.txt","w",stdout);
	T=read();
	while(T--){
		init();
		n=read(),m=read(),k=read(),t=read();
		s=(1LL*n*m-t)%mod;
		if(t==0){
			if(k==2){
				ans=(s*(s-1)/2%mod-1LL*n*(m-1)%mod-1LL*(n-1)*m%mod)%mod;
				ans=(ans+mod)%mod;
				printf("%lld\n",ans);
			}else{
				puts("0"); 
			}continue;
		}fu(i,1,t){
			x[i]=read(),y[i]=read();
			if(mp.find(mk(x[i],y[i]))==mp.end())
				mp.insert(mk(mk(x[i],y[i]),0));
			else mp[mk(x[i],y[i])]=0;
			if(x[i]!=1 && mp.find(mk(x[i]-1,y[i]))==mp.end()){
				mp.insert(mk(mk(x[i]-1,y[i]),3));
				if(x[i]-1==1)mp[mk(x[i]-1,y[i])]--;
				if(y[i]==1 || y[i]==m)mp[mk(x[i]-1,y[i])]--;
			}else if(x[i]!=1)mp[mk(x[i]-1,y[i])]--;
			if(y[i]!=1 && mp.find(mk(x[i],y[i]-1))==mp.end()){
				mp.insert(mk(mk(x[i],y[i]-1),3));
				if(y[i]-1==1)mp[mk(x[i],y[i]-1)]--;
				if(x[i]==1 || x[i]==n)mp[mk(x[i],y[i]-1)]--;
			}else if(y[i]!=1)mp[mk(x[i],y[i]-1)]--;
			if(x[i]!=n && mp.find(mk(x[i]+1,y[i]))==mp.end()){
				mp.insert(mk(mk(x[i]+1,y[i]),3));
				if(x[i]+1==n)mp[mk(x[i]+1,y[i])]--;
				if(y[i]==1 || y[i]==m)mp[mk(x[i]+1,y[i])]--;
			}else if(x[i]!=n)mp[mk(x[i]+1,y[i])]--;
			if(y[i]!=m && mp.find(mk(x[i],y[i]+1))==mp.end()){
				mp.insert(mk(mk(x[i],y[i]+1),3));
				if(y[i]+1==m)mp[mk(x[i],y[i]+1)]--;
				if(x[i]==1 || x[i]==n)mp[mk(x[i],y[i]+1)]--;
			}else if(y[i]!=m)mp[mk(x[i],y[i]+1)]--;
		}qi[2]=4,qi[3]=2*(n+m-4),qi[4]=1LL*(n-2)*(m-2)%mod;
		if(n==1)qi[1]=2,qi[2]=m-2,qi[3]=qi[4]=0;
		if(m==1)qi[1]=2,qi[2]=n-2,qi[3]=qi[4]=0;
		for(map<pair<int,int>,int>::iterator it=mp.begin();
		it!=mp.end();it++){
			pair<int,int> p=it->first;int q=4,x=it->second;
			//cout<<p.first<<' '<<p.second<<' '<<it->second<<endl;
			if(p.first==1 || p.first==n)q--;
			if(p.second==1 || p.second==m)q--;
			if(n==1 || m==1)q--,x--;
			qi[q]--,qi[max(0ll,x)]++;
		}//cout<<qi[0]<<','<<qi[1]<<','<<qi[2]<<','<<
		//qi[3]<<','<<qi[4]<<endl;
		if(k==2){
			ans=(s*(s-1)/2ll)%mod;
			ans=(ans-1ll*(qi[1]+2ll*qi[2]+3ll*qi[3]+4ll*qi[4])/2ll)%mod;
			printf("%lld\n",(ans+mod)%mod);
		}else{
			puts("0");
		}
	}
	return 0;
}
2022/12/28 15:56
加载中...