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

思路:线段树。

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

如果一个数\(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. PHP自动加载机制

    类的载入共经历了三个阶段 第一阶段是面向过程式的做法,整个项目里到处都是include或require. 问题:难看,不易维护. . 第二阶段是魔术方法__autoload,当new一个类的时候,如果 ...

  2. 模拟实现 DBUtils 工具 , 技术原理浅析

    申明:本文采用自己 C3P0 连接池工具进行测试 自定义的 JDBCUtils 可以获取 Connection: package com.test.utils; import java.sql.Con ...

  3. ElasticSearch6学习(1)-安装Elasticsearch

    安装准备: 安装Elasticsearch唯一的要求是安装Java8,包括对应的Jdk.其他java9/java10没尝试,考虑兼容问题.我这里只用了java8 安装java8可以参考我之前写的一篇文 ...

  4. C# 如何更改Word语言设置

    一般在创建或者打开一个Word文档时,如果没有进行过特殊设置的话,系统默认的输入语言的是英语输入,但是为适应不同的办公环境,我们其实是需要对文字嵌入的语言进行切换的,因此,本文将介绍如何使用免费版组件 ...

  5. paas saas iaas 区别

    最近在公司里面经常听到一些paas saas iaas云服务的名词,把我自己都听蒙圈啦,所以就各种找资料终于对这三个名词有了一定的了解 首先上一张图如下: IAAS(nfrastructure as ...

  6. 前端入门15-JavaScript进阶之原型链

    声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...

  7. 微耕N3000注入

    使用ILSpy或Reflector 反编译N3000并导出解决方案,便于搜索方法代码 使用ILDASM生成中间代码D:\app\WG\AccessControl\IL\N3000.il 操作如下:(可 ...

  8. LEDAPS1.3.0版本移植到windows平台----HuPm参数初始化模块

    这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. LEDAPS的调用顺序是:HuPm--&g ...

  9. Android studio,第一个生成,调用成功的jni(说多了都是泪)

    0x01 序言: 泪从何处说起呢?其实很早以前就用过android studio写过c++,但是,但是一直没有成功生成过so文件,所以心中一直有一个纠结...为什么不成功呢... 直到今天,由于工作的 ...

  10. 数据库CRUD操作以及MyBatis的配置使用

    • 业务字段设计 • 数据库创建 • CRUD操作 • MyBatis集成 • 注解和XML定义 • ViewObject和DateTool • 首页开发     • 业务字段设计 实体: name: ...