QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#411055 | #8352. 菱形覆盖 | Qingyu | 0 ✓ | 1645ms | 150436kb | C++23 | 2.8kb | 2024-05-14 20:51:54 | 2024-05-14 20:51:55 |
Judging History
你现在查看的是测评时间为 2024-05-14 20:51:55 的历史记录
- [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;
}
详细
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%