QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#581239 | #9319. Bull Farm | MYdinosaur | WA | 148ms | 8044kb | C++14 | 6.2kb | 2024-09-22 11:03:56 | 2024-09-22 11:03:57 |
Judging History
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'