求调!TLE #31,#32
查看原帖
求调!TLE #31,#32
654763
smallpeople楼主2024/9/1 14:45
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int T,id,mod = 998244353;
int n,m,c,f;
char a[1005][1005];
int sx[1005][1005],sy[1005][1005];
int cntt[1005][1005];
ll ansc = 0,ansf = 0;
struct ht
{
	int x,y,cnt;
}h[1000005];

void solve(int len)
{
	for(int i = 1;i <= len;i ++)
	{
		int x = h[i].x,y = h[i].y;
		for(int j = x;j <= h[i].x + h[i].cnt - 1;j ++)
		{
			if(cntt[j][y])continue;
			
			int cnt = 0,yy = y;
			while(sx[j][yy + 1] == sx[j][yy] && yy + 1 <= m)
			{
				cnt ++;
				yy ++;
			}
			for(int k = 0;k < cnt;k ++)
				cntt[j][y + k] = cnt - k;
		}
		
		for(int j = x;j <= h[i].x + h[i].cnt - 3;j ++)
		{
			if(!cntt[j][y])continue;
			
			int bk = cntt[j][y];
			for(int jj = j + 2;jj <= h[i].x + h[i].cnt - 1;jj ++)
				ansc += (bk * cntt[jj][y]) % mod;
		}
		for(int j = x;j <= h[i].x + h[i].cnt - 3;j ++)
		{
			if(!cntt[j][y])continue;
			
			int bk = cntt[j][y];
			for(int jj = j + 2;jj <= h[i].x + h[i].cnt - 2;jj ++)
				ansf += ((bk * cntt[jj][y]) % mod * (x + h[i].cnt - 1 - jj)) % mod;
		}
	}
}

int main()
{
	cin>>T>>id;
		
	while(T --)
	{
	ansc = 0;
	ansf = 0;
	memset(a,0,sizeof a);
	memset(sx,0,sizeof sx);
	memset(sy,0,sizeof sy);
	memset(cntt,0,sizeof cntt);
	memset(h,0,sizeof h);
	cin>>n>>m>>c>>f;
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j <= m;j ++)
			cin>>a[i][j],sx[i][j] = sx[i][j - 1] + (a[i][j] - '0'),sy[i][j] = sy[i - 1][j] + (a[i][j] - '0');

	int sum = 0;
	for(int j = 1;j <= m;j ++)
	{
		int cnt = 0,i = 1;
		while(i < n)
		{
			int ii = i;
			while(i + 1 <= n)
			{
				i ++;
				if(sy[i][j] == sy[i - 1][j])cnt ++;
				else break;
			}
			cnt += !(a[ii][j] - '0');
			
			if(cnt >= 3)
			{
				h[++sum].x = ii + (a[ii][j] - '0');
				h[sum].y = j;
				h[sum].cnt = cnt;
			}
			
			cnt = 0;
		}
	}
	
	solve(sum);
	
	cout<<(ansc * c) % mod<<" "<<(ansf * f) % mod<<'\n';
	}
	
	return 0;
}

蒟蒻代码可能略有抽象,大佬见谅

2024/9/1 14:45
加载中...