UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#201863#2395. np问题Anonyme1004491ms1384kbC++113.8kb2024-02-07 11:48:592024-02-07 15:14:26

answer

#include <bits/stdc++.h>
using namespace std;

#define QwQ330AwA return 0
#define ll long long

const int N = 405;
int n, m;
int E[N];
int u[N], v[N], c[N];

namespace Sub1 {
	int id[105][20];
	int cnt = 0;
	bool vis[105];
	void solve() {
		for (int i = 0; i < n; i++) {
			for (int j = 1; j <= E[i]; j++) id[i][j] = ++cnt;
		}
		int ans = 0;
		for (int s = 0; s < (1 << cnt); s++) {
			int tot = 0;
			for (int i = 0; i < cnt; i++) {
				if (s & (1 << i)) vis[i + 1] = 1, tot++;
				else vis[i + 1] = 0;
			}
			int flag = 1;
			for (int i = 1; i <= m; i++) {
				int u = ::u[i], v = ::v[i], c = ::c[i];
				int x = id[c][u], y = id[(c + 1) % n][v];
				if (vis[x] && vis[y]) {flag = 0; break;}
			}
			if (flag) ans = max(ans, tot);
		}
		cout << ans << '\n';
	}
}

namespace Sub2 {
	int f[55][1 << 8];
	int g[1 << 8];
	int mask[55][1 << 8];
	vector < pair <int, int> > e[55];
	void solve() {
		for (int i = 1; i <= m; i++) {
			u[i]--, v[i]--;
			e[c[i]].push_back({u[i], v[i]});
		}
		for (int i = 0; i < n; i++) {
			for (int s = 0; s < (1 << E[i]); s++) {
				int t = 0;
				for (auto qwq : e[i]) {
					int x = qwq.first, y = qwq.second;
					if (s & (1 << x)) t |= (1 << y);
				}
				t ^= ((1 << E[(i + 1) % n]) - 1);
				mask[i][s] = t;
			}
		}
		int ans = 0;
		for (int S = 0; S < (1 << E[0]); S++) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < (1 << E[i]); j++) {
					f[i][j] = -1e9;
				}
			}
			f[0][S] = __builtin_popcount(S);
			for (int i = 0; i < n - 1; i++) {
				for (int s = 0; s < (1 << E[i + 1]); s++) g[s] = -1e9;
				for (int s = 0; s < (1 << E[i]); s++) {
					if (f[i][s] < 0) continue;
					g[mask[i][s]] = max(g[mask[i][s]], f[i][s]);
				}
//				for (int s = 0; s < (1 << E[i + 1]); s++) cout << g[s] << ' ';
//				cout << endl;
				for (int j = 0; j < E[i + 1]; j++) {
					for (int s = (1 << E[i + 1]) - 1; s >= 0; s--) {
						if (!(s & (1 << j))) g[s] = max(g[s], g[s ^ (1 << j)]);
					}
				}
				for (int s = 0; s < (1 << E[i + 1]); s++) f[i + 1][s] = g[s] + __builtin_popcount(s);
				//cout << endl;
			}
			for (int s = 0; s < (1 << E[n - 1]); s++) {
				if ((mask[n - 1][s] & S) == S) ans = max(ans, f[n - 1][s]);
			}
		}
		cout << ans << '\n';
	}
}

