QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#876248 | #853. Flat Organization | asdfsdf | WA | 10ms | 10108kb | C++23 | 2.7kb | 2025-01-30 19:02:37 | 2025-01-30 19:02:43 |
Judging History
answer
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef long double ld;
#define MAX 2020
#define MAXS 20
#define BMAX 35
#define MOD 998244353
#define INF 1'000'100'000'000'000
#define TC 1
#define ln '\n'
#define bb ' '
ll mp[MAX][MAX];
vector<int> adj[MAX];
stack<int> S;
int cnt;
int low[MAX], ord[MAX], vis[MAX];
int col[MAX];
vector<vector<int>> scc;
void dfs(int x) {
low[x] = ord[x] = ++cnt;
vis[x] = 1;
S.push(x);
for (auto v : adj[x]) {
if (!ord[v]) {
dfs(v);
low[x] = min(low[x], low[v]);
}
else if (vis[v]) low[x] = min(low[x], ord[v]);
}
if (low[x] == ord[x]) {
int t;
vector<int> v;
while (S.size()) {
t = S.top();
S.pop();
v.push_back(t);
col[t] = scc.size();
vis[t] = 0;
if (t == x) break;
}
scc.push_back(v);
}
}
ll C[MAX][MAX];
pii mv[MAX][MAX];
ll dp[MAX];
int path[MAX];
void solve() {
int N;
cin >> N;
int i, j;
scc.clear();
cnt = 0;
S = stack<int>();
for (i = 1; i <= N; i++) low[i] = ord[i] = vis[i] = col[i] = 0, adj[i].clear();
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
cin >> mp[i][j];
if (mp[i][j]) adj[i].push_back(j);
}
}
for (i = 1; i <= N; i++) if (!ord[i]) dfs(i);
int S = scc.size();
vector<int> sord;
for (i = 0; i < S; i++) sord.push_back(i);
sort(sord.begin(), sord.end(), [&](int i, int j) {return mp[scc[i][0]][scc[j][0]]; });
for (i = 0; i < S; i++) {
for (j = i + 1; j < S; j++) {
C[i][j] = INF;
for (auto u : scc[sord[i]]) for (auto v : scc[sord[j]]) {
if (C[i][j] > mp[u][v]) {
C[i][j] = mp[u][v];
mv[i][j] = pii(u, v);
}
}
}
}
int k;
for (k = S - 1; k > 1; k--) {
for (i = 0; i < S; i++) {
j = i + k;
if (j >= S) break;
if (C[i + 1][j] > C[i][j]) {
C[i + 1][j] = C[i][j];
mv[i + 1][j] = mv[i][j];
}
if (C[i][j - 1] > C[i][j]) {
C[i][j - 1] = C[i][j];
mv[i][j - 1] = mv[i][j];
}
}
}
for (i = 1; i < S; i++) {
dp[i] = C[0][i];
path[i] = 0;
for (j = 0; j < i; j++) {
ll nv = dp[j] + C[j][i];
if (dp[i] > nv) {
dp[i] = nv;
path[i] = j;
}
}
}
int v = S - 1;
vector<int> pv;
while (v) {
pv.push_back(v);
v = path[v];
}
reverse(pv.begin(), pv.end());
int p = 0;
cout << "YES" << ln;
cout << pv.size() << bb << dp[S - 1] << ln;
for (auto v : pv) {
auto& pi = mv[p][v];
cout << pi.first << bb << pi.second << ln;
p = v;
}
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0);
int T;
cin >> T;
while (T--) solve();
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 7912kb
input:
1 5 0 1 0 6 11 0 0 1 6 12 2 0 0 7 12 0 0 0 0 4 0 0 0 0 0
output:
YES 2 10 2 4 4 5
result:
ok OK!
Test #2:
score: -100
Wrong Answer
time: 10ms
memory: 10108kb
input:
100 5 0 1 0 6 11 0 0 1 6 12 2 0 0 7 12 0 0 0 0 4 0 0 0 0 0 1 0 2 0 0 7 0 2 0 1000000000 0 0 3 0 0 5 6 0 0 0 7 0 3 0 4 6 0 0 0 0 1 0 3 0 4 0 0 0 0 6 3 0 3 0 0 0 10 0 6 3 0 0 3 0 1999999998 1999999999 0 0 1999999998 0 0 0 50 0 105800 801 1800 64800 0 259200 288801 72201 12801 125000 20001 28801 33800 ...
output:
YES 2 10 2 4 4 5 YES 0 0 YES 1 7 2 1 YES 1 1000000000 1 2 YES 0 0 YES 1 4 1 2 YES 1 3 3 2 YES 2 9 2 3 3 1 YES 1 1999999999 1 3 YES 3 602 4 33 11 47 34 39 YES 3 649 27 12 32 45 17 29 YES 5 1209 1 18 14 35 35 4 4 25 25 12 YES 3 844 3 8 1 41 14 21 YES 3 866 17 35 35 44 46 26 YES 4 1066 10 28 36 24 24 2...
result:
wrong answer Test 3: Contestant claims to have a found a solution on a NO input