noip題

sad_lin發表於2024-11-02

有必要每個題都記一遍嗎???

P8865 [NOIP2022] 種花

我太菜了只能寫出 80 分唉,看看怎麼玩的吧。

我們肯定想到字首和最佳化暴力查詢本行的方案數,我們又可以想到下方的方案數也可以直接字首和存下,然後就可以做到 80 分做法。

for(re int i=1;i<=n;i++){
	for(re int j=1;j<=m;j++){
		if(mp[i][j]!=1&&low[i][j]>2&&a[i][j]>1){
			for(re int k=i+2;k<=n;k++){
				if(mp[k][j]==1){
					break;
				}
				cntc+=(a[i][j]-1)*(a[k][j]-1);
				cntc%=mod;
				if(low[k][j]>1){
					cntf+=(a[i][j]-1)*(a[k][j]-1)*(low[k][j]-1);
					cntf%=mod;	
				}
			}
		}
	}
}

但是這樣的話又字首和從下到上又從上到下列舉,這樣是 O(n^2) 的,還要列舉列,我們想可以直接動態地維護來去掉這個字首和來少列舉一維。

for(int j=1;j<m;j++){
	int jil=0,jif=0;
	for(int i=1;i<=n;i++){
		if(a[i][j]==-1){
			jif=jil=0;
			continue;
		}
		cntc+=(jil*a[i][j])%mod;
		cntc%=mod;
		
		cntf+=jif;
		cntf%=mod;
		
		jif+=(a[i][j]*jil)%mod;
		jil+=max(1ll*0,a[i-1][j]);
	}
}

這段程式碼沒法寫什麼,你只要在紙上畫一畫即可得到,但是我沒想到這步。

總結:儘量最佳化演算法!!!

相關文章