QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#337791 | #7398. Triangle Tiling | Kevin5307 | TL | 37ms | 36440kb | C++20 | 4.7kb | 2024-02-25 14:40:32 | 2024-02-25 14:40:33 |
Judging History
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!"<<endl;
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!"<<endl;
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]);
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));
for(int j=i;j>=1;j--)
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);
}
}
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!"<<endl;
continue;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
cout<<ans[i][j];
cout<<endl;
}
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 11860kb
input:
1 4 0 11 010 1101
output:
- 21 -3- 33-1
result:
ok ok
Test #2:
score: 0
Accepted
time: 0ms
memory: 11800kb
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: 3ms
memory: 15936kb
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: 2ms
memory: 14124kb
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: 3ms
memory: 13904kb
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: 13ms
memory: 14236kb
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: 7ms
memory: 14004kb
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: 14000kb
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: 37ms
memory: 36440kb
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: 4ms
memory: 17960kb
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: -100
Time Limit Exceeded
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...