update
This commit is contained in:
parent
b1b0c75695
commit
66b06821d0
67
src/3/T179939.cpp
Normal file
67
src/3/T179939.cpp
Normal file
@ -0,0 +1,67 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
struct SN {
|
||||
int val;
|
||||
SN* prev;
|
||||
SN(int v, SN* p) : val(v), prev(p) {}
|
||||
};
|
||||
|
||||
int main() {
|
||||
ios::sync_with_stdio(false);
|
||||
cin.tie(0);
|
||||
|
||||
int n;
|
||||
cin >> n;
|
||||
vector<int> prt(n + 1);
|
||||
vector<vector<int>> child(n + 1);
|
||||
for (int i = 2; i <= n; ++i) {
|
||||
int p;
|
||||
cin >> p;
|
||||
prt[i] = p;
|
||||
child[p].push_back(i);
|
||||
}
|
||||
vector<int> a(n + 1);
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
cin >> a[i];
|
||||
}
|
||||
|
||||
vector<SN*> stp(n + 1, nullptr);
|
||||
vector<int> cnts(n + 1, 0);
|
||||
|
||||
// BFS
|
||||
queue<int> q;
|
||||
q.push(1);
|
||||
stp[1] = new SN(a[1], nullptr);
|
||||
cnts[1] = 1;
|
||||
|
||||
while (!q.empty()) {
|
||||
int u = q.front();
|
||||
q.pop();
|
||||
|
||||
for (int v : child[u]) {
|
||||
SN* ctop = stp[u];
|
||||
int ccnt = cnts[u];
|
||||
int val = a[v];
|
||||
|
||||
while (ctop != nullptr && ctop->val <= val) {
|
||||
SN* temp = ctop;
|
||||
ctop = ctop->prev;
|
||||
ccnt--;
|
||||
}
|
||||
|
||||
ctop = new SN(val, ctop);
|
||||
ccnt++;
|
||||
stp[v] = ctop;
|
||||
cnts[v] = ccnt;
|
||||
|
||||
q.push(v);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
cout << cnts[i] << " \n"[i == n];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
112
src/3/T459940.cpp
Normal file
112
src/3/T459940.cpp
Normal file
@ -0,0 +1,112 @@
|
||||
#include <bits/stdc++.h>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
using namespace std;
|
||||
|
||||
const int MAXN = 1e6 + 5;
|
||||
const int LOG = 20;
|
||||
|
||||
vector<int> adj[MAXN];
|
||||
vector<int> euler;
|
||||
int first[MAXN], depth[MAXN];
|
||||
int st_rmq[LOG][MAXN * 2];
|
||||
int log_table[MAXN * 2];
|
||||
int st_lca[LOG][MAXN];
|
||||
|
||||
struct State {
|
||||
int u, parent;
|
||||
vector<int>::iterator it;
|
||||
};
|
||||
|
||||
void iterative_dfs() {
|
||||
stack<State> st;
|
||||
st.push({1, -1, adj[1].begin()});
|
||||
first[1] = euler.size();
|
||||
euler.push_back(1);
|
||||
depth[1] = 0;
|
||||
|
||||
while (!st.empty()) {
|
||||
auto& s = st.top();
|
||||
if (s.it == adj[s.u].end()) {
|
||||
st.pop();
|
||||
if (s.parent != -1) {
|
||||
euler.push_back(s.parent);
|
||||
}
|
||||
} else {
|
||||
int v = *s.it;
|
||||
s.it++;
|
||||
if (v == s.parent) continue;
|
||||
first[v] = euler.size();
|
||||
euler.push_back(v);
|
||||
depth[v] = depth[s.u] + 1;
|
||||
st.push({v, s.u, adj[v].begin()});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void build_rmq() {
|
||||
int m = euler.size();
|
||||
log_table[1] = 0;
|
||||
for (int i = 2; i <= m; ++i)
|
||||
log_table[i] = log_table[i/2] + 1;
|
||||
for (int i = 0; i < m; ++i)
|
||||
st_rmq[0][i] = i;
|
||||
for (int k = 1; (1 << k) <= m; ++k) {
|
||||
for (int i = 0; i + (1 << k) <= m; ++i) {
|
||||
int a = st_rmq[k-1][i];
|
||||
int b = st_rmq[k-1][i + (1 << (k-1))];
|
||||
st_rmq[k][i] = (depth[euler[a]] < depth[euler[b]] ? a : b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int lca(int u, int v) {
|
||||
int l = first[u], r = first[v];
|
||||
if (l > r) swap(l, r);
|
||||
int k = log_table[r - l + 1];
|
||||
int a = st_rmq[k][l];
|
||||
int b = st_rmq[k][r - (1 << k) + 1];
|
||||
return euler[depth[euler[a]] < depth[euler[b]] ? a : b];
|
||||
}
|
||||
|
||||
void build_lca_st(int n) {
|
||||
for (int i = 1; i <= n; ++i)
|
||||
st_lca[0][i] = i;
|
||||
for (int k = 1; (1 << k) <= n; ++k) {
|
||||
for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
|
||||
int a = st_lca[k-1][i];
|
||||
int b = st_lca[k-1][i + (1 << (k-1))];
|
||||
st_lca[k][i] = lca(a, b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int query(int l, int r) {
|
||||
if (l == r) return l;
|
||||
int len = r - l + 1;
|
||||
int k = log_table[len];
|
||||
int a = st_lca[k][l];
|
||||
int b = st_lca[k][r - (1 << k) + 1];
|
||||
return lca(a, b);
|
||||
}
|
||||
|
||||
int main() {
|
||||
iostream::sync_with_stdio(false),cin.tie(nullptr);
|
||||
int n, q;
|
||||
cin>>n>>q;
|
||||
for (int i = 1; i < n; ++i) {
|
||||
int u, v;
|
||||
cin>>u>>v;
|
||||
adj[u].push_back(v);
|
||||
adj[v].push_back(u);
|
||||
}
|
||||
iterative_dfs();
|
||||
build_rmq();
|
||||
build_lca_st(n);
|
||||
while (q--) {
|
||||
int l, r;
|
||||
cin>>l>>r;
|
||||
cout<<query(l, r)<<'\n';
|
||||
}
|
||||
return 0;
|
||||
}
|
119
src/5/17/T294684.cpp
Normal file
119
src/5/17/T294684.cpp
Normal file
@ -0,0 +1,119 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
const int N = 1e5 + 10;
|
||||
|
||||
struct Node {
|
||||
int l, r;
|
||||
int max_len, prefix, suffix;
|
||||
int tag; // -1 无覆盖 | 0 or 1覆盖
|
||||
} tr[N << 2];
|
||||
|
||||
struct Info {
|
||||
int max_len, prefix, suffix, total;
|
||||
};
|
||||
|
||||
void push_up(int u) {
|
||||
Node &left = tr[u << 1];
|
||||
Node &right = tr[u << 1 | 1];
|
||||
tr[u].prefix = left.prefix;
|
||||
if (left.prefix == left.r - left.l + 1) {
|
||||
tr[u].prefix += right.prefix;
|
||||
}
|
||||
tr[u].suffix = right.suffix;
|
||||
if (right.suffix == right.r - right.l + 1) {
|
||||
tr[u].suffix += left.suffix;
|
||||
}
|
||||
tr[u].max_len = max({left.max_len, right.max_len, left.suffix + right.prefix});
|
||||
}
|
||||
|
||||
void push_down(int u) {
|
||||
if (tr[u].tag != -1) {
|
||||
int tag = tr[u].tag;
|
||||
int lson = u << 1, rson = u << 1 | 1;
|
||||
tr[lson].max_len = tr[lson].prefix = tr[lson].suffix = tag ? (tr[lson].r - tr[lson].l + 1) : 0;
|
||||
tr[lson].tag = tag;
|
||||
tr[rson].max_len = tr[rson].prefix = tr[rson].suffix = tag ? (tr[rson].r - tr[rson].l + 1) : 0;
|
||||
tr[rson].tag = tag;
|
||||
tr[u].tag = -1;
|
||||
}
|
||||
}
|
||||
|
||||
void build(int u, int l, int r, const string &s) {
|
||||
tr[u].l = l;
|
||||
tr[u].r = r;
|
||||
tr[u].tag = -1;
|
||||
if (l == r) {
|
||||
int val = s[l - 1] - '0';
|
||||
tr[u].max_len = tr[u].prefix = tr[u].suffix = val;
|
||||
return;
|
||||
}
|
||||
int mid = (l + r) >> 1;
|
||||
build(u << 1, l, mid, s);
|
||||
build(u << 1 | 1, mid + 1, r, s);
|
||||
push_up(u);
|
||||
}
|
||||
|
||||
void update(int u, int l, int r, int x) {
|
||||
if (tr[u].l >= l && tr[u].r <= r) {
|
||||
tr[u].max_len = tr[u].prefix = tr[u].suffix = x ? (tr[u].r - tr[u].l + 1) : 0;
|
||||
tr[u].tag = x;
|
||||
return;
|
||||
}
|
||||
push_down(u);
|
||||
int mid = (tr[u].l + tr[u].r) >> 1;
|
||||
if (l <= mid) update(u << 1, l, r, x);
|
||||
if (r > mid) update(u << 1 | 1, l, r, x);
|
||||
push_up(u);
|
||||
}
|
||||
|
||||
Info query(int u, int ql, int qr) {
|
||||
if (tr[u].r < ql || tr[u].l > qr) {
|
||||
return {0, 0, 0, 0};
|
||||
}
|
||||
if (ql <= tr[u].l && tr[u].r <= qr) {
|
||||
return {tr[u].max_len, tr[u].prefix, tr[u].suffix, tr[u].r - tr[u].l + 1};
|
||||
}
|
||||
push_down(u);
|
||||
Info left = query(u << 1, ql, qr);
|
||||
Info right = query(u << 1 | 1, ql, qr);
|
||||
if (left.total == 0) return right;
|
||||
if (right.total == 0) return left;
|
||||
Info res;
|
||||
res.prefix = left.prefix;
|
||||
if (left.prefix == left.total) {
|
||||
res.prefix += right.prefix;
|
||||
}
|
||||
res.suffix = right.suffix;
|
||||
if (right.suffix == right.total) {
|
||||
res.suffix += left.suffix;
|
||||
}
|
||||
res.max_len = max({left.max_len, right.max_len, left.suffix + right.prefix});
|
||||
res.total = left.total + right.total;
|
||||
return res;
|
||||
}
|
||||
|
||||
int main() {
|
||||
ios::sync_with_stdio(false);
|
||||
cin.tie(nullptr);
|
||||
int n, q;
|
||||
cin >> n >> q;
|
||||
string s;
|
||||
cin >> s;
|
||||
build(1, 1, n, s);
|
||||
while (q--) {
|
||||
int op;
|
||||
cin >> op;
|
||||
if (op == 1) {
|
||||
int l, r, x;
|
||||
cin >> l >> r >> x;
|
||||
update(1, l, r, x);
|
||||
} else {
|
||||
int l, r;
|
||||
cin >> l >> r;
|
||||
Info info = query(1, l, r);
|
||||
cout << info.max_len << '\n';
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -24,8 +24,8 @@ void dfs(int u, int parent) {
|
||||
|
||||
for (int v : tree[u].children) {
|
||||
if (v == parent) continue;
|
||||
long long option = dp[u][1] - dp[v][0] + dp[v][1] - b;
|
||||
dp[u][1] = max(dp[u][1], option);
|
||||
// long long option = dp[u][1] - dp[v][0] + dp[v][1] - b;
|
||||
// dp[u][1] = max(dp[u][1], option);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user