QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#455334 | #8818. Colorful Graph 3 | zhoukangyang | WA | 15ms | 13980kb | C++14 | 3.2kb | 2024-06-26 09:32:44 | 2024-06-26 09:32:44 |
Judging History
answer
#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll long long
#define sz(a) ((int) (a).size())
#define me(a, x) memset(a, x, sizeof(a))
#define vi vector < int >
#define pb emplace_back
#define ld long double
using namespace std;
const int N = 1 << 20;
int n, k, a[N];
pair<int,int>pr[N];
int cnt[N];
struct edge {
int u, v, w;
edge (int U = 0, int V = 0, int W = 0) {
u = U;
v = V;
w = W;
}
};
int f[N], ids[N], mv[N];
inline int find(int x) {
return f[x] == x ? x : f[x] = find(f[x]);
}
void Main() {
cin >> n >> k;
L(i, 1, k) {
cin >> a[i];
pr[i]={a[i],i};
}
L(v, 1, k) {
if(a[v] >= 2) {
cout << n - 1 << '\n';
L(i, 1, n - 1)cout << i << ' ' << n << ' ' << v << '\n';
cout << '\n';
return;
}
}
cnt[0] = 0;
cnt[1] = 0;
cnt[2] = 0;
sort(pr + 1, pr + k + 1);
reverse(pr + 1, pr + k + 1);
L(i, 1, k)
mv[i] = pr[i].second,
++cnt[pr[i].first];
vector<edge>ans,nans;
L(r, 0, n * 2) {
// non-tree = y + x * (x - 1) / 2 - x
int x = 0;
while(x * (x - 1) / 2 <= r) {
++x;
}
int y = r - (x - 1) * (x - 2) / 2;
int es = r * cnt[0] + (x * (x - 1) / 2 + y) * cnt[1];
if(es < n - 1 + r) {
continue;
}
// cout << "r = " << r << ' ' << x << ' ' << y << ' ' << es << ' ' << (n - 1 + r) << endl;
int xn = 1;
if(cnt[1] > 1) {
xn = x * (x + 1) / 2;
vi delta(x + 1);
delta[0] = 0;
L(i, 1, x) {
if(i & 1) delta[i] = delta[i - 1] + i;
else delta[i] = delta[i - 1] - i;
}
L(i, 0, x)
delta[i] = (delta[i] % x + x) % x;
auto id = [&] (int i, int j) -> int {
int p = (i - 1) * x + j + 1;
return p > xn ? 0 : p;
};
L(i, 1, x)
L(j, 0, x - 1)
if(id(i, j) && id(i + 1, j))
ans.pb(edge(id(i, j), id(i + 1, j), 1));
L(i, 1, x)
L(j, 0, x - 1)
if(id(i, j) && id(i + 1, (j + delta[i]) % x))
ans.pb(edge(id(i, j), id(i + 1, (j + delta[i]) % x), 2));
} else if(cnt[1]) {
xn = x;
L(i, 1, xn)
L(j, i + 1, xn)
ans.pb(edge(i, j, 1));
} else {
xn = 1;
L(t, 1, r) {
L(i, 1, k)
ans.pb(xn + i - 1, xn + i % k, i);
xn += k - 1;
}
goto ovo;
}
L(j, 0, sz(ans) - 1) {
auto u = ans[j];
if(u.w != 1) {
nans.pb(u);
continue;
}
int lst = u.u;
L(k, 3, cnt[1])
++xn, nans.pb(lst, xn, k), lst = xn;
L(k, 1, cnt[0]) if(j >= x - 1)
++xn, nans.pb(lst, xn, k + cnt[1]), lst = xn;
nans.pb(edge(lst, u.v, u.w));
}
swap(ans,nans), nans.clear();
L(t, 1, y) {
L(i, 1, k)
ans.pb(xn + i - 1, xn + i % k, i);
xn += k - 1;
}
ovo:;
L(i, 1, xn)
f[i] = i;
L(r, 0, xn - n - 1) {
auto u = ans[r];
f[find(u.u)] = find(u.v);
}
int tot = 0;
L(i, 1, xn)
if(f[i] == i) ids[i] = ++tot;
for(auto u : ans)
if(find(u.u) != find(u.v))
nans.pb(ids[find(u.u)], ids[find(u.v)], u.w);
swap(ans, nans), nans.clear();
break;
}
cout << sz(ans) << '\n';
for(auto&u:ans)
cout << u.u << ' ' << u.v << ' ' << mv[u.w] << '\n';
}
int main() {
ios :: sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t; while(t--) Main();
return 0;
}
/*
1
6 2
1 1
*/
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 13980kb
input:
3 4 2 1 1 2 2 0 0 5 2 3 1
output:
4 1 4 2 2 3 1 3 4 1 1 2 1 2 1 2 2 2 1 1 4 1 5 1 2 5 1 3 5 1 4 5 1
result:
ok orz (3 test cases)
Test #2:
score: -100
Wrong Answer
time: 15ms
memory: 13776kb
input:
4645 2 2 0 0 2 2 0 1 2 2 1 1 3 2 0 0 3 2 0 1 3 2 1 1 3 3 0 0 0 3 3 1 0 0 3 3 1 0 1 3 3 1 1 1 4 2 0 0 4 2 1 0 4 2 1 1 4 3 0 0 0 4 3 0 0 1 4 3 0 1 1 4 3 1 1 1 4 4 0 0 0 0 4 4 0 1 0 0 4 4 1 1 0 0 4 4 1 1 1 0 4 4 1 1 1 1 5 2 0 0 5 2 1 0 5 2 1 1 5 3 0 0 0 5 3 0 1 0 5 3 1 1 0 5 3 1 1 1 5 4 0 0 0 0 5 4 0 1...
output:
2 1 2 2 2 1 1 1 1 2 2 1 1 2 1 4 1 2 2 2 1 1 2 3 2 3 2 1 3 1 2 2 1 3 1 3 2 2 2 1 3 2 2 3 1 3 1 2 3 2 3 2 3 1 1 3 1 2 3 2 3 2 3 1 1 2 1 3 3 2 3 1 2 3 2 3 1 2 2 6 1 2 2 2 1 1 2 3 2 3 2 1 3 4 2 4 3 1 4 1 2 1 1 3 1 2 4 2 4 3 1 4 1 4 2 2 3 1 3 4 1 1 2 1 5 1 2 2 2 1 1 2 3 3 3 4 2 4 2 1 4 1 2 3 1 3 2 3 4 1 ...
result:
wrong answer no path between point 1 and 3 has fewer than 1 edges colored 1 (test case 101)