QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#455334#8818. Colorful Graph 3zhoukangyangWA 15ms13980kbC++143.2kb2024-06-26 09:32:442024-06-26 09:32:44

Judging History

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

  • [2024-06-26 09:32:44]
  • 评测
  • 测评结果:WA
  • 用时:15ms
  • 内存:13980kb
  • [2024-06-26 09:32:44]
  • 提交

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)