QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#337828#7398. Triangle TilingKevin5307TL 1625ms397248kbC++235.1kb2024-02-25 15:03:502024-02-25 15:03:51

Judging History

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

  • [2024-02-25 15:03:51]
  • 评测
  • 测评结果:TL
  • 用时:1625ms
  • 内存:397248kb
  • [2024-02-25 15:03:50]
  • 提交

answer

//Author: Kevin
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb emplace_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
char grid[5005][5005];
int val[5005][5005];
bool token[5005];
class segtree
{
	public:
		#define ls (x<<1)
		#define rs (ls|1)
		int mn[5005<<2];
		int tag[5005<<2];
		void build(int x,int l,int r)
		{
			mn[x]=0;
			tag[x]=0;
			if(l==r) return ;
			int mid=(l+r)/2;
			build(ls,l,mid);
			build(rs,mid+1,r);
		}
		void pushdown(int x,int l,int r)
		{
			mn[x]+=tag[x];
			if(l!=r)
			{
				tag[ls]+=tag[x];
				tag[rs]+=tag[x];
			}
			tag[x]=0;
		}
		int query(int x,int l,int r,int ql,int qr)
		{
			pushdown(x,l,r);
			if(l==ql&&r==qr)
				return mn[x];
			int mid=(l+r)/2;
			if(qr<=mid)
				return query(ls,l,mid,ql,qr);
			if(ql>mid)
				return query(rs,mid+1,r,ql,qr);
			return min(query(ls,l,mid,ql,mid),query(rs,mid+1,r,mid+1,qr));
		}
		void pushup(int x,int l,int r)
		{
			int mid=(l+r)/2;
			pushdown(ls,l,mid);
			pushdown(rs,mid+1,r);
			mn[x]=min(mn[ls],mn[rs]);
		}
		void update(int x,int l,int r,int ql,int qr,int v)
		{
			pushdown(x,l,r);
			if(l==ql&&r==qr)
			{
				tag[x]+=v;
				return ;
			}
			int mid=(l+r)/2;
			if(ql<=mid)
				update(ls,l,mid,ql,min(mid,qr),v);
			if(qr>mid)
				update(rs,mid+1,r,max(mid+1,ql),qr,v);
			pushup(x,l,r);
		}
		#undef ls
		#undef rs
}segt[5005];
char ans[5005][5005];
bool used[5005][5005];
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			string s;
			cin>>s;
			for(int j=0;j<i;j++)
				grid[i][j+1]=s[j];
		}
		for(int i=1;i<n;i++)
			for(int j=1;j<=i;j++)
				used[i][j]=0;
		for(int i=1;i<=n;i++)
			for(int j=i;j<=n;j++)
				val[i][j]=0;
		vector<pii> vec;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=i;j++)
				if(grid[i][j]=='0')
				{
					ans[i][j]='-';
					vec.pb(i,j);
					val[j][j+n-i]++;
				}
				else
					ans[i][j]='2';
		if(sz(vec)!=n)
		{
			cout<<"Impossible!\n";
			continue;
		}
		for(int len=1;len<=n;len++)
			for(int i=1,j=len;j<=n;i++,j++)
				val[i][j]+=val[i+1][j]+val[i][j-1]-val[i+1][j-1];
		bool flag=1;
		for(int len=1;len<=n;len++)
			for(int i=1,j=len;j<=n;i++,j++)
			{
				val[i][j]-=len;
				if(val[i][j]>0)
					flag=0;
				val[i][j]=-val[i][j];
			}
		srt(vec);
		for(int i=0;i<n;i++)
			if(vec[i].first<=i)
				flag=0;
		if(!flag)
		{
			cout<<"Impossible!\n";
			continue;
		}
		memset(token,0,sizeof(token));
		for(int i=1;i<=n;i++)
			if(grid[n][i]=='1')
				token[i]=1;
		for(int i=1;i<=n;i++)
			segt[i].build(1,1,n);
		for(int i=1;i<=n;i++)
			for(int j=i;j<=n;j++)
				segt[j].update(1,1,n,i,i,val[i][j]);
		bool flag_=0;
		for(int i=n;i>1;i--)
		{
			for(int j=1;j<=i;j++)
				if(token[j]&&grid[i][j]=='0')
					token[j]=0;
			static bool ntoken[5005];
			memset(ntoken,0,sizeof(ntoken));
			int lst=inf;
			for(int j=i;j>=1;j--)
			{
				flag_=0;
				if(token[j])
				{
					int mn=segt[j+n-i].query(1,1,n,1,j);
					if(mn&&!used[i-1][j]&&j!=i)
					{
						assert(j!=i);
						ntoken[j]=1;
						segt[j+n-i].update(1,1,n,1,j,-1);
						ans[i][j]='3';
					}
					else if(!mn)
					{
						int p=i;
						while(p&&grid[p][j-(i-p)]=='1')
						{
							ans[p][j-(i-p)]='1';
							p--;
							used[p][j-(i-p)]=1;
						}
						// assert(p);
						for(int k=j+n-i;k<=n;k++)
							segt[k].update(1,1,n,j-(i-p)+1,j,-1);
					}
					else
					{
						int p=i-1;
						ntoken[j-1]=1;
						used[p][j-(i-p)]=1;
						ans[i][j]='1';
						// for(int k=j+n-i;k<=n;k++)
						// 	segt[k].update(1,1,n,j-(i-p)+1,j,-1);
						if(lst==inf)
							lst=j;
						flag_=1;
					}
				}
				if(lst!=inf&&!flag_)
				{
					// cerr<<"! "<<j+1<<" "<<lst<<endl;
					for(int k=j+1+n-i;k<=n;k++)
						segt[k].update(1,1,n,j+1,min(k-n+i,lst),-1);
					lst=inf;
				}
			}
			if(lst!=inf)
			{
				// cerr<<1<<" "<<lst<<endl;
				for(int k=1+n-i;k<=n;k++)
					segt[k].update(1,1,n,1,min(k-n+i,lst),-1);
			}
			memcpy(token,ntoken,sizeof(token));
		}
		bool flag2=1;
		for(int i=1;i<=n;i++)
		{
			if(ans[i][i]=='3'||ans[i][1]=='1')
				flag2=0;
			for(int j=2;j<=i;j++)
				if(ans[i][j-1]=='3'&&ans[i][j]=='1')
					flag2=0;
			for(int j=1;j<=i;j++)
				if(ans[i][j]=='3'&&ans[i-1][j]=='2')
					flag2=0;
			for(int j=2;j<=i;j++)
				if(ans[i][j]=='1'&&ans[i-1][j-1]=='2')
					flag2=0;
		}
		if(!flag2)
		{
			cout<<"Impossible!\n";
			continue;
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=i;j++)
				cout<<ans[i][j];
			cout<<'\n';
		}
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 13828kb

