题意:给一个序列,每次查询某个区间内一个只出现一次的数。

思路:线段树。

首先我们看只出现一次的本质是什么。

如果一个数\(x​\)在\((l,r)​\)中只出现了一次,那么它在其中第一次出现位置为\(p​\),其下一次出现肯定大于\(r​\)。

那么我们就有一个想法:

用线段树维护每一个数的下一次出现,那么区间中最大的一个还没有超过区间的右端点,则说明肯定无解。

但是我们只能够存下这个区间中每个数的第一次出现。

只好离线处理。

把所有的操作按照左端点排序,然后:

从右往左扫描所有的点,遇到一个新的就把当前的值下一次出现记录,同时把下一次出现“删除”。只用把其设成\(-\infty\)即可,因为足以让其不能参加取\(max\)。

这样就好了。

线段树需要单点修改、区间查询。

所以果断\(zkw\)。跑的飞快。

TangentDay:莫队。首先把操作离线,把他们按照左端点排序。维护一个(l,r)表示现在处理到的区间。
然后假设现在我们考虑的区间是(nl,nr),那么我们需要从(l,r)"挪"到(nl,nr):
不断把r右移直到r>=nr,同时把路上的所有数出现次数加1,同时维护所有的现在出现次数为1的数的集合。
不断把l左移直到l<=nl,r左移直到r<=nr,l右移直到l>=nl。
这个顺序是不能改变的。因为如果先左移r或者先右移l可能导致区间长度为负数。
但这个复杂度是O(q sqrt(n) log(n))的,TLE。

ivan100sic:BIT套set。首先把操作离线,把他们按照右端点排序。
维护一个BIT表示每一个后缀出现的数字有哪些是只有一次出现的。
然后就发现我们需要的是区间修改+单点查询。
从左往右扫描右端点,每到一个新的点就把(上一次出现,上上次出现)的那段区间干掉,并且加入(这次出现,上次出现)这个区间。
查询的时候就看左端点上有多少个第一次出现了。
但这个复杂度是O(q log(n)^2)的,TLE。
修改了几次都没有效果。

ei133333:线段树套set。其实和ivan100sic差不多,只是他单点修改,区间查询了。
这样其实想的更自然???可惜还是TLE。

ei133333:线段树。还是离线操作,并且从左往右扫描右端点。
然后每次加入(这次出现,上次出现)这个区间,但不删去(上一次出现,上上次)这段,留着,当查询的时候删。
这里就发现线段树中维护的是一堆(数,出现位置)这个pair,
查询的时候把这个节点的所有pair中出现位置不是最后一次出现位置的干掉。
应该能AC了。复杂度O(q log(n))

natsugiri:线段树。强烈谴责该选手比赛贴板子的恶劣行为,并禁赛三年。(删掉
然后就和上课讲的方法差不多了。

krijgertje:莫队。和TangentDay类似,只不过他用的是链表,消掉了一个log。
然后他的排序方式也不一样:先按照左端点排序,如果左端点是奇数,则右端点按照从小到大排序,否则从大到小。
可惜复杂度O(q sqrt(n)),还是TLE。

krijgertje:线段树。和上课讲的方法一模一样。

总结:出题人很厉害,
O(q sqrt(n))的方法在第8个点TLE了,
O(q log(n)^2)的方法即使过了第8个点还有第9个点,
都安排上了。

但是莫队还是可以过的。

思路2:莫队。

我们在加入、删除一个数的时候这样处理:

我们记录这个数是否只有一次出现,并且记录这个数所在的中有几个只有一次出现的。

块的大小自定。取\(O(\sqrt{n})\)可以达到最好的效果。

那么再看我们怎么找到第一个只有一次出现的数。

首先我们沿着每个块跑,看这个块中有没有。

如果有就进块内跑,找到第一个有的就是辣。

可惜隔壁线段树不知道比它高明到哪里去了,跑的比香港记者还快

但是可以贴着时限过。

【Codeforces 1000F】One Occurrence的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. centos7 修改yum源为阿里源

    centos7 修改yum源为阿里源,某下网络下速度比较快 首先是到yum源设置文件夹里 安装base reop源 cd /etc/yum.repos.d 接着备份旧的配置文件 sudo mv Cen ...

  2. Linux基础知识第二讲,文件目录命令使用

    目录 一丶Linux终端使用技巧. 1.自动补全 Tab技巧. 2.使用输入过的命令 二丶Linux 目录知识 1.linux目录的特点 2.ls 隐藏文件的查看 3.ls 常用选项 4.通配符的配合 ...

  3. Docker系列08—搭建使用私有docker registry

    本文收录在容器技术学习系列文章总目录 1.了解Docker Registry 1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据. 启动容器时,docker dae ...

  4. 页面优化,DocumentFragment对象详解

    一.前言 最近项目不是很忙,所以去看了下之前总想整理的重汇和回流的相关资料,关于回流优化,提到了DocumentFragment的使用,这个对象在3年前我记得是有看过的,但是一直没深入了解过,所以这里 ...

  5. 【微服务No.2】polly微服务故障处理库

    熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...

  6. FaaS技术框架

    FaaS介绍 微服务(MicroService)是以专注于单一服务/功能的小型单元块为基础,利用模块化的方式组合成复杂的大型应用服务. FaaS是Function as a Service的缩写,可以 ...

  7. H5的语义化标签(PS: 后续继续补充)

    头部信息 <header></header> 区块标签 <figure> <figcaption>123</figcaption> < ...

  8. SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large –

    SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 笔者所在的项目上,由于客户尚未正式大规模量产,在现阶段,所有的物料基本都是走费用 ...

  9. Android Studio撤销与SVN的关联

    为何会记录这一个问题,主要是在做项目的过程中出现了一个奇怪的现象,就是直接在文件目录下使用svn上传文件的话,可以看到该目录是与SVN相关联的,可是到了用Android Studio上传代码的时候却发 ...

  10. 从零学习Flutter(一):初识Dart

    Fluter是Google推出的跨平台开发App的一套框架,很多人都说,Google出品比属于金品,故,我也来凑凑热闹,Fluter是用Dart写的,所以在用Fluter之前,我们还是有必要简单了解一 ...