namespace Sub3 {
	int pos[105];
	int id[105][105];
	bitset <105> mask[105], qwq;
	int tot = 0;
	int cal() {
		qwq.reset();
		int sum = 0;
		for (int i = 1; i <= tot; i++) {
			if (!((qwq & mask[pos[i]]).any())) sum++, qwq.set(pos[i]);
		}
		return sum;
	}
	mt19937 rnd(time(0));
	int now = 0, ans = 0;
	void SA(double t) {
		while (t > 1e-3) {
			int u = rnd() % tot + 1, v = rnd() % tot + 1;
			swap(pos[u], pos[v]);
			int res = cal();
			ans = max(ans, res);
			if (res > now || exp(-1.0 * (now - res) / t) > rnd() / UINT_MAX) now = res;
			else swap(pos[u], pos[v]);
			t *= 0.997;
		}
	}
	void solve() {
		for (int i = 0; i < n; i++) {
			for (int j = 1; j <= E[i]; j++) {
				id[i][j] = ++tot;
			}
		}
		//cout << tot << endl;
		for (int i = 1; i <= m; i++) {
			int uu = u[i], vv = v[i];
			uu = id[c[i]][uu], vv = id[(c[i] + 1) % n][vv];
			//cout << uu << ' ' << vv << endl;
			mask[uu].set(vv);
			mask[vv].set(uu);
		}
		for (int i = 1; i <= tot; i++) pos[i] = i;
		shuffle(pos + 1, pos + tot + 1, rnd);
		ans = now = cal();
		while (1.0 * clock() / CLOCKS_PER_SEC < 0.9) SA(1000000);
		cout << ans;
	}
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> u[i] >> v[i] >> c[i];
		c[i]--;
		E[c[i]] = max(E[c[i]], u[i]);
		E[(c[i] + 1) % n] = max(E[(c[i] + 1) % n], v[i]);
	}
	int sum = 0, mx = 0;
	for (int i = 0; i < n; i++) sum += E[i], mx = max(mx, E[i]);
	if (sum <= 11 && m <= 11) Sub1 :: solve();
	else if (sum <= 100 && mx <= 8) Sub2 :: solve();
	else Sub3 :: solve();
	QwQ330AwA;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 0ms
memory: 1288kb

input:

10 10
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 1 7
1 1 8
1 1 9
1 1 10

output:

5

result:

ok single line: '5'

Test #2:

score: 10
Accepted
time: 1ms
memory: 1284kb

input:

11 10
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 1 7
1 1 8
1 1 9
1 1 10

output:

6

result:

ok single line: '6'

Test #3:

score: 10
Accepted
time: 0ms
memory: 1384kb

input:

50 112
1 1 48
1 2 20
2 2 2
1 2 35
1 1 30
1 1 11
2 1 10
1 1 35
1 1 23
1 1 10
2 1 45
2 1 18
1 1 7
1 1 ...

output:

42

result:

ok single line: '42'

Test #4:

score: 10
Accepted
time: 0ms
memory: 1352kb

input:

33 246
1 4 13
1 2 6
3 2 14
2 4 21
1 2 7
2 4 22
3 4 10
1 7 13
1 1 10
2 2 15
3 2 10
6 2 14
2 5 10
5 1 ...

output:

55

result:

ok single line: '55'

Test #5:

score: 10
Accepted
time: 0ms
memory: 1384kb

input:

50 112
1 1 48
1 2 20
2 2 2
1 2 35
1 1 30
1 1 11
2 1 10
1 1 35
1 1 23
1 1 10
2 1 45
2 1 18
1 1 7
1 1 ...

output:

42

result:

ok single line: '42'

Test #6:

score: 10
Accepted
time: 897ms
memory: 1320kb

input:

11 118
15 13 6
3 1 7
3 1 11
1 13 5
1 21 5
1 22 5
10 1 11
28 27 6
12 1 11
1 12 10
25 10 6
7 1 11
28 1...

output:

76

result:

ok single line: '76'

Test #7:

score: 10
Accepted
time: 897ms
memory: 1380kb

input:

10 329
5 1 2
8 3 3
8 1 7
3 13 4
3 16 9
4 10 4
5 3 3
1 2 5
2 8 4
2 3 10
3 11 4
4 6 4
19 4 10
13 3 10
...

output:

69

result:

ok single line: '69'

Test #8:

score: 10
Accepted
time: 900ms
memory: 1320kb

input:

11 134
17 1 3
1 3 6
2 1 7
21 1 3
1 6 2
1 19 11
1 17 11
1 10 6
1 21 2
13 1 1
14 1 7
7 1 3
1 9 11
1 12...

output:

92

result:

ok single line: '92'

Test #9:

score: 10
Accepted
time: 898ms
memory: 1380kb

input:

10 329
5 1 2
8 3 3
8 1 7
3 13 4
3 16 9
4 10 4
5 3 3
1 2 5
2 8 4
2 3 10
3 11 4
4 6 4
19 4 10
13 3 10
...

output:

69

result:

ok single line: '69'

Test #10:

score: 10
Accepted
time: 898ms
memory: 1320kb

input:

11 125
29 21 1
1 26 11
15 1 2
25 1 9
18 16 1
29 9 1
14 1 2
26 3 1
5 1 2
28 1 2
1 4 8
28 1 9
23 1 2
2...

output:

74

result:

ok single line: '74'