input:

1
4
0
11
010
1101

output:

-
21
-3-
33-1

result:

ok ok

Test #2:

score: 0
Accepted
time: 3ms
memory: 13956kb

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-...

result:

ok ok

Test #3:

score: 0
Accepted
time: 6ms
memory: 15960kb

input:

500
10
0
10
110
1110
11101
011111
0111111
11101111
111011111
1111111011
10
0
10
110
1011
11101
111110
1011111
11111101
111110111
1111111110
10
0
10
011
1011
11101
111011
0111111
11110111
111110111
1111110111
10
0
01
011
0111
01111
101111
1110111
11011111
110111111
1111111011
10
0
01
110
0111
11101
1...

output:

-
3-
33-
333-
333-1
-11111
-111111
333-1111
333-11111
3333333-11
-
3-
33-
3-11
333-1
33333-
3-11111
333333-1
33333-111
333333333-
-
3-
-11
3-11
333-1
333-11
-111111
3333-111
33333-111
333333-111
-
-1
-11
-111
-1111
3-1111
333-111
33-11111
33-111111
3333333-11
-
-1
33-
-111
333-1
33333-
3-11111
33-11...

result:

ok ok

Test #4:

score: 0
Accepted
time: 3ms
memory: 13952kb

input:

500
10
0
11
111
1111
11111
101101
1111100
10111011
110111110
1111110111
10
1
00
101
0101
10110
111110
1111111
11111111
111111100
1111111111
10
1
11
111
1111
11010
011111
0111110
11011111
101111101
1101111101
10
0
01
100
1111
11010
111110
1110110
11111111
111111111
1011111111
10
0
10
100
1010
11111
1...

