QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#565712#9319. Bull FarmKobicGendTL 58ms36056kbC++2011.3kb2024-09-15 22:04:212024-09-15 22:04:21

Judging History

你现在查看的是最新测评结果

  • [2024-09-15 22:04:21]
  • 评测
  • 测评结果:TL
  • 用时:58ms
  • 内存:36056kb
  • [2024-09-15 22:04:21]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
template<class T> void chmax(T& a, T b) { if (a < b) a = b; } 
template<class T> void chmin(T& a, T b) { if (a > b) a = b; } 
template<class T>
T gcd(T a, T b) {
    return b ? gcd(b, a % b) : a;
}

constexpr int mod = 998244353;
ll qpow(ll a, ll n) {
    ll res = 1;
    while (n) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

struct DSU {
    vector<int> p, siz;

    DSU() {}
    DSU(int n) {
        init(n);
    }

    void init(int n) {
        p.resize(n + 1);
        iota(p.begin(), p.end(), 0);
        siz.assign(n + 1, 1);
    }

    int find(int x) {
        while (x != p[x]) x = p[x] = p[p[x]];
        return x;
    }

    bool same(int x, int y) {
        return find(x) == find(y);
    }

    bool uno(int x, int y) {
        x = find(x), y = find(y);
        if (same(x, y)) return 0;
        siz[x] += siz[y];
        p[y] = x;
        return 1;
    }

    int size(int x) {
        return siz[find(x)];
    }
};

int read(char u, char v) {
    return (u - 48) * 50 + v - 48;    
}

const int N = 2008;

void eachT() {
    int n, l, q;
    cin >> n >> l >> q;

    vector<vector<pair<int, int>>> Es(l + 1);
    for (int i = 1; i <= l; ++i) {
        unordered_map<int, int> mp;
        vector<int> t(n + 1);
        string s;
        cin >> s;
        for (int j = 1; j <= n; ++j) {
            t[j] = read(s[j*2-2], s[j*2-1]);
            mp[t[j]] += 1;
            //cerr << t[j] << ' ';
        }
        //cerr << '\n';
        int siz = mp.size();
        if (siz < n - 1);
        else if (siz == n) {
            for (int j = 1; j <= n; ++j) {
                //cerr << "pu" << j << ' ' << t[j] << '\n';
                Es[i].emplace_back(j, t[j]);
            }
        }
        else if (siz == n - 1) {
            int zero = -1;
            for (int j = 1; j <= n; ++j) {
                if (mp[j] == 0) zero = j;
            }
            for (int j = 1; j <= n; ++j) {
                if (mp[t[j]] == 2) {
                    ///cerr << "pu" << j << ' ' << zero << '\n';
                    Es[i].emplace_back(j, zero);
                }
            }
        }
    }

    vector<vector<tuple<int, int, int>>> que(l + 1);
    for (int i = 0; i < q; ++i) {
        string s;
        cin >> s;
        int a = read(s[0], s[1]), b = read(s[2], s[3]), c = read(s[4], s[5]);
        que[c].emplace_back(a, b, i);
        //cerr << a << ' ' << b << ' ' << c << '\n';
    }

    vector<int> ans(q);
    vector<vector<int>> E(n + 1);
    for (int c = 0; c <= l; ++c) {
        //cerr << "c=" << c << '\n';
        for (auto& [u, v] : Es[c]) {
            E[v].push_back(u);  // 建反图
        }

        auto tarjan = [&](vector<vector<int>> E, int n) {
            vector<int> dfn(n + 1), low(n + 1), fa(n + 1);
            int unix = 0;
            stack<int> S;

            // Tarjan
            auto dfs = [&](auto&& self, int u) -> void {
                dfn[u] = low[u] = ++unix;       // 记录DFS序
                S.push(u);

                // DP更新low[u]
                for (auto& v : E[u]) {
                    if (!dfn[v]) self(self, v), low[u] = min(low[u], low[v]);
                    else if (!fa[v]) low[u] = min(low[u], dfn[v]);
                }

                // u是SCC的根
                if (low[u] == dfn[u]) {
                    int v;
                    do {
                        v = S.top(); S.pop();    // 出栈
                        fa[v] = u;               // 记录u的子节点的根为u
                    } while (v != u);            // 不断弹出直到根u弹出为止
                }
            };
            for (int u = 1; u <= n; ++u) {
                if (!dfn[u]) dfs(dfs, u);
            }

            vector<int> deg(n + 1);
            vector<bitset<N>> dp(n + 1);
            for (int u = 1; u <= n; ++u) {
                for (auto v : E[fa[u]]) {
                    if (fa[u] != fa[v]) deg[fa[v]] += 1;
                }
            }
            queue<int> Q;
            for (int u = 1; u <= n; ++u) {
                dp[u][u] = u;
                if (!deg[u]) Q.push(u);
            }
            while (!Q.empty()) {
                int u = Q.front(); Q.pop();
                for (auto to : E[u]) {
                    deg[to] -= 1;
                    dp[to] |= dp[u];
                    if (!deg[to]) Q.push(to);
                }
            }
            
            // 输出 dp    
            for (auto& [a, b, id] : que[c]) {
                if (dp[fa[a]][fa[b]] == 1) ans[id] = 1;
            }
        };
        tarjan(E, n);
    }

    for (int i = 0; i < q; ++i) {
        cout << ans[i];
    }
    cout << '\n';
}

// void eachT() {
//     int n;
//     cin >> n;

//     // vector<pair<int, int>> a(n);
//     // for (auto& [l, r] : a) {
//     //     cin >> l >> r;
//     // }

//     // sort(a.begin(), a.end(), 
//     //     [&](const auto&a, const auto&b) {
//     //         return a.first == b.first ? a.second > b.second : a.first < b.first;
//     //     });


//     vector<vector<int>> v(n + 2);
//     for (int i = 0; i < n; ++i) {
//         int l, r;
//         cin >> l >> r;

//         v[l].push_back(r);
//     }

//     bool ok = 1;

//     //int cntt = 0;
//     for (int l = 1; l <= n; ++l) {
//         if (v[l].empty()) {
//             ok = 0;
//             break;
//         }

//         sort(v[l].begin(), v[l].end(), greater<>());
//         int big = v[l][0];

//         for (int j = 1; j < v[l].size(); ++j) {
//             //++cntt;
//             if (v[l][j-1] == v[l][j]) {
//                 ok = 0;
//                 break;
//             }
//             int r = v[l][j];
//             v[r + 1].push_back(big);
//         }

//         if (ok == 0) break;
//     }
        
//     cout << ok << '\n';
//     //cerr << cntt << '\n';
// }


// const int N = 2008;
// int arr[N], sa[N];
// int b[N][N], sb[N][N];

// void eachT() {
//     int n;
//     cin >> n;

//     for (int i = 1; i <= n; ++i) {
//         cin >> arr[i];
//     }
    
//     auto check = [&](int x) {
//        // cerr << "\n\ncheck " << x << '\n';
//         sa[0] = 0;
//         for (int i = 1; i <= n; ++i) {
//             int a = arr[i] <= x ? 1 : -1;
//             sa[i] = sa[i - 1] + a;
//             //cerr << "a[" << i << "]=" << a << '\n';
//             //cerr << "sa[" << i << "]=" << sa[i] << '\n';
//         }

//         // return sa[n] < 0;
 
//         for (int i = 1; i <= n; ++i) {
//             for (int j = i; j <= n; ++j) {
//                 b[i][j] = sa[j] - sa[i - 1] >= 0 ? 1 : -1;
//                 //cerr << "b[" << i << "][" << j << "]=" << b[i][j] << '\n';
//                 // cerr << "b[" << i << "][" << j << "]="
//                 //   << sa[j] << '-' << sa[i-1] << "=" << b[i][j] << '\n'; 
//             }
//         }
//         for (int i = 1; i <= n; ++i) {
//             for (int j = 1; j <= n; ++j) {
//                 sb[i][j] = sb[i - 1][j] + sb[i][j - 1] - sb[i - 1][j - 1] + b[i][j];
//             }
//         }
   
//         int sum = 0;
//         for (int i = 1; i <= n; ++i) {
//             for (int j = i; j <= n; ++j) { 
//                 int c = sb[j][j] - sb[i - 1][j] - sb[j][i - 1] + sb[i - 1][i - 1] >= 0 ? 1 : -1;
//                 sum += c;
//                 //cerr << "c[" << i << "][" << j << "]=" << c << '\n';
//             }
//         }
//         return sum >= 0;
//     };

//     int l = 0, r = 1e9 + 1;
//     while (l <= r) {
//         int mid = l + r >> 1;
//         if (check(mid)) r = mid - 1;
//         else l = mid + 1;
//     }
//     cout << l << '\n';
// }

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int T = 1;
    cin >> T;

    while (T--) {
        eachT();
    }

    return 0;
}

