BZOJ_2120_数颜色_Set+树状数组+主席树

Description

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

Input

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。


记录一下第i位置左边第一个和i位置颜色相等的位置L[i]。

然后查询区间[x,y]就相当于查询区间中有多少L[]小于x。

可以用主席树来维护。

修改的话修改原颜色的后继和新颜色的后继和它本身即可,这个可以对所有颜色开一个set来实现。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
#define ms multiset<int>
#define N 10050
ms S[1000050];
int L[N],a[N],n,m,now[1000050];
int t[N*800],ls[N*800],rs[N*800],cnt,root[N];
int lx,ly,ax[N],ay[N];
char opt[10];
void update(int l,int r,int x,int v,int &p) {
if(!p) p=++cnt;
t[p]+=v;
if(l==r) return ;
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,v,ls[p]);
else update(mid+1,r,x,v,rs[p]);
}
int query(int l,int r,int x) {
int i;
if(l==r) {
int re=0;
for(i=1;i<=lx;i++) re+=t[ax[i]];
for(i=1;i<=ly;i++) re-=t[ay[i]];
return re;
}
int mid=(l+r)>>1;
int sizls=0;
for(i=1;i<=lx;i++) sizls+=t[ls[ax[i]]];
for(i=1;i<=ly;i++) sizls-=t[ls[ay[i]]];
if(x<=mid) {
for(i=1;i<=lx;i++) ax[i]=ls[ax[i]];
for(i=1;i<=ly;i++) ay[i]=ls[ay[i]];
return query(l,mid,x);
}else {
for(i=1;i<=lx;i++) ax[i]=rs[ax[i]];
for(i=1;i<=ly;i++) ay[i]=rs[ay[i]];
return query(mid+1,r,x)+sizls;
}
}
void fix(int p,int v) {
int i;
for(i=p;i<=n;i+=i&(-i)) update(0,n,L[p],-1,root[i]);
L[p]=v;
for(i=p;i<=n;i+=i&(-i)) update(0,n,L[p],1,root[i]);
}
int main() {
scanf("%d%d",&n,&m);
int i,j,x,y;
for(i=1;i<=n;i++) {
scanf("%d",&a[i]);
S[a[i]].insert(i);
L[i]=now[a[i]];
now[a[i]]=i;
for(j=i;j<=n;j+=j&(-j)) {
update(0,n,L[i],1,root[j]);
}
}
while(m--) {
scanf("%s%d%d",opt,&x,&y);
if(opt[0]=='Q') {
lx=ly=0;
for(i=y;i;i-=i&(-i)) ax[++lx]=root[i];
for(i=x-1;i;i-=i&(-i)) ay[++ly]=root[i];
printf("%d\n",query(0,n,x-1));
}else {
int pre=0,nxt=0;
ms::iterator it; it=S[a[x]].lower_bound(x);
if(it!=S[a[x]].begin()) pre=*(--it),++it;
it++;
if(it!=S[a[x]].end()) nxt=*it;
if(nxt) fix(nxt,pre); S[a[x]].erase(x);
S[y].insert(x);
a[x]=y; int newpre=0,newnxt=0;
it=S[y].lower_bound(x);
if(it!=S[y].begin()) newpre=*(--it),++it;
it++;
if(it!=S[y].end()) newnxt=*it;
fix(x,newpre);
if(newnxt) fix(newnxt,x);
// printf("%d %d %d %d\n",pre,nxt,newpre,newnxt); }
}
}
												

BZOJ_2120_数颜色_Set+树状数组+主席树的更多相关文章

  1. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  2. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  3. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  4. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  5. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  6. [luoguP1972] [SDOI2009]HH的项链(莫队 || 树状数组 || 主席树)

    传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] ...

  7. BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]

    题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...

  8. HDU 3333 Turing Tree(树状数组/主席树)

    题意 给定一个长度为 \(n​\) 的序列,\(m​\) 个查询,每次查询区间 \([L,R]​\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...

  9. 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)

    (题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...

随机推荐

  1. [Python3网络爬虫开发实战] 1.2.1-Requests的安装

    由于Requests属于第三方库,也就是Python默认不会自带这个库,所以需要我们手动安装.下面我们首先看一下它的安装过程. 1. 相关链接 GitHub:https://github.com/re ...

  2. Python之爬虫-猫眼电影

    Python之爬虫-猫眼电影 #!/usr/bin/env python # coding: utf-8 import json import requests import re import ti ...

  3. 常见算法的python实现

    提到排序算法,常见的有如下几种:冒泡排序.选择排序.插入排序.快速排序.堆排序.归并排序.希尔排序:查找算法最常见二分查找.这些算法的时间复杂度如下: 算法名称 时间复杂度(一般情况) 冒泡排序 O( ...

  4. Java 集合相关

    对整个体系做一个记录,并不涉及详细应用 Object类 1. 重写toString方法 System.out.println可以打印任何对象在于Object类拥有一个方法 public String ...

  5. spark streaming 踩过的那些坑

      系统背景 spark streaming + Kafka高级API receiver 目前资源分配(现在系统比较稳定的资源分配),独立集群 --driver-memory 50G   --exec ...

  6. 2018/3/4 Activiti教程之对于流程的基本操作以及从发起到完成还有相关注意事项(与Springboot整合版)三

    写教程实在太累了,,,还浪费时间,Activiti教程就写到这好了,不过最近在玩区块链,到时候写几个区块链方面的教程. 这是一些流程的查询与删除api,删除这块,默认是级联删除(加个false参数,就 ...

  7. [bzoj3527][Zjoi2014]力_FFT

    力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...

  8. 06-js的逻辑结构

    <html> <head> <title>js的逻辑结构和循环结构学习</title> <meta charset="UTF-8&quo ...

  9. JSP中自动刷新

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/auto-refresh.html: 细想一个显示在线比赛分数.股市状态或当前交易额的网页.对于所有这种类 ...

  10. swift container server 莫名stuck

    openstack swift container server的进程经常莫名其妙进入 D Ds等状态 记录一下这个时候 storage.error的log 便于分析 一种情形是下面这种log Jun ...