QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#411055#8352. 菱形覆盖Qingyu0 ✓1645ms150436kbC++232.8kb2024-05-14 20:51:542024-05-14 20:51:55

Judging History

你现在查看的是测评时间为 2024-05-14 20:51:55 的历史记录

  • [2024-05-14 20:56:28]
  • 管理员手动重测该提交记录
  • 测评结果:100
  • 用时:1679ms
  • 内存:150864kb
  • [2024-05-14 20:55:01]
  • 管理员手动重测该提交记录
  • 测评结果:0
  • 用时:1670ms
  • 内存:150560kb
  • [2024-05-14 20:53:51]
  • 管理员手动重测该提交记录
  • 测评结果:0
  • 用时:1686ms
  • 内存:118560kb
  • [2024-05-14 20:51:55]
  • 评测
  • 测评结果:0
  • 用时:1645ms
  • 内存:150436kb
  • [2024-05-14 20:51:54]
  • 提交

answer

#include<bits/stdc++.h>

#define pb push_back
#define mp make_pair
#define fi first
#define se second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

template <typename T> bool chkmax(T &x,T y){return x<y?x=y,true:false;}
template <typename T> bool chkmin(T &x,T y){return x>y?x=y,true:false;}

int readint(){
	int x=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

struct node{
	int val,maxa;
}t[20000];

int n,sum;
int lf[5005][5005];
char s[5005][5005],ans[5005][5005];
vector<int> h[5005];

void update(int id){
	t[id].val=t[id<<1].val+t[id<<1|1].val;
	t[id].maxa=max(t[id<<1].maxa,t[id<<1|1].maxa+t[id<<1].val);
}

void build(int id,int l,int r){
	if(l==r) return (void)(t[id].val=t[id].maxa=1);
	int mid=(l+r)/2;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	update(id);
}

void change(int id,int l,int r,int x,int c){
	if(l==r) return (void)(t[id].val+=c,t[id].maxa+=c);
	int mid=(l+r)/2;
	if(x<=mid) change(id<<1,l,mid,x,c);
	else change(id<<1|1,mid+1,r,x,c);
	update(id);
}

int query(int id,int l,int r,int x){
	if(l==r) return l+1;
	int mid=(l+r)/2;
	if(t[id<<1].maxa>=x) return query(id<<1,l,mid,x);
	else return query(id<<1|1,mid+1,r,x-t[id<<1].val);
}

bool getleft(int i,int j){
	for(auto x:h[i-1]){
		if(x>j-i+1) break;
		change(1,1,n,x,-1);
		sum++;
	}
	if(sum>j-i+1) return false;
	if(sum==j-i+1) lf[j][j-i+1]=1;
	else{
		if(t[1].maxa<j-i+1-sum) lf[j][j-i+1]=j-i+2;
		else lf[j][j-i+1]=query(1,1,n,j-i+1-sum);
	}
	return true;
}

int main(){
	n=readint();
	for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
	for(int i=0;i<=n;i++) h[i].clear();
	for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) if(s[i][j]=='0') h[i-j].pb(j),ans[i][j]='-';
	bool fl=0;
	for(int i=n;i>=2;i--){
		vector<int> v(0);
		for(int j=1;j<=i;j++) if(s[i][j]=='0') v.pb(j);
		if(!v.size()){
			fl=1;
			break;
		}
		for(int j=1;j<v[0];j++) ans[i][j]='3';
		for(int j=v[v.size()-1]+1;j<=i;j++) ans[i][j]='1';
		build(1,1,n);
		sum=0;
		for(int j=1;j<v[0];j++){
			if(!getleft(i-j,i-1)){
				fl=1;
				break;
			}
		}
		if(fl) break;
		for(int j=1;j<v.size();j++){
			int p1=v[j-1],p2=v[j],pos=p1;
			for(int k=p1;k<p2;k++){
				if(!getleft(i-k,i-1)){
					fl=1;
					break;
				}
				if(lf[i-1][k]<=p1) pos=k+1;
			}
			if(fl) break;
			if(pos==p2){
				fl=1;
				break;
			}
			s[i-1][pos]='0';
			ans[i-1][pos]='2';
			change(1,1,n,pos,-1);
			sum++;
			for(int k=p1+1;k<=pos;k++) ans[i][k]='1';
			for(int k=pos+1;k<p2;k++) ans[i][k]='3';
		}
		if(fl) break;
	}
	if(fl){
		printf("Impossible!\n");
		return 0;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++) putchar(ans[i][j]);
		puts("");
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 5
Accepted
time: 1ms
memory: 7820kb

input:

5
0
00
111
1110
11011

output:

Impossible!

result:

ok Correct!

Test #2:

score: -5
Wrong Answer
time: 0ms
memory: 8056kb

input:

5
1
01
110
0111
10011

output:

2
-2
21-
-211
3--11

result:

wrong answer A triangle that is cut is covered.

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Wrong Answer

Test #26:

score: 0
Wrong Answer
time: 694ms
memory: 150308kb

input:

5000
0
10
101
1101
01111
111101
1111011
11111101
111111101
1111111011
11101111111
101111111111
1111011111111
11111111111011
111011111111111
1111111111111101
11111111110111111
111111111011111111
1111101111111111111
11111111101111111111
111111111111110111111
1111111111111111101111
11110111111111111111...

output:

-
3-
3-1
33-1
-1111
3333-1
3333-11
333333-1
3333333-1
3333333-11
333-1111111
3-1111111111
3333-11111111
33333333333-11
333-11111111111
33333333333333-1
3333333333-111111
333333333-11111111
33333-1111111111111
333333333-1111111111
33333333333333-111111
33333333333333333-1111
3333-111111111111111111
3...

result:

wrong answer A triangle that is cut is covered.

Subtask #5:

score: 0
Wrong Answer

Test #29:

score: 0
Wrong Answer
time: 1645ms
memory: 150436kb

input:

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

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:

wrong answer A triangle that is cut is covered.

Subtask #6:

score: 0
Skipped

Dependency #3:

0%