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

Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]

Buratsuta 3:典中典中典中典中典了属于是。

Sol.1 摩尔投票

首先维护区间出现次数大于等于 $\left \lfloor \dfrac{len}{k} \right \rfloor $ 次的数是摩尔投票板子,每次把 \(k\) 个不同的数相消即可。然后因为摩尔投票具有结合律,所以可以上线段树维护,时间复杂度 \(O(n + q\log n)\)。注意需要判断解是否合法。

注意到此题没有修改操作,所以如果直接上猫树可以做到 \(O(n\log n + q)\) 的复杂度。

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc (p << 1)
#define rc ((p << 1) | 1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 200005;
int n, q, a[N], b[N], bn;
int getrk(int x)
{return (lower_bound(b + 1, b + bn + 1, x) - b);
}
struct Node{int l, r;int val1, cnt1, val2, cnt2;
};
struct Segtree{Node tr[4 * N];void pushup(Node &p, Node ls, Node rs){if(rs.cnt1 && rs.val1 == ls.val1) ls.cnt1 += rs.cnt1;else if(rs.cnt1 && rs.val1 == ls.val2) ls.cnt2 += rs.cnt1;else if(rs.cnt1){int mn = min(rs.cnt1, min(ls.cnt1, ls.cnt2));rs.cnt1 -= mn;ls.cnt1 -= mn;ls.cnt2 -= mn;if(rs.cnt1 && ls.cnt1 == 0) ls.val1 = rs.val1, ls.cnt1 = rs.cnt1;else if(rs.cnt1 && ls.cnt2 == 0) ls.val2 = rs.val1, ls.cnt2 = rs.cnt1;        }if(rs.cnt2 && rs.val2 == ls.val1) ls.cnt1 += rs.cnt2;else if(rs.cnt2 && rs.val2 == ls.val2) ls.cnt2 += rs.cnt2;else if(rs.cnt2){int mn = min(rs.cnt2, min(ls.cnt1, ls.cnt2));rs.cnt2 -= mn;ls.cnt1 -= mn;ls.cnt2 -= mn;if(rs.cnt2 && ls.cnt1 == 0) ls.val1 = rs.val2, ls.cnt1 = rs.cnt2;else if(rs.cnt2 && ls.cnt2 == 0) ls.val2 = rs.val2, ls.cnt2 = rs.cnt2;   }p.val1 = ls.val1;p.val2 = ls.val2;p.cnt1 = ls.cnt1;p.cnt2 = ls.cnt2;        }void build(int p, int ln, int rn){tr[p] = {ln, rn, a[ln], 1, 0, 0};if(ln == rn) return;int mid = (ln + rn) >> 1;build(lc, ln, mid);build(rc, mid + 1, rn);pushup(tr[p], tr[lc], tr[rc]);}Node query(int p, int ln, int rn){if(ln <= tr[p].l && tr[p].r <= rn) return tr[p];int mid = (tr[p].l + tr[p].r) >> 1;if(rn <= mid) return query(lc, ln, rn);if(ln >= mid + 1) return query(rc, ln, rn);Node tmp;pushup(tmp, query(lc, ln, rn), query(rc, ln, rn));return tmp;}
}tr1;
vector<int> vis[N];
int query_num(int l, int r, int v)
{return (upper_bound(vis[v].begin(), vis[v].end(), r) - lower_bound(vis[v].begin(), vis[v].end(), l));
}
void solve()
{cin >> n >> q;bn = 0;for(int i = 1; i <= n; i++){cin >> a[i];b[++bn] = a[i];vis[i].clear();}sort(b + 1, b + bn + 1);bn = unique(b + 1, b + bn + 1) - b - 1;for(int i = 1; i <= bn; i++) vis[i].push_back(0);for(int i = 1; i <= n; i++){a[i] = getrk(a[i]);vis[a[i]].push_back(i);}for(int i = 1; i <= bn; i++) vis[i].push_back(n + 1);tr1.build(1, 1, n);for(int i = 1; i <= q; i++){int l, r;cin >> l >> r;Node res = tr1.query(1, l, r);int ans1 = res.val1, ans2 = res.val2;if(ans1 > ans2) swap(ans1, ans2);int lmt = (r - l + 1) / 3, cnt3 = 0;if(ans1){int cnt1 = query_num(l, r, ans1);if(cnt1 > lmt){cout << b[ans1] << " ";cnt3++;}}if(ans2){int cnt2 = query_num(l, r, ans2);if(cnt2 > lmt){cout << b[ans2] << " ";cnt3++;}}if(cnt3 == 0) cout << -1 << " ";cout << "\n";}
}int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--) solve();return 0;
}

