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

题解

可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(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. 重点思维导图------redis深度历险

  2. PIP安装Django

    1. 2. 3.升级PIP 4. 原来我已经用pycharm装过了,囧~

  3. shell脚本快速入门----shell基本语法总结

    1.#!脚本的开头 #!/bin/bash 2.脚本属性 添加可执行属性,chmod +x 或使用"."运行,例如运行当前目录下的a.sh 可执行命令 ". ./a.sh ...

  4. Linux(Centos6.8)配置Nginx环境

    1.环境配置 操作系统:centos6.8 [root@host79 ~]# uname -a Linux host79.pluto 2.6.32-642.el6.x86_64 #1 SMP Tue ...

  5. SNMP介绍及使用,超有用,建议收藏!

    写在前面 如果你是对SNMP完全不了解,或者只想学习如何使用现成的SNMP工具,那你找对了文章,但如果你希望学习SNMP具体协议内容,推荐阅读官方的RFC文档. 1. 简介 SNMP(Simple N ...

  6. scala中的val,var和lazy

    转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...

  7. celery配置与基本使用

    目录 1.celery配置与基本使用 1.1 安装celery 2.测试celery 2.1启动celery 1.celery配置与基本使用 1.1 安装celery # celery_task/ma ...

  8. Pypi项目包发布

    前言 用过python的人肯定对pip安装不陌生,pip安装的包的来源都是在Pypi上.为了能随时能使用自己的包,所以尝试一下将自己的包发布到Pypi上. 步骤 一.准备项目 一.创建目录结构 二.准 ...

  9. Eclipse改字体大小

    Windows ->Perferences ->General ->Appearance ->Colors and Fonts ->Basic ->Text Fon ...

  10. 经典面试题解析:这道 C 编程面试题居然有如此多的解法!

    问题描述 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了,相信不少人面试的时候可能遇到 ...