QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#372576#3033. Harry Potter and the Palindromic RadiusSolitaryDream#100 ✓5381ms49388kbC++172.1kb2024-03-31 15:50:452024-03-31 15:50:46

Judging History

This is the latest submission verdict.

  • [2024-03-31 15:50:46]
  • Judged
  • Verdict: 100
  • Time: 5381ms
  • Memory: 49388kb
  • [2024-03-31 15:50:45]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
#define FOR(i,s,t) for(int i=(s),_t=(t); i<=_t; ++i)
#define DOR(i,s,t) for(int i=(s),_t=(t); i>=_t; --i)
typedef long long ll;
const int N=1e6+50;
int a[N],b[N];
int Fa[N],dis[N];
int Find(int x) {
    if(Fa[x]==x) return x;
    Find(Fa[x]);
    dis[x]^=dis[Fa[x]];
    return Fa[x]=Fa[Fa[x]];
}
int ans[N];
void solve() {
    int n;
    cin >> n;
    FOR(i,1,n) cin >> a[i];
    int p=0;
    vector<pair<int,int>> f,g;
    FOR(i,1,n) {
        if(b[p]+p>=i) {
            b[i]=min(b[p*2-i],b[p]+p-i);
        } else {
            b[i]=0;
        }
        if(i+b[i]>=p+b[p]) {
            while(b[i]<a[i] && i+b[i]+1<=n && i-b[i]-1>=1) {
                f.push_back({i-b[i]-1,i+b[i]+1});
                b[i]++;
            }
        }
        if(b[i]!=a[i]) {
            cout << "0\n";
            return ;
        }
        if(i+b[i]+1<=n && i-b[i]-1>=1) {
            g.push_back({i-b[i]-1,i+b[i]+1});
        }
        if(i+b[i]>p+b[p]) p=i;
    }
    FOR(i,1,n) Fa[i]=i,dis[i]=0;
    for(auto [x,y]: f) {
        if(Find(x)!=Find(y)) {
            if(Find(x)<Find(y)) swap(x,y);
            Fa[Find(x)]=Find(y);
        }
    }
    for(auto [x,y]: g) {
        if(Find(x)==Find(y)) {
            if(dis[x]==dis[y]) {
                cout << "0\n";
                return ;
            }
        } else {
            if(Find(x)<Find(y)) swap(x,y);
            int fx=Find(x),fy=Find(y);
            dis[fx]=1^dis[x]^dis[y];
            Fa[fx]=fy;
        }
    }
    vector<int> h;
    DOR(i,n,1) if(Find(i)==i) h.push_back(i);
    assert(h.size()<10);
    cout << (1<<h.size()) << '\n';
    FOR(o,0,(1<<h.size())-1) {
        FOR(i,0,h.size()-1) {
            ans[h[i]]=(o>>i)&1;
        }
        FOR(i,1,n) {
            Find(i);
            ans[i]=ans[Fa[i]]^dis[i];
            cout << ans[i];
        }
        cout << '\n';
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 5381ms
memory: 49388kb

input:

131112
2
0 0
2
0 1
2
0 0
2
1 0
2
0 0
2
0 1
2
0 0
2
0 1
3
0 1 0
3
0 1 1
3
0 0 0
3
0 1 0
3
0 1 0
3
0 2 0
3
0 0 0
3
1 0 0
3
0 0 0
3
1 0 0
3
0 1 0
3
0 2 0
3
0 0 0
3
0 0 1
3
0 1 0
3
0 2 0
4
0 1 1 0
4
0 1 2 0
4
0 0 1 0
4
0 0 1 1
4
0 1 0 0
4
0 1 0 1
4
0 0 0 0
4
0 0 1 0
4
0 0 1 0
4
1 0 1 0
4
0 1 1 0
4
0 1 2...

output:

4
00
01
10
11
0
4
00
01
10
11
0
4
00
01
10
11
0
4
00
01
10
11
0
4
000
010
101
111
0
4
001
011
100
110
4
000
010
101
111
4
000
010
101
111
0
4
001
011
100
110
0
4
001
011
100
110
0
4
000
010
101
111
0
4
001
011
100
110
0
4
000
010
101
111
0
4
0000
0101
1010
1111
0
4
0010
0111
1000
1101
0
4
0001
0100
...

result:

ok 401208 lines