QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#340364#7398. Triangle TilingDaiRuiChen007WA 26ms4116kbC++172.0kb2024-02-28 21:47:292024-02-28 21:47:29

Judging History

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

  • [2024-02-28 21:47:29]
  • 评测
  • 测评结果:WA
  • 用时:26ms
  • 内存:4116kb
  • [2024-02-28 21:47:29]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5005;
struct ZkwSegt {
	static const int N=1<<13;
	int tr[N<<1];
	void psu(int p) {
		int t=max(tr[p<<1],tr[p<<1|1]);
		tr[p]+=t,tr[p<<1]-=t,tr[p<<1|1]-=t;
	}
	void init(int n) {
		memset(tr,0,sizeof(tr));
		for(int i=1;i<=n;++i) tr[i+N]=i-1;
		for(int i=N-1;i;--i) psu(i);
	}
	void add(int l,int r) {
		for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1) {
			if(~l&1) ++tr[l^1];
			if(r&1) ++tr[r^1];
			psu(l>>1),psu(r>>1);
		}
		while(l>1) psu(l>>=1);
	}
	int qry(int l,int r) {
		int sl=0,sr=0;
		for(l+=N,r+=N;(l^r)>1;l>>=1,r>>=1) {
			sl+=tr[l],sr+=tr[r];
			if(~l&1) sl=max(sl,tr[l^1]);
			if(r&1) sr=max(sr,tr[r^1]);
		}
		int s=max(sl+tr[l],sr+tr[r]);
		while(l>1) s+=tr[l>>=1];
		return s;
	}
}	T;
char s[MAXN][MAXN],t[MAXN][MAXN];
vector <int> g[MAXN],o[MAXN];
void init(int x) {
	T.init(x);
	for(int i=1;i<=x;++i) o[i].clear();
	for(int i=1;i<=x;++i) for(int j:g[i]) {
		o[j+x-i].push_back(j);
	}
}
int n;
void solve() {
	#define qt return puts("Impossible"),void()
	scanf("%d",&n);
	for(int i=1;i<=n;++i) {
		scanf("%s",s[i]+1);
		for(int j=1;j<=i;++j) if(s[i][j]=='0') g[i].push_back(j),t[i][j]='-';
	}
	init(n);
	for(int i=1;i<=n;++i) {
		for(int j:o[i]) T.add(1,j);
		if(T.qry(1,i)>i) qt;
	}
	for(int i=n;i>1;--i) {
		if(g[i].empty()) qt;
		init(i-1);
		int lst=0,pos=0;
		for(int j=1;j<=i;++j) {
			for(int k:o[j]) T.add(1,k);
			if(s[i][j]=='0') {
				s[i-1][pos]='0',t[i-1][pos]='2',g[i-1].push_back(pos);
				for(int k=lst+1;k<=pos;++k) t[i][k]='1';
				for(int k=pos+1;k<j;++k) t[i][k]='3';
				T.add(1,pos),lst=pos=j;
			}
			if(j==i) break;
			if(T.qry(1,j)>j) qt;
			if(lst&&T.qry(1,lst)>=j) pos=j+1;
		}
		for(int j=lst+1;j<=i;++j) t[i][j]='1';
	}
	for(int i=1;i<=n;++i) printf("%s\n",t[i]+1);
}
signed main() {
	int cas;
	scanf("%d",&cas);
	while(cas--) {
		solve();
		for(int i=1;i<=n;++i) {
			g[i].clear(),o[i].clear();
			for(int j=1;j<=i;++j) s[i][j]=t[i][j]=0;
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

1
4
0
11
010
1101

output:

-
21
-3-
33-1

result:

ok ok

Test #2:

score: -100
Wrong Answer
time: 26ms
memory: 4116kb

input:

909
6
0
11
100
1111
11100
111110
7
0
11
011
1001
10111
100111
1111111
6
0
00
001
1111
11101
111111
8
1
01
111
1111
10111
101110
1101101
11111100
2
1
00
2
0
01
3
0
01
110
7
1
00
011
1010
11011
110111
1111111
8
1
11
111
1011
11010
011110
1101110
01111111
5
1
00
010
1111
10111
6
0
10
011
0101
01111
111...

output:

-
32
3--
3332
333--
33333-
Impossible
Impossible
Impossible
2
--
-
-1
-
-1
33-
Impossible
2
22
222
2-22
23-2-
-3213-
33-333-
-1111111
Impossible
Impossible
Impossible
Impossible
2
--
2
--
Impossible
-
21
--1
-
-1
Impossible
2
22
2--
-3-1
Impossible
2
-2
-1-
2111
-2111
3233-1
3--1111
3333-111
Impossi...

result:

wrong answer jury does not has a solution while user does