分块大法好 orz

处理出每个点的前驱和后继位置。

暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 10005
using namespace std;
int n,m,nn,a[N],be[N],pre[N],nxt[N];
int last[1000005],pp[N],ans;
void work(int x){
int l=(x-1)*nn+1,r=min(n,x*nn);
for(int i=l;i<=r;i++)
pp[i]=pre[i];
sort(pp+l,pp+r+1);
}
void change(int x,int y){
a[x]=y;
if(nxt[x]){pre[nxt[x]]=pre[x];work(be[nxt[x]]);}
if(pre[x]){nxt[pre[x]]=nxt[x];work(be[pre[x]]);}
int pr=0,ne=0;
for(int i=1;i<=n;i++){
if(i<x&&a[i]==y) pr=i;
if(i>x&&a[i]==y){ne=i;break;}
}
pre[x]=pr; nxt[x]=ne;
work(be[x]);
if(pr) {nxt[pr]=x;work(be[pr]);}
if(ne) {pre[ne]=x;work(be[ne]);}
}
int main()
{
scanf("%d%d",&n,&m);
nn=(int) sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
be[i]=(i-1)/nn+1;
}
for(int i=1;i<=n;i++){
pre[i]=last[a[i]];
last[a[i]]=i;
if(pre[i]) nxt[pre[i]]=i;
}
int tot=be[n];
for(int i=1;i<=tot;i++)work(i);
char ch; int x,y,l,r,num;
while(m--){
ch=getchar();
while(ch!='Q'&&ch!='R')ch=getchar();
scanf("%d%d",&x,&y);
if(ch=='Q'){
ans=0;
if(be[x]==be[y]){
for(int i=x;i<=y;i++)if(pre[i]<x)ans++;
printf("%d\n",ans); continue;
}
for(int i=x;i<=be[x]*nn;i++)
if(pre[i]<x) ans++;
for(int i=(be[y]-1)*nn+1;i<=y;i++)
if(pre[i]<x) ans++;
for(int i=be[x]+1;i<be[y];i++){
l=(i-1)*nn+1,r=min(n,i*nn);
num=lower_bound(pp+l,pp+r+1,x)-pp;
ans+=num-l;
}
printf("%d\n",ans);
}
if(ch=='R') change(x,y);
}
return 0;
}

bzoj2120 数颜色 分块的更多相关文章

  1. Luogu 1903 数颜色 | 分块

    Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...

  2. BZOJ2120 数颜色 【带修莫队】

    BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...

  3. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  4. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  5. bzoj2120 数颜色 莫队 带修改

    [bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  6. BZOJ2120 数颜色(树套树)

    B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...

  7. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  8. BZOJ2120 数颜色 —— 待修改莫队

    题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit:  ...

  9. [Bzoj2120]数颜色 (非正解 )(莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6286  Solved: 2489[Submit][Status][Discuss] ...

随机推荐

  1. java并发包分析之———concurrentHashMap

    一.Map体系 Hashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.synchronizedMap不算).Hashtable继承的是Dictionary(Hasht ...

  2. SDL相关资料

    SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏.游戏SDK.演示软件.模拟器.MPEG播放器和其他应用软件.目前支持windows,linux ...

  3. Top Open Source Projects to Watch in 2017

    https://opensource.com/article/16/12/yearbook-projects-watch-2017 No one has a crystal ball to see t ...

  4. ES 在聚合结果中进行过滤

    ES查询中,先聚合,在聚合结果中进行过滤 { "size": 0, "aggs": { "terms": { "terms&quo ...

  5. Spring温故而知新 – AOP代理

    AOP的概念 AOP:Aspect-Oriented Programming(面向切面编程),维基百科的解释如下:Aspect是一种新的模块化机制,用来描述分散在对象.类或者函数中的横切关注点,从关注 ...

  6. CSS 外边距合并。

    <div id = "parent"> <div id = "child"> demo </div> </div> ...

  7. Django入门三之urls.py重构及参数传递

    1. 内部重构 2. 外部重构 website/blog/urls.py website/website/urls.py 3. 两种参数处理方式 -1. blog/index/?id=1234& ...

  8. larave5.4自定义公共函数的创建

    原文地址:http://blog.csdn.net/qq_38125058/article/details/76862151 公共函数,简单来说就是在任何地方都可以直接使用这个函数.简单介绍两种实现方 ...

  9. python_函数设计

    >>> def check_permission(func): def wrapper(*args,**kwargs): if kwargs.get('username')!='ad ...

  10. vue-awesome-swiper 的使用

    第一步 :  cnpm i vue-awesome-swiper --save (已经安装淘宝镜像 / 否则用 npm) 第二部:  在main.js 中 导入: import VueAwesomeS ...