26.CF1000F One Occurrence

个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客

给定序列,要求支持查询区间内只出现一次的数字

可以离线,那么离线所有询问后按右端点排序,然后加入贡献回答即可。

洛谷传送门:CF1000F One Occurrence - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

CF传送门:F. One Occurrence (codeforces.com)

题目思路

给定序列,要求支持查询区间内只出现一次的数字。

这属于一类特别典型的问题:开桶维护最后一次出现位置,在更新时去重复贡献。

对于本题,我们首先对所有询问进行离线,然后按照右端点排序加入贡献计算答案:

  • 记录每个数字上次最后一次出现的位置
  • 只要对于上一次出现的位置维护一个区间最小值和最小值的数值,然后查询区间最小值是否位于区间内即可
  • 在每次加入右端点时判断是否之前出现过,如果出现过就清除上次加入的贡献(当当前点为右端点时,上次出现的位置一定只能作为左端点出现,因此需要消除其作为右端点时记录的前序信息)

当然,这题如果强制在线的话,可以用可持久化权值线段树保留历史版本进行查询。

Code

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;const int N = 4e6 + 10;namespace SegTree{#define ls rt << 1#define rs rt << 1 | 1#define lson ls, l, mid#define rson rs, mid + 1, rstruct Info{int val, pre;Info operator+ (Info x) {Info ans = {val, pre};if(pre > x.pre) ans.pre = x.pre, ans.val = x.val;return ans;}}tree[N];inline void push_up(int rt){tree[rt] = tree[ls] + tree[rs];}void build(int rt, int l, int r){tree[rt] = {0, INT_MAX};if(l == r) return;int mid = l + r >> 1;build(lson), build(rson);}void update(int rt, int l, int r, int pos, int val, int pre){if(l == r) return (void)(tree[rt] = Info{val, pre});int mid = l + r >> 1;if(mid >= pos) update(lson, pos, val, pre);else update(rson, pos, val, pre);push_up(rt);}Info query(int rt, int l, int r, int L, int R){if(l >= L && r <= R) return tree[rt];int mid = l + r >> 1; Info ans = Info{0, INT_MAX};if(mid >= L) ans = ans + query(lson, L, R);if(mid < R) ans = ans + query(rson, L, R);return ans;}#undef ls#undef rs#undef lson#undef rson
}struct query{int l, id;const bool operator< (const query &x) const { return l < x.l; }
};vector<query> q[N];int a[N], ans[N], last[N];inline void solve(){int n = 0; cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];SegTree::build(1, 1, n);int m = 0; cin >> m;for(int i = 1; i <= m; i++){int l, r; cin >> l >> r;q[r].emplace_back(query{l, i});}for(int i = 1; i <= n; i++){if(last[a[i]]){SegTree::update(1, 1, n, last[a[i]], 0, INT_MAX);SegTree::update(1, 1, n, i, a[i], last[a[i]]);}else SegTree::update(1, 1, n, i, a[i], 0);last[a[i]] = i;for(auto qu : q[i]){assert(qu.l <= i);auto res = SegTree::query(1, 1, n, qu.l, i);if(res.pre < qu.l) ans[qu.id] = res.val;else ans[qu.id] = 0; }}for(int i = 1; i <= m; i++) cout << ans[i] << endl;
}signed main(){ios_base::sync_with_stdio(false), cin.tie(0);int t = 1; // cin >> t;while(t--) solve();return 0;
}

26.CF1000F One Occurrence相关推荐

  1. 【转】中国行政区域(县区级带坐标经纬度)

    这是整理的一份行政区域js脚本,可以拿来做省市县三级联动,并加载地图到页面上,参考案例,了解更多. var areas = [ {"code":"110000" ...

  2. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输

    文章目录 26.1 远程登录 26.1.1 `TELNET` 1. 分时环境 2. 登录 3. 网络虚拟终端 4. 嵌入 5. 选项 6. 操作方式 26.1.2 Rlogin和SSH 26.2 电子 ...

  3. 前端面试题笔记 2021.8.26

    2021.8.26学习笔记 如果需要匹配包含文本的元素,用下面哪种方法来实现? A. text() B. contains() C. input() D. attr(name) 正确答案: B tex ...

  4. 搜集《ASP.NET中常用的26个优化性能方法》

    1. 数据库访问性能优化 a.数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接 ...

  5. java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...

    有一行电文,以按下面规律译成密码: A--->Z a--->z B--->Y b--->Y C--->X c--->x -- 即第1个字母编程第26个字母,第i个字 ...

  6. 力扣(LeetCode)刷题,简单+中等题(第26期)

    目录 第1题:字典序排数 第2题:字符串解码 第3题:查找常用字符 第4题:所有奇数长度子数组的和 第5题:长按键入 第6题:分割字符串的最大得分 第7题:回文链表 第8题:有多少小于当前数字的数字 ...

  7. Linux那些事儿 之 戏说USB(26)设备的生命线(九)

    聊完了struct usb_hcd和struct usb_bus,算是已经向HCD片儿区的老大们拜过山头了,接下来就该看看usb_submit_urb()最后的那个遗留问题usb_hcd_submit ...

  8. Ubuntu 12.04安装firefox 26中的flash plugin方法

    Ubuntu 12.04 64bit中安装firefox 26中的flash player插件的方法 昨天, 有最新的firefox 26更新了,可是我在软件更新中无法下载到ubuntu官方源中的fl ...

  9. 互动网计算机频道图书7日销售排行(05.20-05.26)

    互动网计算机频道图书7日销售排行(05.20-05.26) 1.Hadoop权威指南(中文版) 2.人人都是产品经理 3.演讲之禅:一位技术演讲家的自白 内容简介 本书既实用又引人入胜.作为职业演讲家 ...

最新文章

  1. 完整的POM文档内容
  2. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
  3. Python基础知识4: while循环基本使用
  4. php传递参数给asp.net,asp.net 传值总结
  5. 好程序员技术分析JavaScript闭包特性详解
  6. c++模板参数自动推导
  7. 自学java,能找到工作吗?一位月薪13k的自学程序员分享自己是如何学会java的
  8. 【关于测试开发工程师】
  9. CSS 引入的三种方式
  10. 在手机与计算机之间进行文件传输的方式,电脑与手机快速传输文件的方法
  11. OneNET麒麟座应用开发之九:与SD卡通讯并保存数据
  12. 小米笔记本如何开启VT虚拟化
  13. 抽象类中的非抽象方法调用自己的抽象方法
  14. java nanotime 重复_关于Java中System.currentTimeMillis和System.nanoTime的错误认识
  15. read函数的 用法
  16. Linux 音频回环播放(alsaloop)
  17. 淘宝店铺订单自动发货解决方案
  18. babylon.js入门日记系列
  19. C语言入门(九)——编码风格
  20. Android : Gesture Builder:自定义手势文件

热门文章

  1. Vue的渲染函数renderh
  2. 教育信息化时代,如何打造中学理科信息化实验操作考场方案
  3. Windows10 运行窗口(win R)命令快捷打开程序
  4. Web开发者十大必备网站资源任你挑
  5. TP6------邮箱验证码发送邮件
  6. unity3d刀光剑影的制作
  7. Linux搭建泰拉瑞亚(原版/模组/插件)服务器之(TShock)插件服务器1
  8. 烦恼天天有,不捡自然无
  9. Google道歉作协“不理” 新语言anic:比C快比Java安全比shell简单(每日关注2010.1.11)
  10. 帮助粉丝用青泥学术大数据推荐毕业论文选题(围绕 教育信息化2.0、疫情期间线上学习质量问题、Steam教育、智慧教育等突破点来抉择)