当前位置: 首页 > news >正文

洛谷9695 [GDCPC 2023] Traveling in Cells 题解(线段树+二分)

考虑对于一个给定的颜色集合 \(S\),我们可达的位置一定是一个区间 \([L,R]\)。于是考虑怎么求出 \(L,R\) 即可。

考虑二分,现在问题转换成判定一个区间 \([x,R]\)(区间 \([L,x]\) 同理)是否所有颜色都在我们的集合 \(S\) 中。

考虑对每一个颜色开一个线段树。区间 \([x,R]\) 里的每个颜色都在集合 \(S\) 中,等价于 \(S\) 中所有颜色在 \([x,R]\) 里的出现次数之和为 \(R-x+1\)

时间复杂度 \(O(n\log^2 n)\),如果实现的精细一点用线段树上二分可以做到 \(O(n \log n)\)

const int MAXN = 1e5 + 5;
int n, q, c[MAXN], v[MAXN];struct _sgt {struct _node {int v, ls, rs;} tr[MAXN << 6];int tot;void pushup(int p) {tr[p].v = tr[tr[p].ls].v + tr[tr[p].rs].v;}void modify(int &p, int l, int r, int k, int v) {if (!p) p = ++tot;if (l == r) return tr[p].v += v, void();if (k <= mid) modify(tr[p].ls, l, mid, k, v);else modify(tr[p].rs, mid + 1, r, k, v);pushup(p);}int query(int p, int l, int r, int L, int R) {if (!p) return 0;if (L <= l && r <= R) return tr[p].v;int res = 0;if (L <= mid) res += query(tr[p].ls, l, mid, L, R);if (mid < R) res += query(tr[p].rs, mid + 1, r, L, R);return res;}void clear(int p) {if (tr[p].ls) clear(tr[p].ls);if (tr[p].rs) clear(tr[p].rs);tr[p].v = tr[p].ls = tr[p].rs = 0;}
} t;
int rt[MAXN];int solveR(int x, int k, vector<int> a) {int l = x, r = n + 1;while (l + 1 < r) {int sum = 0;for (int i = 0; i < k; ++i)sum += t.query(rt[a[i]], 1, n, x, mid);if (sum == (mid - x + 1)) l = mid;else r = mid;}return l;
}int solveL(int x, int k, vector<int> a) {int l = 0, r = x;while (l + 1 < r) {int sum = 0;for (int i = 0; i < k; ++i)sum += t.query(rt[a[i]], 1, n, mid, x);if (sum == (x - mid + 1)) r = mid;else l = mid;}return r;
}struct _bit {int tr[MAXN];int lowbit(int x) { return x & (-x); }void modify(int x, int v) {while (x <= n) {tr[x] += v;x += lowbit(x);}}int query(int x) {int res = 0;while (x) {res += tr[x];x -= lowbit(x);}return res;}
} bit;void work() {cin >> n >> q;for (int i = 1; i <= n; ++i)cin >> c[i];for (int i = 1; i <= n; ++i)cin >> v[i];for (int i = 1; i <= n; ++i) {t.modify(rt[c[i]], 1, n, i, 1);bit.modify(i, v[i]);}while (q--) {int op; cin >> op;if (op == 1) {int p, x; cin >> p >> x;t.modify(rt[c[p]], 1, n, p, -1);t.modify(rt[x], 1, n, p, 1);c[p] = x;} else if (op == 2) {int p, x; cin >> p >> x;bit.modify(p, x - v[p]);v[p] = x;} else {int x, k; cin >> x >> k;vector<int> a(k);for (int i = 0; i < k; ++i)cin >> a[i];int L = solveL(x, k, a), R = solveR(x, k, a);cout << bit.query(R) - bit.query(L - 1) << endl;}}for (int i = 1; i <= n; ++i) {t.clear(rt[i]);bit.tr[i] = 0;}fill(rt, rt + 1 + n, 0ll);t.tot = 0;
}
http://www.zskr.cn/news/17197.html

相关文章:

  • Axure 下拉框联动 - 实践
  • 题解:qoj6170 凸多边形正则划分问题
  • linux 中paste命令实现按照指定列数输出文件
  • 2025 年章丘二手磁选机服务公司最新推荐榜单:含回收置换 / 全型号设备及优质售后企业权威排行
  • 2025 年最新铝镁锰板厂商口碑排行榜:实力厂家推荐及 100 万㎡工程案例与 20 年质保深度解读铝镁锰板屋面板/保温板/卷/墙面板 铝镁锰板金属屋面板
  • 2025 年次氯酸钠发生器厂家最新推荐榜:覆盖电解法 / 食盐电解等类型,聚焦专利技术与成本优势的品牌深度解析水厂/大型/小型/食盐电解产生次氯酸钠发生器厂家推荐
  • 2025 年二氧化氯发生器厂家最新推荐排行榜:电解式设备厂家综合实力测评及优质企业选购指南电解/电解法/电解食盐/电解盐二氧化氯发生器厂家推荐
  • 2025 年国内磁选机厂家最新推荐排行榜:立环 / 高梯度 / 油冷立环磁选机优质厂商实力解析
  • 2025 年最新三维扫描仪厂家权威推荐排行榜:空间 / 高精度 / 手持激光等类型设备优选企业全解析工业/便携式/拍照式/蓝光三维扫描仪厂家推荐
  • 2025 年北京红旗国悦经销商最新推荐排行榜:行业标杆与新锐品牌齐聚,购车选品指南重磅发布北京丰田考斯特/北京红旗国悦12座/北京考斯特4S店/北京丰田柯斯达/北京考斯特商务车经销商推荐
  • 题解:[P11184 带余除法]
  • 10 8
  • 高考数学易错考点01 | 临阵磨枪 - 教程
  • 2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐
  • 2025 土工材料厂家最新推荐榜:中铁合作厂商领衔,技术 / 案例双维度厂家深度甄选指南土工布/土工膜/土工格栅/复土工合膜厂家推荐
  • 2025 年帐篷源头厂家最新推荐排行榜:涵盖应急救灾 / 户外充气 / 露营充气 / 野营等品类,精选实力企业助采购
  • 2025 杀虫公司最新推荐榜:权威筛选公司,靶向消杀与长效质保选购全指南
  • 2025 年电缆桥架生产厂家最新推荐榜单:聚焦北方 / 河北区域及多类型桥架,精选优质品牌深度解析瓦楞/防火/模压/镀锌桥架厂家推荐
  • 2025 商事律师咨询最新推荐榜:权威甄选专业法律服务品牌武汉公司法商事/武汉股东纠纷股权/武汉商事争议解决/武汉公司法股权律师推荐
  • VSCODE - 实践
  • sqlite-loadable-rs rust 开发sqlite 扩展
  • 30年后摘得诺奖,一个叛逆“东亚小孩”的胜利
  • 2025年诺贝尔物理学奖揭晓,其中两位得主曾获“墨子量子奖”
  • Ambient Occlusion(环境光遮蔽
  • 龙芯是被gcc正儿八经支持的
  • 默认实现,子类(如 CRenderDevice_Renderware)
  • 安装Ambari集群
  • POLIR-Society-Philosophy-Hegels System of Science
  • 一摞python风格的纸牌
  • 2025方钢、扁钢、圆钢、光轴、六角钢、异型钢、冷拉/冷拔方钢、冷拉/冷拔扁钢、冷拉/冷拔圆钢、冷拉/冷拔六角钢、冷拉/冷拔异型钢、热轧方钢/扁钢厂家权威推荐榜:坚固耐用与精准定制口碑之选