本题解用于记录一下一个优秀的东西——懒标记

题解

可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(O(1)\) 转移。这个时候我们的懒标记就出场了。

我们可以维护一个栈,然后再加数字的时候直接加,但是删数字的时候在外面删(维护一个 \(bool\) 数组),然后回答询问时就不停的弹出栈首,直到栈首存活。这一系列操作可以满足均摊复杂度 \(O(1)\) ,很强,是使用莫队时搭配的好伙伴。

以上。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,Q=5e5+5;
int n,q,a[N];
int bel[N],size;
struct Query{int l,r,id;}s[Q];
bool cmp(Query a,Query b)
{
if(bel[a.l]!=bel[b.l]) return a.l<b.l;
if(bel[a.l]&1) return a.r<b.r;
return a.r>b.r;
}
int cnt[N],ans[Q];
int l=1,r=0,res=0;
stack<int> st;
int alive[N];
int main()
{
cin>>n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
cin>>q;
for(int i=1;i<=q;++i) scanf("%d%d",&s[i].l,&s[i].r),s[i].id=i;
size=sqrt(n);
for(int i=1,cnt=0;i<=n;i+=size,++cnt)
{
for(int j=i;j<=n&&j<i+size;++j)
bel[j]=cnt;
}
sort(s+1,s+1+q,cmp);
for(int i=1;i<=q;++i)
{
while(r<s[i].r)
{
r++;
if(cnt[a[r]]==1) --res,alive[a[r]]^=1;
cnt[a[r]]++;
if(cnt[a[r]]==1) ++res,alive[a[r]]^=1,st.push(a[r]);
}
while(r>s[i].r)
{
if(cnt[a[r]]==1) --res,alive[a[r]]^=1;
cnt[a[r]]--;
if(cnt[a[r]]==1) ++res,alive[a[r]]^=1,st.push(a[r]);
r--;
}
while(l<s[i].l)
{
if(cnt[a[l]]==1) --res,alive[a[l]]^=1;
cnt[a[l]]--;
if(cnt[a[l]]==1) ++res,alive[a[l]]^=1,st.push(a[l]);
l++;
}
while(l>s[i].l)
{
l--;
if(cnt[a[l]]==1) --res,alive[a[l]]^=1;
cnt[a[l]]++;
if(cnt[a[l]]==1) ++res,alive[a[l]]^=1,st.push(a[l]);
}
while(!st.empty()&&!alive[st.top()]) st.pop();
if(st.empty()) ans[s[i].id]=0;
else ans[s[i].id]=st.top();
}
for(int i=1;i<=q;++i) printf("%d\n",ans[i]);
return 0;
}

CF1000F One Occurrence的更多相关文章

  1. cf1000F One Occurrence (线段树)

    这题我是离线做的 设i位置的数上次出现的位置是pre[i](如果第一次出现那就是0) 可以想到,用线段树维护一个区间的pre的最小值,如果它小于区间左端点,那这个数就是一个合法的答案 但直接这样做是错 ...

  2. cf1000F. One Occurrence(线段树 set)

    题意 题目链接 Sol (真后悔没打这场EDU qwq) 首先把询问离线,预处理每个数的\(pre, nxt\),同时线段树维护\(pre\)(下标是\(pre\),值是\(i\)),同时维护一下最大 ...

  3. Eclipse启动Tomcat时发生java.lang.IllegalArgumentException: <session-config> element is limited to 1 occurrence

    在学习struts 2时,为了方便,直接从下载的struts的apps目录下的struts2-blank.war压缩包下的WEB-INF\复制的web.xml,当我启动Tomcat时,发生 java. ...

  4. 缓解 SQL Server has encountered 727 occurrence(s) of I/O requests taking longer than 15 seconds

    sql server 会记录IO等待时间超过15 seconds的请求,这时application会有 time out 现象,dba需要判断是workload,concurrecy 所致还是sql ...

  5. Loadrunner中参数化实战(8)-Unique+Each occurrence

    参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Unique+Each occurrence 设置迭代4次Action 结果如下:

  6. Loadrunner中参数化实战(6)-Random+Each occurrence

    参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Random+Each occurrence 设置迭代4次Action 结果如下:

  7. SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.

    2017-11-01 09:49:44.35 spid166 SQL Server has encountered 1 occurrence(s) of cachestore flush for th ...

  8. Codeforces 1000F One Occurrence 主席树|| 离线+线段树

    One Occurrence 为什么我半年前这么菜呀, 这种场只A三题... 我们在主席树 || 线段树上维护每个数的右边和它一样的数在哪里, 然后就变成了区间求最大值. 注意加进去的时候要把它右边一 ...

  9. codeforces 1000F One Occurrence(线段树、想法)

    codeforces 1000F One Occurrence 题意 多次询问lr之间只出现过一次的数是多少. 题解 将查询按照左端点排序,对于所有值维护它在当前位置后面第二次出现是什么时候,那么查询 ...

随机推荐

  1. MySQL中EXPLAIN结果的参数详解

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了.如: mysql& ...

  2. Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案

    window 读取文件可以用\,但是在字符串中\是被当作转义字符来使用,'C:\Users\FrankYuan\Pictures\Camera Roll\WIN_20161010_08_51_57_P ...

  3. git bash: error: RPC failed; result = 18, HTP code = 200B

    git config --global http.postBuffer 2428800 如果还是失败,说明buffer不够大,继续增加buff git config --global http.pos ...

  4. day002|python基础回顾2

    目录 00 上节课复习 01 基本数据类型 02 与用户交互 03 运算符 04 流程运算之if判断 05 流程判断之while循环 06 TEST 00 上节课复习 ""&quo ...

  5. parted分区对齐

    分区提示未对齐 [root@lab8106 ceph]# parted /dev/sdd GNU Parted 3.1 Using /dev/sdd Welcome to GNU Parted! Ty ...

  6. RestPack Java实现Html转PDF文件

    最近公司需要将前端一个图表统计导出为pdf.前端导出显示的pdf还是可以的,但是将会导致页面不可用与卡死状态.所以由后端寻找解决方案. 以下为解决方案调研 https://www.cnblogs.co ...

  7. 在IDM上设置防止过度抓取网站信息

    在使用Internet Download Manager(IDM)下载器时,有时会发现IDM自带的抓取功能过于强大,以至于有时会抓取一些无效的链接.那么,该如何避免IDM的过度抓取呢? 图1:IDM的 ...

  8. iOS7使用iOS8上的方法报错处理

    问题描述 我们经常会遇到在低版本上使用高版本方法导致的bug,例如: WebKit discarded an uncaught exception in the webView:decidePolic ...

  9. Visual Studio使用Git忽略不想上传到远程仓库的文件

    前言: 作为一个.NET开发者而已,有着宇宙最强IDE:Visual Studio加持,让我们的开发效率得到了更好的提升.我们不需要担心环境变量的配置和其他代码管理工具,因为VS有丰富的拓展工具.废话 ...

  10. Contest 991

    A 先判合法然后容斥. 时间复杂度 \(O\left(1\right)\). B 贪心选最小的实验做成 \(5\) 分. 时间复杂度 \(O\left(n\right)\). 剩下的鸽了.