Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 27d7020

Browse files
committed
「蓝桥」1130 第 23 场小白/强者赛 4-5-9
1 parent 76463ec commit 27d7020

File tree

3 files changed

+280
-0
lines changed

3 files changed

+280
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
typedef long long ll;
5+
6+
vector<vector<int>> adj;
7+
vector<int> tag;
8+
int ans = 1e9;
9+
10+
// 当前节点,祖先分岔路数量,父亲id
11+
// 返回当前节点的子树是否全部都是
12+
int dfs(int r, int fx, int f) {
13+
if (adj[r].size() == 1) {
14+
if (tag[r]) ans = min(ans, fx);
15+
return tag[r];
16+
}
17+
int nfx = adj[r].size() >= 3;
18+
if (r == 0) nfx = adj[r].size() >= 2;
19+
int tg = 1;
20+
for (const auto &tox: adj[r]) {
21+
if (tox == f) continue;
22+
tg &= dfs(tox, fx + nfx, r);
23+
}
24+
if (tg) ans = min(ans, fx);
25+
return tg;
26+
}
27+
28+
void solve() {
29+
int n;
30+
cin >> n;
31+
32+
adj = vector<vector<int>>(n);
33+
tag = vector<int>(n, 0);
34+
for (int i = 0; i < n - 1; ++i) {
35+
int l, r;
36+
cin >> l >> r;
37+
l--;
38+
r--;
39+
adj[l].push_back(r);
40+
adj[r].push_back(l);
41+
}
42+
int m;
43+
cin >> m;
44+
for (int i = 0; i < m; ++i) {
45+
int x;
46+
cin >> x;
47+
x--;
48+
tag[x] = 1;
49+
}
50+
dfs(0, 0, -1);
51+
cout << ans << endl;
52+
}
53+
54+
signed main() {
55+
ios::sync_with_stdio(false);
56+
cin.tie(nullptr);
57+
58+
int t = 1;
59+
// cin >> t;
60+
while (t--) solve();
61+
return 0;
62+
}
63+
/*
64+
掩体计划【算法赛】
65+
*/
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
typedef long long ll;
5+
6+
void solve() {
7+
int n, k;
8+
cin >> n >> k;
9+
10+
vector<int> a(n);
11+
for (int i = 0; i < n; ++i) {
12+
cin >> a[i];
13+
}
14+
int ans = 1;
15+
for (int i = 0; i <= k; ++i) {
16+
int x = a[i];
17+
for (int j = 1; j * j <= x; ++j) {
18+
if (x % j == 0) {
19+
vector<int> b = {j, x / j};
20+
for (int d: b) {
21+
int cnt = 0;
22+
for (int p = 0; p < n; ++p) {
23+
cnt += (a[p] % d == 0);
24+
}
25+
if (cnt >= n - k) {
26+
ans = max(ans, d);
27+
}
28+
}
29+
}
30+
}
31+
}
32+
cout << ans << endl;
33+
}
34+
35+
signed main() {
36+
ios::sync_with_stdio(false);
37+
cin.tie(nullptr);
38+
39+
int t = 1;
40+
// cin >> t;
41+
while (t--) solve();
42+
return 0;
43+
}
44+
/*
45+
智商检测【算法赛】
46+
*/
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
typedef long long ll;
5+
6+
vector<int> pre;
7+
const int N = 1e5 + 10;
8+
9+
char str[N << 1];
10+
int w, sa[N], rk[N << 1], oldrk[N << 1];
11+
vector<int> height(N * 2, 0);
12+
13+
void getsa(string s) {
14+
// int i, p;
15+
int n = s.size();
16+
for (int i = 0; i < n; ++i) {
17+
str[i + 1] = s[i];
18+
}
19+
for (int i = 1; i <= n; ++i) {
20+
sa[i] = i;
21+
rk[i] = str[i];
22+
}
23+
24+
for (w = 1; w < n; w <<= 1) {
25+
sort(sa + 1, sa + n + 1, [](int x, int y) {
26+
return rk[x] == rk[y] ? rk[x + w] < rk[y + w] : rk[x] < rk[y];
27+
});
28+
memcpy(oldrk, rk, sizeof(rk));
29+
for (int p = 0, i = 1; i <= n; ++i) {
30+
if (oldrk[sa[i]] == oldrk[sa[i - 1]] &&
31+
oldrk[sa[i] + w] == oldrk[sa[i - 1] + w]) {
32+
rk[sa[i]] = p;
33+
} else {
34+
rk[sa[i]] = ++p;
35+
}
36+
}
37+
}
38+
if (n == 1) rk[1] = 1;
39+
40+
// 处理 height 数组
41+
for (int i = 1, k = 0; i <= n; ++i) {
42+
if (rk[i] == 0) continue;
43+
if (k) --k;
44+
while (str[i + k] == str[sa[rk[i] - 1] + k]) ++k;
45+
height[rk[i]] = k;
46+
}
47+
48+
for (int i = 0; i < n; ++i) sa[i] = sa[i + 1] - 1;
49+
for (int i = 0; i < n; ++i) rk[i] = rk[i + 1] - 1;
50+
if (n == 1) rk[0] = 0;
51+
for (int i = 0; i < n; ++i) height[i] = height[i + 1];
52+
}
53+
54+
template<typename T>
55+
class SparseTable {
56+
using VT = vector<T>;
57+
using VVT = vector<VT>;
58+
using func_type = function<T(const T &, const T &)>;
59+
60+
VVT ST;
61+
62+
static T default_func(const T &t1, const T &t2) { return min(t1, t2); }
63+
64+
func_type op;
65+
66+
public:
67+
SparseTable(const vector<T> &v, func_type _func = default_func) {
68+
op = _func;
69+
int len = v.size(), l1 = ceil(log2(len)) + 1;
70+
ST.assign(len, VT(l1, 0));
71+
for (int i = 0; i < len; ++i) {
72+
ST[i][0] = v[i];
73+
}
74+
for (int j = 1; j < l1; ++j) {
75+
int pj = 1 << (j - 1);
76+
for (int i = 0; i + pj < len; ++i) {
77+
ST[i][j] = op(ST[i][j - 1], ST[i + pj][j - 1]);
78+
}
79+
}
80+
}
81+
82+
T query(int l, int r) {
83+
int lt = r - l + 1;
84+
int q = floor(log2(lt));
85+
return op(ST[l][q], ST[r - (1 << q) + 1][q]);
86+
}
87+
};
88+
89+
int pre_sum(vector<int> &pre, int l, int r) {
90+
if (l) return pre[r] - pre[l - 1];
91+
return pre[r];
92+
}
93+
94+
void solve() {
95+
int n, q;
96+
cin >> n >> q;
97+
98+
string s;
99+
cin >> s;
100+
pre = vector<int>(n, s[0] == '1');
101+
for (int i = 1; i < n; ++i) {
102+
pre[i] = pre[i - 1] + (s[i] - '0');
103+
}
104+
getsa(s);
105+
SparseTable<int> st(height);
106+
107+
while (q--) {
108+
int p, l, r;
109+
cin >> p >> l >> r;
110+
p--;
111+
l--;
112+
r--;
113+
114+
int lp = rk[p], rp = n;
115+
// 找 [p:l] 的左右端点
116+
int len = l - p + 1;
117+
while (lp + 1 != rp) {
118+
int mp = (lp + rp) >> 1;
119+
int lcp = 0;
120+
if (sa[mp] + len - 1 >= n) {
121+
rp = mp;
122+
continue;
123+
}
124+
lcp = st.query(rk[p] + 1, mp);
125+
if (lcp >= len) lp = mp;
126+
else rp = mp;
127+
}
128+
int R = lp;
129+
130+
lp = -1, rp = rk[p];
131+
len = l - p + 1;
132+
while (lp + 1 != rp) {
133+
int mp = (lp + rp) >> 1;
134+
int lcp = 0;
135+
if (sa[mp] + len - 1 >= n) {
136+
lp = mp;
137+
continue;
138+
}
139+
lcp = st.query(mp + 1, rk[p]);
140+
if (lcp >= len) rp = mp;
141+
else lp = mp;
142+
}
143+
int L = rp;
144+
145+
lp = L, rp = R;
146+
ll ans = 0;
147+
for (int j = l; j <= r; ++j) {
148+
int len = j - p + 1;
149+
while (lp < n && sa[lp] + len - 1 > n || s[sa[lp] + len - 1] != s[j]) { lp++; }
150+
while (rp < n && sa[rp] + len - 1 > n || s[sa[rp] + len - 1] != s[j]) { rp--; }
151+
if (lp > rp) break;
152+
ans += (rp - lp + 1) * pre_sum(pre, p, j);
153+
}
154+
cout << ans << endl;
155+
}
156+
}
157+
158+
signed main() {
159+
ios::sync_with_stdio(false);
160+
cin.tie(nullptr);
161+
162+
int t = 1;
163+
// cin >> t;
164+
while (t--) solve();
165+
return 0;
166+
}
167+
/*
168+
降维打击【算法赛】
169+
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /