【每日一题】24.换个角度思考 (主席树)
补题链接:Here
算法相关文章:主席树
显然是可以离线之后fenwick维护。
因为不喜欢离线,所以直接主席树了。
每次找到对应区间,然后相当于就是区间sum的问题了。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N * 40;
int n, m, rt[N], lc[M], rc[M], sum[M], cnt;
#define mid (l+r>>1)
void change (int l, int r, int &x, int y, int k) {
sum[x = ++cnt] = sum[y] + 1, lc[x] = lc[y], rc[x] = rc[y];
if (l == r) return ;
if (k <= mid) change (l, mid, lc[x], lc[y], k);
else change (mid + 1, r, rc[x], rc[y], k);
}
int ask (int l, int r, int x, int y, int ql, int qr) {
if (l == ql && r == qr) return sum[y] - sum[x];
if (qr <= mid) return ask (l, mid, lc[x], lc[y], ql, qr);
else if (ql > mid) return ask (mid + 1, r, rc[x], rc[y], ql, qr);
else return ask (l, mid, lc[x], lc[y], ql, mid) + ask (mid + 1, r, rc[x], rc[y], mid + 1, qr);
}
signed main() {
cin >> n >> m;
for (int i = 1, x; i <= n; i++) scanf ("%d", &x), change (1, 1e5, rt[i], rt[i - 1], x);
for (int i = 1, l, r, k; i <= m; i++) scanf ("%d %d %d", &l, &r, &k), printf ("%d\n", ask (1, 1e5, rt[l - 1], rt[r], 1, k) );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战