// void eachT() {
//     int n;
//     cin >> n;

//     vector<int> a(n);
//     vector<int> alls;
//     for (int i = 0; i < n; ++i) {
//         cin >> a[i];
//         alls.push_back(a[i]);
//     }

//     vector<vector<int>> vec(n);

//     sort(alls.begin(), alls.end());
//     unique(alls.begin(), alls.end());
//     for (int i = 0; i < n; ++i) {
//         a[i] = lower_bound(alls.begin(), alls.end(), a[i]) - alls.begin();
//         //cerr << a[i] << ' ';
//         vec[a[i]].push_back(i);
//     }    

//     vector<int> lst(n), nxt(n);

//     vector<int> stk;
//     for (int i = 0; i < n; ++i) {
//         while (!stk.empty() && a[i] >= a[stk.back()]) {
//             stk.pop_back();
//         }
//         lst[i] = stk.empty() ? -1 : stk.back();
//         stk.push_back(i);
//     }

//     stk.clear();
//     for (int i = n - 1; i >= 0; --i) {
//         while (!stk.empty() && a[i] >= a[stk.back()]) {
//             stk.pop_back();
//         }
//         nxt[i] = stk.empty() ? -1 : stk.back();
//         stk.push_back(i);
//     }  

//     // for (int i = 0; i < n; ++i) {
//     //     cerr << "i=" << i << ' ' << lst[i] << ' ' << nxt[i] << '\n';
//     // }
//     // cerr << '\n';