Sol.2 随机化

随机在区间内选若干个点,然后判断一下出现次数最多的解是否合法。具体我没试选多少个点可以通过,但应该在 \(200\) 个左右。

Sol.3 根号分治

\(len \le \sqrt n\) 的区间暴力求解,对 \(len > \sqrt n\) 预处理出现次数在 \(\dfrac{\sqrt n}{3}\) 以上的数的出现位置,查询的时候二分即可。容易发现预处理的点大概就是 \(\sqrt n\) 量级的。所以时间复杂度为 \(O(n\sqrt n\log n)\)

http://www.zskr.cn/news/14319.html

相关文章:

  • 2025 年最新推荐软件开发机构榜:聚焦微服务架构与 724 小时服务的优质厂商精选指南人力资源管理系统/资产管理系统/数据中台管理系统/流程管理系统软件开发公司推荐
  • 最新WTAPI开发微信机器人教程说明
  • 2025 年最新制氮机厂家权威推荐排行榜:聚焦行业优质厂商综合实力,助力企业精准选购优质设备制氮机产生氮气/氮气纯化/设备改造/维修/保养/半导体用制氮机厂家推荐
  • 2025 年除湿机厂家最新权威推荐排行榜:实力厂家技术口碑评测及场景适配选购指南吊顶/泳池/车库/防爆/调温/新风除湿机厂家推荐
  • 2025 年液氨蒸发器厂家联系方式,众众电热:多领域加热设备供应与定制化解决方案提供商
  • ClickHouse 窗口函数详解:告别 GROUP BY 的局限性,实现灵活数据分析 - 若
  • Vue3 使用注意事项
  • java 解析json字符串,获取特定的字段值,JsonObject
  • Java 一行一行的读取文本,小Demo 大学问
  • 数字化转型业务流程总览图
  • 2025 年挤压造粒机源头厂家最新推荐榜单:前五企业技术实力、服务能力及口碑测评指南对辊挤压/化肥挤压/干粉挤压造粒机厂家推荐
  • 2025 预分散颜料厂家最新推荐榜:超高含量技术 + 合规企业全景指南,纺丝 / 吹膜专用产品选型手册
  • 2025 最新权威推荐:全国开锁公司口碑排行榜,含智能锁专项服务与紧急上门品牌详解汽车保险柜开锁/汽车锁开锁/保险柜开锁/智能开锁/快速上门开锁公司推荐
  • 2025 年透骨液膏药代理加盟 / 足浴包膏药代理加盟 / 青岛膏药代理加盟推荐:青岛步泽药业布泽草本透骨液代理合作解析
  • 从手机到汽车音响:蚀刻喇叭网的跨界应用前景 - 指南
  • 读人形机器人27太空中
  • 2025 年酒店一次性用品源头厂家最新推荐榜单:含牙签牙线筷子套杯盖等全品类及采购选择指南酒店一次性牙签/牙线/筷子套/杯盖/杯垫/杯套用品 厂家推荐
  • oppoR9m刷Linux系统: 说明-注意事项-知识点
  • 2025阳台装修品牌推荐榜:优质阳台厂商资质、技术、服务测评及高口碑企业优选指南,浙江多为建筑服务与性价比兼具!
  • 2025年杭州软件开发公司最新品牌推荐榜:聚焦技术实力与售后体系的优质服务商精选指南!
  • 【WCH蓝牙系列芯片】-基于CH592开发板——HID_Keyboard中添加读、写、通知的服务属性
  • 快微商城小程序管理系统:助力商家搭建高效便捷的新零售平台
  • KTV 娱乐小程序管理系统:数字化运营新选择,助力行业高效经营
  • 大模型落地实践指南:从技术路径到企业级解决强大的方案
  • 阿里云 CDN 多条件源站配置实战:跨地域环境分流
  • 2025标志牌生产厂家最新推荐排行榜:权威筛选优质标志牌品牌,助您精准选对交通标志牌,反光标志牌,道路标志牌供应商!
  • 2025 年脚手架厂家最新推荐榜:铝合金 / 盘扣 / 快装 / 移动式等多类型产品优选及国内实力企业排行指南
  • 完整教程:大模型浪潮下的“冷思考”:计算机视觉的变局与出路
  • 玳瑁的嵌入式日记---0928(ARM--I2C) - 教程
  • 关于处理大批量数据下载和查询时,怎么进行限流和熔断处理(AI)