浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2120

树套树做法:https://www.cnblogs.com/AKMer/p/10189008.html

对于每个块维护块内\(pre\)上升的数组即可,每次查找直接\(lower\) \(bound\)一下,其它的跟树套树版的没什么区别。

时间复杂度:\(O(nlog\sqrt{n}+m\sqrt{n}log\sqrt{n})\)

空间复杂度:\(O(n)\)

代码如下:

#include <set>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1e4+5,maxv=1e6+5;; char s[5];
int n,m,block;
set<int>pos[maxv];
set<int>::iterator it;
int L[105],R[105],f[105][105];
int col[maxn],bel[maxn],pre[maxv],now[maxv]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void build(int id) {
for(int i=L[id];i<=R[id];i++)
f[id][i-L[id]+1]=pre[i];
sort(f[id]+1,f[id]+R[id]-L[id]+2);
} int main() {
n=read(),m=read(),block=sqrt(n);
for(int i=1;i<=n;i++) {
col[i]=read(),bel[i]=(i-1)/block+1;
if(pos[col[i]].empty())
pos[col[i]].insert(0),pos[col[i]].insert(n+1);
if(bel[i]!=bel[i-1])R[bel[i-1]]=i-1,L[bel[i]]=i;
pre[i]=now[col[i]],now[col[i]]=i,pos[col[i]].insert(i);
}R[bel[n]]=n;
for(int i=1;i<=bel[n];i++)build(i);
while(m--) {
scanf("%s",s+1);
if(s[1]=='Q') {
int ans=0,l=read(),r=read();
if(bel[l]==bel[r]) {
for(int i=l;i<=r;i++)if(pre[i]<l)ans++;
}
else {
for(int i=l;i<=R[bel[l]];i++)if(pre[i]<l)ans++;
for(int i=L[bel[r]];i<=r;i++)if(pre[i]<l)ans++;
for(int i=bel[l]+1;i<bel[r];i++)
ans+=lower_bound(f[i]+1,f[i]+R[i]-L[i]+2,l)-f[i]-1;
}
printf("%d\n",ans);
}
else {
int p=read(),c=read(),tmp=col[p],l,r;
if(pos[c].empty())pos[c].insert(0),pos[c].insert(n+1);
pos[tmp].erase(pos[tmp].find(p));
it=pos[tmp].lower_bound(p);
if(it!=pos[tmp].end()&&it!=pos[tmp].begin())
r=*it,it--,l=*it,pre[r]=l,build(bel[r]);
it=pos[c].lower_bound(p);
if(it!=pos[c].end())pre[*it]=p,build(bel[*it]);
if(it!=pos[c].begin())it--,pre[p]=*it,build(bel[p]);
pos[c].insert(p);
col[p]=c;
}
}
return 0;
}

BZOJ2120:数颜色(分块版)的更多相关文章

  1. bzoj2120 数颜色 分块

    分块大法好 orz 处理出每个点的前驱和后继位置. 暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了 #include<cstdio> #include<cstr ...

  2. Luogu 1903 数颜色 | 分块

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

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

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

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

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

  5. BZOJ 2120: 数颜色 分块

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

  6. bzoj2120 数颜色 莫队 带修改

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

  7. BZOJ2120 数颜色(树套树)

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

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

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

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

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

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

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

随机推荐

  1. 主攻ASP.NET MVC4.0之重生:Jquery Mobile 面板

    左滑动面板效果: 右滑动面板效果: @{ ViewBag.Title = "JQuery Mobile Web Page"; } <!DOCTYPE html> < ...

  2. JavaWeb Cookie

    1. Cookie 1.1. Cookie概述 Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件.Cookie是以键值对形式存储在客户端主机硬盘中,由服务器 ...

  3. UVA639 二叉树

    题意:深度为n的二叉树每个节点上有个开关,初始为关闭,每当小球落在节点上都会改变开关的状态,问编号为m的小球最终会落在哪里. 思路:对于二叉树的节点k,左节点右节点的编号为2k,2k+1.只需由最后一 ...

  4. 安装MySQL5.7.18遇到的坑

    最近才注意到MySQL的各个版本之间差别还挺大的,比如5.5.x版本的timestamp类型列只能有一个设置为default CURRENT_TIMESTAMP的,于是尝试了换成一个新版本是mysql ...

  5. 集成Spring web.xml配置总结

    1.web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet 1.serv ...

  6. input ajax自动补全

    页面 <div class="manage-Car-add-info-sn"> <p style="width:25%; height:70%;floa ...

  7. 解决Chrome Safari Opera环境下 动态创建iframe onload事件同步执行

    我们先看下面的代码: setTimeout(function(){ alert(count); },2000); var count = []; document.body.appendChild(c ...

  8. 二叉查找树--java

    package com.test.tree; public class BinarySearchTree<T extends Comparable<? super T>> { ...

  9. mysql数据库优化课程---3、数据库设计是什么

    mysql数据库优化课程---3.数据库设计是什么 一.总结 一句话总结: 就是设计各个字段及各个字段类型 1.char,varchar,text同存'ABC'的存储空间为多少? char(255): ...

  10. MDX中Filter 与Exist的区别

        获得一个集合,这个一般用来筛选出一个自定义的set,比如在中国的餐厅 该set返回所有MSDNteam下并且在Fact Thread度量上有记录的products 用Exists实现 sele ...