QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#581239#9319. Bull FarmMYdinosaurWA 148ms8044kbC++146.2kb2024-09-22 11:03:562024-09-22 11:03:57

Judging History

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

  • [2024-09-22 11:03:57]
  • 评测
  • 测评结果:WA
  • 用时:148ms
  • 内存:8044kb
  • [2024-09-22 11:03:56]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
const int N = 2005, M = 1e6 + 10;
int n, l, qu, cnt = 0, tot = 0;
vector <int> re[N], v[N], vg[N];
vector <pair <int, int> > jb[N];
int vis[N], b[N], dfn[N], low[N], fa[N], tp[N], Ans[M];
bitset <N> as[N], pd[N], fg[N];
struct node{
    int a, b, v;
}qe[M];
stack <int> q;
queue <int> qh;

inline void read(int &x)
{
    char c = getchar();
    int w = 1;
    x = 0;
    while (!isdigit(c))
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (isdigit(c))
    {
        x = x * 10 + (c ^ 48);
        c = getchar();   
    }
    x = x * w;
}

int find(int x)
{
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}

void prepare()
{
    for (int i = 1; i <= n; i++) 
    {
        jb[i].clear();
        v[i].clear();
        re[i].clear();
    }
    for (int i = 1; i <= n; i++) pd[i].reset();
    read(n); read(l); read(qu);
    for (int ii = 1; ii <= l; ii++)
    {
        string s;
        cin >> s;
        
        for (int i = 1; i <= n; i++) 
        {
            vis[i] = b[i] = 0;
        }
        
        for (int i = 0; i < 2 * n; i += 2)
        {
            int x = (s[i] - '0') * 50 + (s[i + 1] - '0');
            int t = i / 2 + 1;
            vis[x] ++;
            b[t] = x;
            // re[i].push_back(x);
        }
        int p1 = 0, p2 = 0, multi = 0, zero = 0;
        for (int i = 1; i <= n; i++)
        {
            if (vis[i] > 1)
            {
                p1 += vis[i] - 1;
                multi = i;
            }
            if (vis[i] == 0) 
            {
                p2++;
                zero = i;
            }
            if (p1 > 1 || p2 > 1) break;
        }
        // cout <<ii << "    " << p1 << " " << p2 << endl;
        if (p1 > 1 || p2 > 1) continue;
        for (int i = 1; i <= n; i++)
        {
            if (p1 == 0) jb[ii].push_back({i, b[i]});
            else 
            {
                if (vis[b[i]] == 2) jb[ii].push_back({i, zero});
            }
        }
        // if (p2) jb[ii].push_back({multi, zero});
    }
    for (int i = 1; i <= qu; i++)
    {
        Ans[i] = 0;
        string s;
        cin >> s;
        qe[i].a = (s[0] - '0') * 50 + (s[1] - '0');
        qe[i].b = (s[2] - '0') * 50 + (s[3] - '0');
        qe[i].v = (s[4] - '0') * 50 + (s[5] - '0');
        re[qe[i].v].push_back(i);
        // cout << "   " << i << " " << qe[i].a << " " << qe[i].b << " " << qe[i].v << endl;
        if (qe[i].a == qe[i].b) Ans[i] = 1;
            else Ans[i] = 0;
    }
    // cout << "!!" << endl;

}

void dfs(int x)
{
    cnt++;
    low[x] = dfn[x] = cnt;
    q.push(x);
    for (int i = 0; i < v[x].size(); i++)
    {
        int y = v[x][i];
        // cout << x << " ^^  " << y << " " << endl;
        if (!dfn[y])
        {
            dfs(y);
            low[x] = min(low[x], low[y]);
        }
        else if (!fa[y]) low[x] = min(low[x], dfn[y]);
    }
    // cout << "   " << x <<  " " << low[x] << " " << dfn[x] << endl;
    if (low[x] == dfn[x])
    {
        tot++;
        // cout << "tarjan   " << x << " " << tot << " :" << endl;
        while (!q.empty())
        {
            int t = q.top();
            q.pop();
            fa[t] = x;
            // cout << "!!  " <<  t << endl;
            if (t == x) break;
        }
    }
}

void perform()
{
    for (int i = 1; i <= n; i++) fa[i] = i;
    for (int i = 1; i <= l; i++)
    {   
        // cout << i << "  : " << endl;
        for (int j = 0; j < jb[i].size(); j++)
        {
            int x = find(jb[i][j].first), y = find(jb[i][j].second);
            if (x == y) continue;
            if (!pd[x][y]) v[x].push_back(y), pd[x][y] = true;
            // cout << "jb  " << x << " " << y << endl;
        }
        for (int j = 1; j <= n; j++)
        {
            dfn[j] = low[j] = 0;
            tp[j] = 0;
        }
        tot = 0;
        cnt = 0;
        while (!qh.empty()) qh.pop();
        while (!q.empty()) q.pop();
        for (int j = 1; j <= n; j++)
        {
            
            if (!dfn[j]) dfs(j);
        }        
        for (int j = 1; j <= n; j++)
        {
            as[j].reset();
            fg[j].reset();
            as[j][j] = 1;
            if (tp[j] == 0) qh.push(j);
            vg[j].clear();
        }
        // cout << " !!" << endl; 
        // cout << endl;
        // cout << i << " :  " << endl;
        for (int j = 1; j <= n; j++)
        {
            // cout << j << " " << fa[j] << " " << endl;
            for (int k = 0; k < v[j].size(); k++)
            {
                int y = v[j][k];
                int h1 = find(j), h2 = find(y);
                if (h1 == h2) continue;
                // cout << "  jb  " << fa[j] << " " << fa[y] << endl;
                if (!fg[h1][h2]) vg[h1].push_back(h2), fg[h1][h2] = true;
                tp[h2]++;
            }
        }
        int df = 0;
        while (!qh.empty())
        {
            int x = qh.front();
            qh.pop();
            // df++;
            // if (df > n * 2) break;
            for (int j = 0; j < vg[x].size(); j++)
            {
                int y = vg[x][j];
                tp[y]--;
                as[y] |= as[x];
                if (tp[y] == 0) qh.push(y);
            }
        }
        // for (int j = 1; j <= n; j++)
        // {
        //     for (int k = 1; k <= n; k++)
        //     {
        //         cout << "As  " << i << " " << j << " " << k << " " << as[k][j] << endl;
        //     }
        // }
        for (int j = 0; j < re[i].size(); j++)
        {
            int x = re[i][j];
            
            int t1 = find(qe[x].a), t2 = find(qe[x].b);
            // cout << j << "  ??  " << t1 << " " << t2 << " " << x << endl;
            if (as[t2][t1]) Ans[x] = 1;
            else Ans[x] = 0; 
        }
    }
}


int main()
{
    
    int T;
    read(T);
    while (T > 0)
    {
        T--;
        prepare();
        perform();
        for (int i = 1; i <= qu; i++)
        {
            cout << Ans[i];
        }
        cout << endl;
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 1ms
memory: 8044kb

input:

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

output:

010101

result:

ok single line: '010101'

Test #3:

score: -100
Wrong Answer
time: 148ms
memory: 6180kb

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:

011110001101001111111111111111110101111110110111011110110110101011010001011111111111111101001101111110111111110111111111111101011111111110111111111111111111110001100101011111111111111111111011001111111101111111111111101111111111111111011011010100111110111011110111011100111111101110111111110101110110...

result:

wrong answer 1st lines differ - expected: '011110001101101111111111111111...1111111111111111101111111111111', found: '011110001101001111111111111111...1111111111111110100111111111011'