//     vector<int> ans(n);
//     for (int j = n - 1; j >= 0; --j) {
//         for (auto& i : vec[j]) {
//             // cerr << "id = " << i << '\n';
//             int fa;
//             if (nxt[i] == -1 && lst[i] == -1) continue;
//             if (nxt[i] == -1) {
//                 fa = lst[i];
//             }
//             else if (lst[i] == -1) {
//                 fa = nxt[i];
//             }
//             else if (a[nxt[i]] > a[lst[i]]) {
//                 fa = lst[i];
//             }
//             else {
//                 fa = nxt[i];
//             }
//             // cerr << "fa " << i << " = " << fa << '\n';
//             // cerr << ans[fa] << '\n';
//             ans[i] = ans[fa] + 1;
//             // cerr << ans[i] << '\n';
//         }
//     }

//     ll anss = 0;
//     for (int i = 0; i < n; ++i) {
//         anss += ans[i];
//         // cerr << ans[i] << ' ';
//     }
//     // cerr << "\n\n";
//     cout << anss << '\n'; 
// }




// void eachT() {
//     int me;
//     cin >> me;

//     int rk = 1;
//     for (int i = 1; i < 32; ++i) {
//         int x;
//         cin >> x;

//         if (x > me) ++rk;
//     }

//     //cerr << rk;