output:

-
32
322
3222
32222
3-22-2
32123--
3-213-11
33-33333-
333333-111
Impossible!
2
22
222
2222
22-2-
-22121
-12213-
33-22111
3-11233-1
33-11333-1
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
2
-2
212
2212
--212
3-121-
333-211
-1111211
3-1111321
3333333--1
Impossible!
2
2-
2-1
2211
2233-
2...

result:

ok ok

Test #5:

score: 0
Accepted
time: 2ms
memory: 11820kb

input:

500
10
0
00
110
0110
11101
001111
1110111
11111111
111111111
1111111111
10
1
00
111
0100
00011
111101
1111011
11111111
111111111
1111111111
10
1
00
001
0001
01001
111111
1111111
11111111
111111111
1111111111
10
1
00
111
0100
01001
111111
0011111
11111111
111111111
1111111111
10
0
00
111
1011
10100
0...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
...

result:

ok ok

Test #6:

score: 0
Accepted
time: 5ms
memory: 18052kb

input:

250
20
0
01
101
1011
01111
111110
1111011
11110111
011111111
1111111101
11111111110
111110111111
1111111111110
11111111111101
111111111110111
1111111111011111
11111111111011111
011111111111111111
1111111110111111111
11111111110111111111
20
0
01
101
1110
11110
101111
1111011
11011111
011111111
111011...

output:

-
-1
3-1
3-11
-1111
33333-
3333-11
3333-111
-11111111
33333333-1
3333333333-
33333-111111
333333333333-
333333333333-1
33333333333-111
3333333333-11111
33333333333-11111
-11111111111111111
333333333-111111111
3333333333-111111111
-
-1
3-1
333-
3333-
3-1111
3333-11
33-11111
-11111111
333-111111
33333...

result:

ok ok

Test #7:

score: 0
Accepted
time: 0ms
memory: 13900kb

input:

250
20
1
01
101
1010
11101
111111
1111111
00111111
111111111
1110011111
11111101111
111111111111
1111111111111
11011111111111
111111111111111
1111110110111111
11011111101111111
111111111110111111
1111111111111011011
01111111111111011111
20
1
10
111
1111
11111
111110
1001111
11111111
111101101
110111...

output:

2
-2
3-2
3-1-
333-1
211111
2211111
--211111
211211111
233--11111
233333-1111
232111111111
2322111111111
23-23321111111
232133233211111
232333-33-211111
23-333333-1211111
23333333333-321111
2333333333333-33-11
-3333333333333-11111
Impossible!
Impossible!
Impossible!
2
22
2--
2211
223-1
223211
2232211...

result:

ok ok

Test #8:

score: 0
Accepted
time: 3ms
memory: 13956kb

input:

250
20
0
10
011
0110
10001
010111
1111111
11111111
111110111
1110111111
10111111111
111101111111
1111111110111
11111111111111
111111110111111
1011111111110111
11111110111111111
111111111011111111
1111111111111111111
11111111111111111111
20
1
11
100
1111
01101
100011
0001111
10110111
010011111
010111...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
...

result:

ok ok

Test #9:

score: 0
Accepted
time: 10ms
memory: 28584kb

input:

50
100
1
11
110
0101
11101
011111
1111111
11111111
111111111
0111111111
01111101111
111111111111
1111111111111
11111111111111
111111110111110
1111111111111111
01111111111111101
111111111111111111
1111110111111111111
11111111101111111111
110111111111011111111
1111111111111111111111
111111011111111111...

output:

Impossible!
2
22
-2-
213-
22111
222111
2-23-11
22121111
2-213-111
2212111111
22212111111
222322111111
22-3-22111111
22333--2111111
22211111333-111
222333333-111111
22221111111111111
22-221111111111111
2221221111111111111
22221221111111111111
222221221111111111111
222-221221111111111111
2222122123333...

result:

ok ok

Test #10:

score: 0
Accepted
time: 0ms
memory: 14212kb

input:

