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

题解

可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(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. ceph扩展bluestore的db分区

    前言 在ceph 14版本里面才加入了bluefs-bdev-migrate,分区迁移相关的命令,那么在12版本里面其实也是可以扩展分区的 测试的版本 [root@lab102 ceph-0]# ce ...

  2. Ubuntu 12.10设置root用户登录图形界面

    Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...

  3. 自动化测试_移动端测试(二)—— Appium原理

    一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appium使用WebDriver ...

  4. Linux系统学习07-Centos软件安装几种方法

    配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...

  5. 提交的忠金融的bug

  6. Python_生成器和迭代器的区别

    迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问.今天一起从概念到代码梳理一遍,作为总结和记录. 区别是: 生成器的好处是延迟计算,一次返回一个结果.也就是说,它不会一次生成所有的结果, ...

  7. 蓝桥杯——压缩变换(2016JavaB组第9题)

    压缩变换(16JavaB9) 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这 ...

  8. 关于String的matches方法

    弊端: 虽然String.matches方法最易于看一个字符串是否与正则表达式相匹配.但并不适合在注重性能的情形中重复使用. 问题在于,它内部为正则表达式创建了一个Pattern实例,却只用一次,之后 ...

  9. 从零做网站开发:基于Flask和JQuery,实现表格管理平台

    摘要:本文将为大家带来基于Flask框架和JQuery实现管理平台网站的开发功能. [写在前面] 你要开发网站? 嗯.. 会Flask吗? 什么东西,没听过... 会JQuery吗? 是python的 ...

  10. 使用Git,10件你可能需要“反悔”的事

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...