题目衔接
大家参考一下单调栈的解法即可, 还有一种是直接更新的也很快
// 单调栈
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// #include
// #include
// #include
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
struct Node {
int x, h;
int id, pos;
bool operator < (const Node &d) const {
return x < d.x;
}
}node[qq];
int ans[qq];
int n;
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d%d", &node[i].x, &node[i].h);
node[i].id = i;
}
sort(node, node + n);
stack<int> st;
for (int i = 0; i < n; ++i) {
while (!st.empty() && node[st.top()].x + node[st.top()].h < node[i].x) {
ans[node[st.top()].id] = i - st.top();
st.pop();
}
st.push(i);
}
while(!st.empty()) {
int u = st.top();
ans[node[u].id] = n - st.top();
st.pop();
}
for (int i = 0; i < n; ++i) {
printf("%d%c", ans[i], i == n - 1 ? '\n' : ' ');
}
}
return 0;
}
// 单调向前更新
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// #include
// #include
// #include
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
struct Node {
int x, h;
int id;
int ans;
bool operator < (const Node &d) const {
return x < d.x;
}
}node[qq];
bool cmp(const Node a, const Node b) {
return a.id < b.id;
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d%d", &node[i].x, &node[i].h);
node[i].id = i;
}
sort(node, node + n);
for (int i = n - 1, maxn, l; i >= 0; --i) {
maxn = 0, l = i + 1;
int tmp = node[i].x + node[i].h;
while (l < n && node[l].x < tmp) {
maxn += node[l].ans;
l += node[l].ans;
}
node[i].ans = maxn + 1;
}
sort(node, node + n, cmp);
for (int i = 0; i < n; ++i) {
printf("%d%c", node[i].ans, i == n - 1 ? '\n' : ' ');
}
}
return 0;
}
这题是个很裸的LCA问题, 去学习一下倍增法求或者Tarjan求都可以
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
const int DEG = 20;
int rt, n, m;
int dep[qq];
int f[qq][25];
vector<int> vt[qq];
int bin[30];
void dfs(int u, int fa) {
dep[u] = dep[fa] + 1;
f[u][0] = fa;
for (int i = 1; i < DEG; ++i) {
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int i = 0; i < (int)vt[u].size(); ++i) {
int v = vt[u][i];
if (v == fa) continue;
dfs(v, u);
}
}
int lca(int u, int v) {
if (dep[u] < dep[v]) {
swap(u, v);
}
for (int i = 0, d = dep[u] - dep[v]; d; ++i, d >>= 1) {
if (d & 1) u = f[u][i];
}
if (u == v) return u;
for (int i = DEG - 1; i >= 0; --i) {
if (f[u][i] != f[v][i]) {
u = f[u][i], v = f[v][i];
}
}
return f[u][0];
}
int main() {
mst(dep, 0);
scanf("%d", &n);
for (int u, v, i = 0; i < n; ++i) {
scanf("%d%d", &u, &v);
if (v == -1) {
rt = u;
} else {
vt[u].pb(v), vt[v].pb(u);
}
}
dfs(rt, -1);
scanf("%d", &m);
int a, b;
while (m--) {
scanf("%d%d", &a, &b);
int fa = lca(a, b);
// printf("lca = %d\n", fa);
int ans;
if (fa == a) {
ans = 1;
} else if (fa == b) {
ans = 2;
} else {
ans = 0;
}
printf("%d\n", ans);
}
return 0;
}
题目衔接