50
100
0
01
111
1011
01111
111111
1111111
11110001
111000111
1111111111
01110101111
111111111111
1111011111111
11101111111111
111111011111111
1111011111011101
11101111011111110
111111111111111111
0111110111111011111
11111111111111111111
110111011111111101110
0111111111111110110111
111111111110011111...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
Impossible!
...

result:

ok ok

Test #11:

score: 0
Accepted
time: 780ms
memory: 206936kb

input:

5
1000
0
01
101
1101
11101
111110
0111111
11011111
111111110
1110111111
11111110111
111111111110
1111111101111
11011111111111
111111101111111
1101111111111111
10111111111111111
101111111111111111
1011111111111111111
11101111111111111111
111111111111111111011
1111111011111111111111
111111011111111111...

output:

-
-1
3-1
33-1
333-1
33333-
-111111
33-11111
33333333-
333-111111
3333333-111
33333333333-
33333333-1111
33-11111111111
3333333-1111111
33-1111111111111
3-111111111111111
3-1111111111111111
3-11111111111111111
333-1111111111111111
333333333333333333-11
3333333-11111111111111
333333-1111111111111111
3...

result:

ok ok

Test #12:

score: 0
Accepted
time: 158ms
memory: 201240kb

input:

5
1000
0
00
100
1110
10111
111111
0111101
11111111
111101111
1111111111
11111111010
101111111101
1111111111111
11111111111111
111111111111111
0111111111110111
11111110111011111
111111111111111111
1111111111111111111
11111111111111110011
111111111111111111111
1111110111111111111011
111011111111111111...

output:

Impossible!
-
21
221
2221
-2-21
21213-
2212111
22212111
-22212111
2122212111
22122212111
222122212111
-222122213-11
212-2122211111
221212122211111
222121-1-2321111
22221-11113-21111
22-23333333213333-
22213333333-3333-11
222333333333333333-1
222211111111111111111
2222211111111111111111
2222233333333...

result:

ok ok

Test #13:

score: 0
Accepted
time: 10ms
memory: 44216kb

input:

5
1000
0
10
001
1100
00110
111110
1111111
11111111
111010011
1111111111
11111111111
111001011111
1111011100111
10111111110111
111110111010111
1111111111111111
11111101110110111
111101110111111111
1111011111110111111
10111111111011111101
011111111111111111111
1111111111111111111110
111111111111111111...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #14:

score: 0
Accepted
time: 8ms
memory: 43716kb

input:

5
1000
1
00
111
1101
11111
100101
0010101
10110011
111111011
1101110001
11101111111
101110111101
1111111111011
01111111100101
111011111111111
1111111111110111
11111100111101011
111111010100111111
1111110101111011111
11111111101110111101
111011111111111110111
1011111111011111110110
111111111111111111...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #15:

score: 0
Accepted
time: 6ms
memory: 41992kb

input:

5
1000
0
11
100
1110
01101
111001
1111111
11011000
110011011
0111111111
11100110111
001101111100
1111111011111
10111101101101
011101110111100
1010110111011111
11101110010101111
101001111111111011
1111111111110111111
11111111111111111111
111111111111111011111
1111111111111111111111
101111101011111111...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #16:

score: 0
Accepted
time: 12ms
memory: 42056kb

input:

5
1000
0
00
100
0110
01000
111010
1111111
00001001
111011110
1111011001
11111001011
111111111111
0110010111010
10101001000010
100101011000011
1111111111111111
11111111111111111
010011011110100011
1111110111011111011
11111011111111110111
111110111011111111111
1101101001101101100010
111111111111111011...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #17:

score: 0
Accepted
time: 10ms
memory: 46648kb

input:

5
1000
0
00
100
0000
00001
001001
0001101
11011010
011111110
1000000100
10000110011
110111111001
1001011111111
11101111101011
000000000000001
1100100000101000
01000100001000011
111111101110111111
0100001100000001000
10000000001000000100
000001000000000000000
1100000010010111000010
000010001010001001...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #18:

score: 0
Accepted
time: 10ms
memory: 41888kb

input:

5
1000
1
00
000
0011
00000
100001
1110010
11111101
001000000
1001010100
11101011111
110100011101
1111111111111
00100000000000
111000111110011
0001000100001000
00000100010100000
111001011001001000
0000001000001000100
00001000001000001000
100000110000010010000
1111111011101001110110
111011101110111011...

output:

Impossible!
Impossible!
Impossible!
Impossible!
Impossible!

result:

ok ok

Test #19:

score: 0
Accepted
time: 409ms
memory: 199784kb

input:

5
1000
1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
11111111111111
111111111111111
1111111111111111
11111111111111111
111111111111111111
1111111111111111111
11111111111111111111
111111111111111111111
1111111111111111111111
111111111111111111...

output:

2
22
222
2222
22222
222222
2222222
22222222
222222222
2222222222
22222222222
222222222222
2222222222222
22222222222222
222222222222222
2222222222222222
22222222222222222
222222222222222222
2222222222222222222
22222222222222222222
222222222222222222222
2222222222222222222222
22222222222222222222222
2...

result:

ok ok

Test #20:

score: 0
Accepted
time: 426ms
memory: 208896kb

input:

5
1000
1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
11111111111111
111111111111111
1111111111111111
11111111111111111
111111111111111111
1111111111111111111
11111111111111111111
111111111111111111111
1111111111111111111111
111111111111111111...

output:

2
22
222
2222
22222
222222
2222222
22222222
222222222
2222222222
22222222222
222222222222
2222222222222
22222222222222
222222222222222
2222222222222222
22222222222222222
222222222222222222
2222222222222222222
22222222222222222222
222222222222222222222
2222222222222222222222
22222222222222222222222
2...

result:

ok ok

Test #21:

score: 0
Accepted
time: 1594ms
memory: 397248kb

input:

2
2000
0
10
101
1110
10111
111110
1011111
11111011
111011111
1111111110
11101111111
111111110111
1111111111110
11111111110111
111111111110111
1111111101111111
11011111111111111
111111011111111111
0111111111111111111
11111111111111101111
101111111111111111111
1111111111110111111111
111111111011111111...

output:

-
3-
3-1
333-
3-111
33333-
3-11111
33333-11
333-11111
333333333-
333-1111111
33333333-111
333333333333-
3333333333-111
33333333333-111
33333333-1111111
33-11111111111111
333333-11111111111
-111111111111111111
333333333333333-1111
3-1111111111111111111
333333333333-111111111
333333333-1111111111111
3...

result:

ok ok

Test #22:

score: 0
Accepted
time: 1625ms
memory: 395176kb

input:

2
2000
0
01
110
1011
10111
011111
1111110
11101111
101111111
1111101111
11011111111
011111111111
1011111111111
11111111101111
111101111111111
0111111111111111
11111111101111111
111111111110111111
1111111101111111111
11111111101111111111
111111111111011111111
1111111111011111111111
111011111111111111...

output:

-
-1
33-
3-11
3-111
-11111
333333-
333-1111
3-1111111
33333-1111
33-11111111
-11111111111
3-11111111111
333333333-1111
3333-1111111111
-111111111111111
333333333-1111111
33333333333-111111
33333333-1111111111
333333333-1111111111
333333333333-11111111
3333333333-11111111111
333-1111111111111111111
-...

result:

ok ok

Test #23:

score: 0
Accepted
time: 1616ms
memory: 395368kb

input:

2
2000
0
10
011
0111
11110
110111
1110111
10111111
111101111
1111111011
11111011111
111101111111
1111111111110
11101111111111
111011111111111
1111111101111111
11111110111111111
110111111111111111
1111111111110111111
11111110111111111111
111111011111111111111
1111111111111111111110
111111110111111111...

output:

-
3-
-11
-111
3333-
33-111
333-111
3-111111
3333-1111
3333333-11
33333-11111
3333-1111111
333333333333-
333-1111111111
333-11111111111
33333333-1111111
3333333-111111111
33-111111111111111
333333333333-111111
3333333-111111111111
333333-11111111111111
333333333333333333333-
33333333-11111111111111
3...

result:

ok ok

Test #24:

score: -100
Time Limit Exceeded

input:

1
5000
0
10
011
1011
10111
111011
1111101
10111111
110111111
1111101111
11011111111
111101111111
1011111111111
11111111101111
111111111011111
1111111111011111
11011111111111111
111111111011111111
1111111111101111111
01111111111111111111
111111111111111110111
1111111111111111101111
111111111111111011...

output:


result: