QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#565712 | #9319. Bull Farm | KobicGend | TL | 58ms | 36056kb | C++20 | 11.3kb | 2024-09-15 22:04:21 | 2024-09-15 22:04:21 |
Judging History
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...