QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#340364 | #7398. Triangle Tiling | DaiRuiChen007 | WA | 26ms | 4116kb | C++17 | 2.0kb | 2024-02-28 21:47:29 | 2024-02-28 21:47:29 |
Judging History
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