ZZUOJ 10508: 数列游戏IV

题目链接:http://acm.zzu.edu.cn:8000/problem.php?id=10508

题目大意:给定一个序列,长度为N,每次询问为一组区间[Li,Ri],输出Li到Ri中出现恰好两次的不同数的个数. N,M<=2*10^5,序列中元素<=10^9

解题思路:考虑用树状数组解决(大概是一种类型的题目)。树状数组一般用来快速计算更新(logN)前缀和,而对于本题来说,出现次数显然不能单纯随意相加相减,另外,对于右区间靠前的查询来说,对其查询之后后面的数据更新是不会再影响到它的,因此可以离线处理,并且需要在更新的时候针对重复元素进行一些处理。

首先考虑一个元素在序列中不同位置重复出现的情况,如下:

_ x _ x _ x _ x _ x _ (下划线表示出现了若干与x不相同的数字)

从前到后给每个x编号1,2,3,4,5,下面看一下从前到后扫面到这五个位置时如何更新(其中a,b等字母表示这个位置应当具有的值):

  _ x _ x _ x _ x _ x _ 

1  0

2  a   b       那么应当有 b + a = 1, (b + a) - a = 0, 则 b = 0, a = 1 

3  a   b   c       那么应当有 c + b + a = 0, (c + b + a) - (b + a) = 0, (c + b + a) - a = 1, 则 c = 0, b = 1,  a = -1.

4  a   b   c   d    那么应当有 d + c + b + a = 0, d + c + b + a - (c + b + a) = 0, (d + c + b + a) - (b + a) = 1

             (d + c + b + a) - a = 0, 则 d = 0, c = 1, b = -1, a = 0

...

即是:

  _ x _ x _ x _ x _ x _ 

1  0

2  1   0         

3   -1   1   0         

4  0   -1   1   0     

5  0    0   -1   1   0

然后关系就非常明显了,我们只需要记录下每个位置的数字上次出现的位置,然后 lastpos + 1,la_lastpos - 2, la_la_lastpos + 1, 即可。那么对于任意一个区间来说,由于其中每个数字都满足互相加减的条件,因此直接树状数组相加减即可。

大致过程:记录每个位置对应数字上次出现位置;将查询的区间按照有端点排序;从1~N枚举每个位置,按上述方法更新树状数组,然后计算以这个位置为右端点结束的区间的值。

代码:

 1 const int maxn = 2e5 + 10;
 2 struct node{
 3     int l, r, id;
 4     bool operator < (const node& t) const{
 5         return r < t.r;
 6     }
 7 };
 8 node range[maxn];
 9 int n, m;
10 int a[maxn], ans[maxn], bit[maxn];
11 int last[maxn];
12 map<int, int> mmp;
13 
14 int lowbit(int x){
15     return x & (-x);
16 }
17 void add(int x, int v){
18     while(x <= n){
19         bit[x] += v;
20         x += lowbit(x);
21     }
22 }
23 int sum(int x){
24     int ans = 0;
25     while(x > 0){
26         ans += bit[x];
27         x -= lowbit(x);
28     }
29     return ans;
30 }
31 void solve(){
32     memset(last, 0, sizeof(last));
33     memset(bit, 0, sizeof(bit));
34     for(int i = 1; i <= n; i++){
35         last[i] = mmp[a[i]];
36         mmp[a[i]] = i;
37     }
38     sort(range + 1, range + 1 + m);
39     int ind = 1;
40     for(int i = 1; i <= n; i++){
41         if(last[i] != 0){
42             int la = last[i];
43             add(la, 1);
44             if(last[la] != 0){
45                 int lla = last[la];
46                 add(lla, -2);
47                 if(last[lla] != 0)
48                     add(last[lla], 1);
49             }
50         }
51         while(ind <= m && range[ind].r == i){
52             int tml = range[ind].l, tmr = range[ind].r;
53             ans[range[ind].id] = sum(tmr) - sum(tml - 1);
54             ind++;
55         }
56     }
57     for(int i = 1; i <= m; i++){
58         printf("%d\n", ans[i]);
59     }
60 }
61 int main(){
62     scanf("%d %d", &n, &m);
63     for(int i = 1; i <= n; i++)
64         scanf("%d", a + i);
65     for(int i = 1; i <= m; i++){
66         scanf("%d %d", &range[i].l, &range[i].r);
67         range[i].id = i;
68     }
69     solve();
70 }

