QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#266719#7733. Cool, It’s Yesterday Four Times Moretime_interspace#WA 1ms4180kbC++202.4kb2023-11-26 17:05:532023-11-26 17:05:54

Judging History

你现在查看的是最新测评结果

  • [2023-11-26 17:05:54]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:4180kb
  • [2023-11-26 17:05:53]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int p = 998244353;
#define ll long long
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define map Map
#define pb push_back
#define mp make_pair
#define fr first
#define se second
int n,m,tot;
int xm,ym,xM,yM;
char s[1010];
bool map[1010][1010];
bool vis[1010][1010];
bool flag[1010];
struct fuck{
	int deltax,deltay,size;
	bitset<2010>f;
}a[1010];
vector< pair<int,int> >tmp;
void dfs(int x,int y) {
	a[tot].size++;
	vis[x][y] = true;
	if( map[x-1][y] && !vis[x-1][y]) dfs(x-1,y);
	if( map[x][y-1] && !vis[x][y-1] ) dfs(x,y-1);
	if( map[x+1][y] && !vis[x+1][y] ) dfs(x+1,y);
	if( map[x][y+1] && !vis[x][y+1] ) dfs(x,y+1);
	xm = min( xm , x ); ym = min( ym , y );
	xM = max( xM , x ); yM = max( yM , y );
	tmp.pb(mp(x,y));
}
bool cmp(fuck a,fuck b) {
	int sza = (a.deltax+1) * (a.deltay+1) , szb = (b.deltax+1) * (b.deltay+1);
	return sza < szb;
	// return a.size < b.size
}
void work() {
	int ans = 0;
	sort(a+1,a+tot+1,cmp);
	rep(i,1,tot) flag[i] = true;
	for(int i = 1;i <= tot;++i) {
		for(int j = i+1;j <= tot;++j) if( a[i].deltax <= a[j].deltax && a[i].deltay <= a[j].deltay ) {
			for(int dx = 0; dx <= a[j].deltax - a[i].deltax; ++ dx)
				for(int dy = 0; dy <= a[j].deltay - a[i].deltay; ++dy) {
					int delta = dx*m+dy;
					if( ( (a[i].f << delta) & a[j].f ) == (a[i].f << delta)  ) {
						if( a[i].deltax == a[j].deltax &&
							a[i].deltay == a[j].deltay &&
							a[i].size == a[j].size )
							flag[j] = false;
						flag[i] = false;
					}
				}
		}
		// printf("*%d %d %d\n",i,flag[i],(int)a[i].size);
		// rep(j,0,9) printf("%d",(int)a[i].f[j]); printf("\n\n");
		if( flag[i] ) ans += a[i].size;
	}
	printf("%d\n",ans);
}
void reset() {
	rep(i,1,n) rep(j,1,m) vis[i][j] = false , map[i][j] = false;
	rep(i,1,tot) a[i].f.reset() , a[i].size = 0;
	tot = 0;
}
int main() {
	int T; scanf("%d",&T);
	while(T--) {
		reset();

		scanf("%d%d",&n,&m);
		rep(i,1,n) {
			scanf("%s",s+1);
			rep(j,1,m) map[i][j] = (s[j] == '.');
		}
		rep(i,1,n) rep(j,1,m) if(!vis[i][j] && map[i][j]) {
			tmp.clear();
			xm = max(n,m)+1; ym = max(n,m)+1;
			xM = 0; yM = 0;
			++tot;
			dfs(i,j);
			a[tot].deltax = xM - xm;
			a[tot].deltay = yM - ym;


			// printf("*%d\n",tot);
			for( auto [x,y]:tmp ) {
				int nx = x - xm,ny = y - ym;
				// printf("#%d %d\n",nx,ny);
				a[tot].f[ nx*m+ny ] = 1;
			}
		}
		work();
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 4160kb

input:

4
2 5
.OO..
O..O.
1 3
O.O
1 3
.O.
2 3
OOO
OOO

output:

3
1
0
0

result:

ok 4 lines

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 4180kb

input:

200
2 4
OOO.
OO..
2 3
OOO
.O.
3 3
O.O
OOO
OO.
4 1
.
.
O
O
1 2
.O
1 1
.
2 5
.OO..
.O.O.
2 1
O
O
1 1
O
1 3
.OO
5 1
O
O
.
O
.
5 2
O.
..
O.
.O
..
5 3
...
...
.OO
..O
OOO
3 5
..O.O
.O.O.
.OO.O
5 2
.O
OO
O.
O.
..
2 1
O
O
3 5
.O.OO
O...O
..OO.
1 5
.....
5 1
O
.
O
.
.
5 3
OOO
OO.
.OO
OO.
O.O
2 1
O
.
5 2
O.
...

output:

3
0
0
2
1
1
3
0
0
1
0
7
9
4
4
0
6
5
2
0
1
6
4
5
2
0
0
5
3
3
1
4
1
0
7
5
2
3
7
3
0
6
2
2
2
0
4
6
6
3
3
2
3
5
2
1
0
3
3
4
4
2
2
0
7
6
4
8
5
3
2
5
2
1
2
1
4
0
0
2
5
1
4
6
6
1
6
2
2
3
4
5
2
1
0
1
9
3
4
11
0
3
2
1
0
0
4
3
1
4
3
8
3
0
3
6
2
5
1
3
3
4
0
2
11
2
2
4
0
4
4
6
2
1
2
3
0
5
0
16
4
3
2
6
0
8
3
3
1...

result:

wrong answer 187th lines differ - expected: '5', found: '9'