Description

你小时候玩过弹珠吗?
小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N。为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少。当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色。但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助。
 
  思路很简单,在[l,r]中出现过的颜色数量
  我们设b[i]为第i位的数其之前出现的时候的下标
  只要统计在[l,r]间,b[i]<l的数量即可
  
  只要在每次修改的时候维护好b,再每次排序,询问的时候二分查找即可。
  如何维护b呢?
  对于每一个修改,它最多影响两个数的b,一个是它自身,一个是它后面遇到的第一个与它相等的数
  我们只要重新对两个块排序
  但是处理处b,刚开始我想要在每个块中再维护一个以颜色为第一关键字,下标为第二关键字的序列
  对于每个块二分找到修改的点前一次出现的位置 但是感觉十分麻烦
  看了下数据,修改的次数不会超过1000,n<=10000,每次重新算一遍b数组也是可以的
  但是第一次提交TLE了,发现习惯性的fillchar实际上时间并不那么快
  统计b的last数组实际上O(n)赋值比fillchar要快得多(因为last的范围的[0..10^6]啊/w\)
 program bzoj2453;
const maxn=;maxm=;
var n,m,i,block,x,y,q:longint;
ch:char;
pos,a,b,pre:array[-..maxn]of longint;
last:array[-..maxm]of longint; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; procedure qsort(L,R:longint);
var i,j,mid:longint;
begin
i:=L;j:=R;mid:=pre[random(R-L+)+L];
repeat
while (i<R)and(pre[i]<mid) do inc(i);
while (L<j)and(pre[j]>mid) do dec(j);
if i<=j then
begin
pre[]:=pre[i];pre[i]:=pre[j];pre[j]:=pre[];
inc(i);dec(j);
end;
until i>j;
if i<R then qsort(i,R);
if L<j then qsort(L,j);
end; procedure new(x:longint);
var l,r,i:longint;
begin
l:=(x-)*block+;r:=min(x*block,n);
for i:=l to r do pre[i]:=b[i];
qsort(l,r);
end; procedure change(x,y:longint);
var i:longint;
begin
for i:= to n do last[a[i]]:=;
a[x]:=y;
for i:= to n do
begin
if last[a[i]]<>b[i] then
begin b[i]:=last[a[i]];
new(pos[i]);
end;
b[i]:=last[a[i]];
last[a[i]]:=i;
end;
end; function find(x,y:longint):longint;
var L,R,mid:longint;
begin
find:=(x-)*block;
L:=find+;R:=min(x*block,n);
while L<=R do
begin
mid:=(L+R) >> ;
if pre[mid]<=y then
begin
find:=mid;L:=mid+;
end else R:=mid-;
end;
dec(find,(x-)*block);
end; procedure build;
var i:longint;
begin
for i:= to n do last[a[i]]:=;
for i:= to n do
begin
b[i]:=last[a[i]];
last[a[i]]:=i;
end;
for i:= to m do new(i);
end; function query(x,y:longint):longint;
var i,tot:longint;
begin
tot:=;
if pos[x]=pos[y] then
begin
for i:=x to y do if b[i]<=x- then inc(tot);
end else
begin
for i:=x to pos[x]*block do if b[i]<=x- then inc(tot);
for i:=(pos[y]-)*block+ to y do if b[i]<=x- then inc(tot);
for i:=pos[x]+ to pos[y]- do inc(tot,find(i,x-));
end;
exit(tot);
end; begin
readln(n,q);
block:=trunc(sqrt(n));
for i:= to n do
begin
read(a[i]);
pos[i]:=(i-) div block+;
end;
readln;
if n mod block= then m:=n div block else m:=n div block+;
build;
for i:= to q do
begin
read(ch);
if ch='Q' then
begin
readln(x,y);
writeln(query(x,y));
end else
begin
readln(x,y);
change(x,y);
end;
end;
end.

[BZOJ2453]维护队列|分块的更多相关文章

  1. BZOJ2453: 维护队列

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 183  Solved: 89[Submit][Status] Descripti ...

  2. [bzoj2453]维护队列_带修改莫队

    维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...

  3. [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)

    传送门 只有第一个,第二个权限题. 分块,然而wa,没看出来错在哪里,有时间再看. #include <cmath> #include <cstdio> #include &l ...

  4. 【bzoj2453】维护队列 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...

  5. 【分块】bzoj2453 维护队列

    http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...

  6. BZOJ2453维护队列&&BZOJ2120数颜色

    2016-05-28 11:20:22 共同的思路: 维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案 块内按照pre排序 修改的时候重新O(n)扫一遍,如果和之前的不一 ...

  7. bzoj2120: 数颜色 &&bzoj2453: 维护队列

    题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...

  8. 【BZOJ2473/2120】维护队列 分块+二分

    Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...

  9. BZOJ 2453 维护队列 | 分块

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...

随机推荐

  1. CC3200在sl_Start函数处不断重启复位的原因解析

    1. 使用过程中,自己写的工程,发现CC3200一直重启,首先需要定位出现重启的函数?看门狗复位,还是程序跑飞复位?NWP的版本不匹配?经过测试找到出问题的函数,这个函数是启动网络的函数. lRetV ...

  2. 云计算之路-阿里云上:Web服务器请求到达量突降

    今天下午遇到了自使用阿里云以来首次遇到的新情况——http.sys的ArrivalRate突降(说明请求到达IIS的请求数量少了),而且SLB中的3台ECS都出现了这个问题. 1. 10.161.24 ...

  3. 适用于Linux的windows子系统

    Windows基于图形界面的易用性是有目共睹的,这也是很多普通用户往往难以舍弃的原因.但是Linux系统更强大的网络应用开发能力,却又是Windows系统所无法比拟的.一直以来,很多人都在试图采用各种 ...

  4. Navicat oracle to postgresql ERR

    可能的解决思路是设好源数据和目标数据库后,先建立表结构,然后修改表结构字段数据类型 参考 https://www.cnblogs.com/stephen-liu74/archive/2012/04/3 ...

  5. git安装后Gitbase闪退,gui无法使用问题解决

    一般是因为null.sys导致,根本原因应该还是你装的盗版系统有问题,解决办法如下 cmd 打开命题提示符后  输入  sc  start null  看 null.sys是否有问题,如果有问题,重新 ...

  6. python中socket、socketio、flask-socketio、WebSocket的区别与联系

    socket.socketio.flask-socketio.WebSocket的区别与联系 socket 是通信的基础,并不是一个协议,Socket是应用层与TCP/IP协议族通信的中间软件抽象层, ...

  7. 1087 All Roads Lead to Rome (30 分)(最短路径)

    直接用Dijkstra做 #include<bits/stdc++.h> using namespace std; int n,m; map<string,int>si; ma ...

  8. cordova相关

    官网 安装nodejs 常用命令: $ npm install -g cordova //安装cordova $ cordova create [project name] //创建工程 $ cord ...

  9. BZOJ 3569 DZY Loves Chinese II 树上差分+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...

  10. Daily Scrum02 12.03

    Daily Scrum03 12.03 一天过去了,新的一天即将到来,我们组仍旧干劲十足呢~ Member Today's Task Tomorrow's Task 李孟 孟神有点累了呢 task85 ...