题目:

10508: 数列游戏IV

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 32  Solved: 6
[Submit][Status][Web Board]

Description

给定一个序列,长度为N,每次询问为一组区间[Li,Ri],输出Li到Ri中出现恰好两次的不同数的个数.

Input

第一行两个整数N和M,N表示序列长度,M表示询问次数.(N,M<=2*10^5)
第二行N个整数,表示序列.(序列中元素<=10^9)
以后M行,每行为Li和Ri,表示询问区间.(1<=Li<=Ri<=N)

 

Output

对于每组询问,输出一行一个整数,表示不相同数的个数.

 

Sample Input

5 1
1 2 1 1 1
1 3

Sample Output

1

HINT

Source

Raywzy

转载于:https://www.cnblogs.com/bolderic/p/7527223.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dm368ipnc 重写架构中的swosd 实现中文osd

appro的ipnc中只实现了英文的osd叠加&#xff0c;就连小小的ascii码表都没有覆盖全&#xff0c;而且该swosd架构灰常凌乱。 其实无非就是两个功能&#xff0c;一是叠加文字&#xff0c;而是叠加图片&#xff0c;由于考虑到兼容不同的分辨率的视频流&#xff0c;所以处理的分支相…

JAVA加密算法系列-AesCBC

package ***;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;/** * AES 是一种可逆加密算法&#xff0c;对用户的敏感信息加密处理 * 对原始数…

dubbo系列(一)

进入官网之后&#xff0c;找到 http://dubbo.apache.org/en-us/docs/user/quick-start.html 有一个链接跳转到这里 http://dubbo.apache.org/en-us/docs/admin/install/provider-demo.html 使用git将项目下载下来 修改如下Service实现类 1 /*2 * Licensed to the Apache Softw…

基于Flask实现后台权限管理系统 - 表设计

1.1. 设计 1.1.1. 用户表 用户表记录系统中的所有用户&#xff0c;是权限管理系统最基本的部分&#xff0c;和其他权限表都有一定的关联关系&#xff0c;同时&#xff0c;一个还有一个重要的功能&#xff1a;系统登陆。 名称 数据类型 允许空值 默认值 描述 ID VARCHAR …

DM8168的McSPI/McASP/McBSP接口

McSPI接口 SPI管脚&#xff1a; 管脚 类型 描述 SPI_SCLK I/O SPI串行时钟&#xff08;MASTER时&#xff1a;输出&#xff1b;SLAVE&#xff1a;输入&#xff09; SPI_D0 I/O 能被配置为输入或输出&#xff08;MOSI&#xff1a;master out&#xff0c;slave in或MISO&…

Sencha ID的注册

sencha id的注册用不着翻墙&#xff0c;直接访问下面的地址https://www.sencha.com/forum/register.php输入你的个人信息敞开来注册&#xff0c;我的注册名为charlie2018w非常顺利的过程你免费注册的id只能用30天。拥有这个id你就可以在eclipse或者sencha artchitect3或者webst…

ansible安装

1、简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的&#…

《大道至简》第一章伪代码

o愚公移山伪代码 Import.java Import.java Punlic class yugongyishan { Public static void main (string [] args) { while(山不平&#xff0c;&#xff0c;) {毕力平险&#xff0c;指通豫南&#xff0c;达于汉阴&#xff1b;叩石垦壤&#xff0c;箕㮥于渤海之尾&#xff1b;…

Verilog Matlab 联合仿真

一、概述 在进行仿真时&#xff0c;有时候一部分参考模型&#xff08;reference model&#xff09;来自于Matlab&#xff0c;这就需要通过某种方法调用并运行Matlab的参考模型。verilog并不支持直接调用Matlab&#xff0c;但是可以通过DPI接口调用C函数&#xff0c;而Matlab又预…

转 alsa录音放音执行流程详解

前言&#xff1a; linux中&#xff0c;无论是oss还是alsa体系&#xff0c;录音和放音的数据流必须分析清楚。先分析alsa驱动层&#xff0c;然后关联到alsa库层和应用层。 链接分析&#xff1a; core/pcm_native.c文件中.mmap snd_pcm_mmap调用snd_pcm_mmap_data(substream, fi…

jenkins之qq企业邮箱配置

一、配置qq企业邮箱 1、登录jenkins后台管理&#xff0c;选择 系统管理 ☞ 系统设置 2、SMTP server配置 3、邮件通知配置 配置ssl等参数 点击 高级 4、发送邮件测试 总结&#xff1a;邮箱配置不成程分析 1、管理员账号和默认发送账号不一致。2、smtp服务器设置不正确;qq企业…

关于iOS里的做动画方法的差别与注意事项

CoreAnimation与UIView.animation... 这两个方式的主要差别在于&#xff0c;前者如果不主动设置&#xff0c;那么在动画做完以后&#xff0c;会恢复原状。后者则不会&#xff0c;动画做完后是什么样&#xff0c;控件就是什么样。 UIView.animation...是什么 首先我们来做一个动…

mysql-5.7 持久化统计信息详解

一、持久化统计信息的意义&#xff1a; 统计信息用于指导mysql生成执行计划&#xff0c;执行计划的准确与否直接影响到SQL的执行效率&#xff1b;如果mysql一重启 之前的统计信息就没有了&#xff0c;那么当SQL语句来临时&#xff0c;那么mysql就要收集统计信息然后再生成SQL语…

关于传感器”英寸“计量

传感器上的n是指对角线长度为16mm或18mm的n倍 以英寸代指的传感器大小称为靶面尺寸。 在CCD/CMOS出现之前&#xff0c;摄像机是利用一种叫作“光导摄像管&#xff08;Vidicon Tube&#xff09;”的成像器件感光成像的&#xff0c;这是一种特殊设计的电子管&#xff0c;其直径的…

关于USB-AUDIO使用ALSA编程的一点问题

转载自&#xff1a;http://blog.chinaunix.net/uid-25272011-id-3153434.html 最近在调试一款原相PAP7501摄像头中的USB的麦克风&#xff0c;USB层走的应该是标准的UAC协议&#xff0c;具体可以见USB的官网&#xff1a;http://www.usb.org/developers/devclass_docs#approved&a…

让input变成不可编辑状态的方法

有时候&#xff0c;我们希望表单中的文本框是只读的&#xff0c;让用户不能修改其中的信息&#xff0c;如使<input type"text" name"input1" value"中国"> 的内容&#xff0c;"中国"两个字不可以修改。实现的方式归纳一下&#…

npm run dev 在本地调试出现跨域问题解决方法

npm run dev 在本地调试出现跨域问题 在localhost:8080调试时会出现跨域问题&#xff0c;如图&#xff1a; 我的项目是用webpack作为前端自动化构建工具&#xff0c;可以在webpack-dev-server中配置跨域。webpack-dev-server是一个小型的nodejs服务器&#xff0c;是基于express…

alsa声音编程介绍

http://blog.csdn.net/q553716434/article/details/7881552 period(周期):硬件中中断间的间隔时间。它表示输入延时。 声卡接口中有一个指针来指示声卡硬件缓存区中当前的读写位置。只要接口在运行&#xff0c;这个指针将循环地指向缓存区中的某个位置。 frame size sizeof(o…

五、python模块以及包

模块&#xff1a;编写的别的程序中重用一些代码。 1 模块的写法&#xff1a; 创建一个.py文件&#xff0c;该文件中包含函数与变量。使用撰写python解释器本身的本地语言来编写模块。比如使用C代码编写python模块&#xff0c;并且在编译后&#xff0c;可以通过标准的python解释…

jeecg选择按钮带入其他单据值

前端的标签 <input class"inputxt" id"fshimian" name"fshimian" ignore"ignore" datatype"*" value"${shizhePage.fshimian}" /> <t:choose hiddenName"fshimian" hiddenid"fname"…