//     int ans;
//     if (rk == 1) ans = 1;
//     else if (rk <= 5) ans = 2;
//     else if (rk <= 19) ans = 4;
//     else if (rk <= 26) ans = 8;
//     else if (rk <= 30) ans = 16;
//     else ans = 32;

//     cout << ans << '\n';
// }

// void eachT() {
//     int n;
//     cin >> n;

//     map<string, vector<string>> a;
//     while (n--) {
//         string name, id, op;
//         cin >> name >> id >> op;

//         if (op[0] == 'a') {
//             a[id].push_back(name);
//         }
//     }

//     string mx = "";
//     for (auto& [k, vec] : a) {
//         sort(vec.begin(), vec.end());
//         vec.erase(unique(vec.begin(), vec.end()), vec.end());
        
//         if (a[mx].size() < a[k].size()) {
//             mx = k;
//         }
//     }

//     cout << mx << '\n';
// }

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3588kb

input:

2
5 2 4
0305040201
0404040404
030300
020500
050102
020501
6 2 4
030603010601
010203060504
030202
060402
050602
060401

output:

1011
0100

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3644kb

input:

1
3 3 6
020202
030301
030201
020102
030203
010201
010303
020303
010202

output:

010101

result:

ok single line: '010101'

Test #3:

score: 0
Accepted
time: 58ms
memory: 4068kb

input:

200
10 10 5000
01060:04020305080709
0103070:060204050908
09070503080401060:02
050308010204090:0607
03010502040607080:09
03080109020504060:07
06050:09040302080107
07080305010409060:02
030809010:0204060507
0:060908070201050304
060700
090:03
09080:
070405
010703
0:0100
080601
030600
070206
0:0:09
08040...

output:

011110001101101111111111111111111101111111110111011110110110111011010111111111111111111101111111111110111111110111111111111101111111111110111111111111111111110001100111111111111111111111111011101111111111111111111111111111111111111111011011110100111110111111110111111100111111101110111111111101111110...

result:

ok 200 lines

Test #4:

score: 0
Accepted
time: 49ms
memory: 36056kb

input:

1
2000 1 1000000
M=:]A@8UAY7W2JJ4KEHIA[HSCQ1ENSC`JXR;F3PJ:_@41P9Z=9HR8P<<:DUXRR9^WOQFL?NZP6S@=J0^WE32=6;\U0?88]Q_RNPUMT6YU<4<S]H?:7OCQYOT4YAV1^764ENWSDBED>M7A:BI>KSIR48JQ9B=N\5T3N4A2aF0@>3TI81<G7;YE>W`NMP<:IT4CI3D0=GZC3I\CLQJQBA9BDIS9SAM55KaVA<Z@D=>:Y?CQHUQ5U3a6UVI8OKX9_FAF^7=5M85;<0;8YPAM<7Z7PP7A=N...

output:

000101000101100010001000000010010110000001000001001100000000010000100001000000101100000000010000001000000001110000010110100000111100100000001000000000011001010001000001001000100000000100011001100110010000010000101100000011111000000010000101010010000000010101000001010111100000100000000000000101000100...

result:

ok single line: '000101000101100010001000000010...0101000101000000000010101001000'

Test #5:

score: -100
Time Limit Exceeded

input:

1
2000 2000 1000000
FVAaH7GRPO;_11Da5J18@3SMG==\G8E8S^6:M4L0JH>MN5IXT>2<7WJ3U8LVJS=;;3F13>0D0>VOIIU@EPHG6ABL6;K?T1PXDERLG07]5C9^GDKG<SBMIW;`4W8P3=469TIPKH0O34523_J5C2MJ17D25Z@=K8H@M>WK<CMK7EO]BPD7B6AW741J5YIHIa1:ERSG>L3N2^F3<4F`DLE@2AA5=8GZK6:192FB736[WMV7:^DA2C:<LK040VJBM3M]WXU50`407TR_?PLF@5VL7OSL...

output:


result: