ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#201863 | #2395. np问题 | Anonyme | 100 | 4491ms | 1384kb | C++11 | 3.8kb | 2024-02-07 11:48:59 | 2024-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'