avatar

杂题(四)

大家好!欢迎收看杂题(四)!《杂题》系列陪伴大家度过了很久的时光,这真是神奇呢


syc437 树形dp

http://119.28.3.174/contest/138/problem/437

我看错题了!我以为可以不连续的播放!

那么,一个点开始的时间,一定是从他开始的一条路径的点权和。对此dpdp即可。

复杂度O(n2logn)O(n^2logn)


syc435 交互/思维/随机

http://119.28.3.174/contest/138/problem/435

一点也不会!

最优方法是插值!自己定一个模数,看成1616次多项式。

http://119.28.3.174/submission/58050

题解就是,对于随机集合,求出他们的异或和。如果把所代表的集合插进线性基,增秩的概率很高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <bits/stdc++.h>
#define ld double
#define ull unsigned long long
#define ll long long
#define pii pair <int, int>
#define iiii pair <int, pii >
#define mp make_pair
#define INF 1000000000
#define rep(i, x) for(int (i) = 0; (i) < (x); (i)++)
inline int getint() {
int x = 0, p = 1; char c = getchar();
while (c <= 32) c = getchar();
if (c == 45) p = -p, c = getchar();
while (c > 32) x = x * 10 + c - 48, c = getchar();
return x * p;
}
using namespace std;
const int mod = 1e9 + 7;
inline void reduce(int &x) { x += x >> 31 & mod; }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
//ruogu_alter
const unsigned int s = (1 << 16) - 1;
//
vector<int> encode(vector<int> v, int lim) {
mt19937 rnd(time(0));
vector<int> ans;
vector<unsigned int> vv;
rep(i, 8) {
vv.emplace_back((unsigned int)v[i] >> 16);
vv.emplace_back((unsigned int)v[i] & s);
}
int c = 0;
for (unsigned int &to : vv) to = (to << 16) + (1 << (c++));
rep(tt, 1000) {
unsigned now = 0;
for (unsigned int to : vv) if (rnd() & 1) now ^= to;
if (!now) { --tt; continue; }
ans.emplace_back(now);
}
return ans;
}
vector<int> decode(int (*const arr)(int), int n, int lim) {
int rnk = 0;
unsigned int b[16];
memset(b, 0, sizeof(b));
int *seed = new int;
mt19937 rnd(time(0) + (ll)seed);
rep(tt, lim) {
unsigned int x = arr(rnd() % n);
rep(i, 16) if (x >> i & 1) {
if (!b[i]) {
b[i] = x;
++rnk;
break;
}
x ^= b[i];
}
if (rnk == 16) {
for (int i = 15; i >= 0; i--) {
for (int j = i - 1; j >= 0; j--) {
if (b[j] >> i & 1) {
b[j] ^= b[i];
}
}
}
vector<int> res;
rep(i, 16) b[i] >>= 16;
rep(i, 8) {
res.emplace_back((b[i << 1] << 16) | b[i << 1 | 1]);
}
return res;
}
}
return vector<int>(8);
}

还有什么问题吗,欢迎在评论区和小编讨论哦!

文章作者: ruogu
文章链接: http://ruogu-alter.github.io/2020/07/16/%E6%9D%82%E9%A2%98%EF%BC%88%E5%9B%9B%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ruogu's blog

评论