BZOJ2120:数颜色(分块版)
浅谈分块: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:数颜色(分块版)的更多相关文章
- bzoj2120 数颜色 分块
分块大法好 orz 处理出每个点的前驱和后继位置. 暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了 #include<cstdio> #include<cstr ...
- Luogu 1903 数颜色 | 分块
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...
- BZOJ2120 数颜色 【带修莫队】
BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- bzoj2120 数颜色 莫队 带修改
[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- BZOJ2120 数颜色(树套树)
B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...
- BZOJ2120 数颜色 【带修改莫队】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 6579 Solved: 2625 [Submit][Status][Discus ...
- BZOJ2120 数颜色 —— 待修改莫队
题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: ...
- [Bzoj2120]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
随机推荐
- HTTP协议—HTTP响应头和请求头
HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. HTTP的头信息包括通用头.请求头.响应头和实体头四个部分.每个头域由一个域名,冒号(:)和域值三部分组成. 通用头标:即可用于请求,也可 ...
- DNS 转发配置
DNS 转发配置 我们配置DNS是只能解析我们定义的zone的,我们没有定义的是不能解析的. 配置DNS转发就可以解析其他互联网上的域名了,前提是这个域名在互联网中的企业在使用. 也就是说这个域名已经 ...
- linux下安装casperjs 开发运行环境
casperjs是一个基于phantomjs的测试框架,使用python进行操作,所以一个完整的casperjs环境需要安装phantomjs和python. 1 phantomjs安装 到官网下载最 ...
- recovery 差分升级包制作超时【转】
本文转载自:https://blog.csdn.net/csdn66_2016/article/details/73800349 我们在对android系统升级的时候,可以减少升级包的大小,只升级差异 ...
- POJ 2431 贪心+优先队列
题意:一辆卡车距离重点L,现有油量P,卡车每前行1米耗费油量1,途中有一些加油站,问最少在几个加油站加油可使卡车到达终点或到达不了终点. 思路:运用优先队列,将能走到的加油站的油量加入优先队列中, ...
- mysql-用命令导出、导入表结构或数据
1. 导出整个数据库(表结构和数据) mysqldump -u用户名 -p 数据库名 > 导出的文件名 [root@localhost work]# mysqldump -uroot -p m ...
- Struts2的<s:date>标签使用详解[转]
作用:用来格式化显示日期的格式. 它可以用一种你指定的格式来显示 (如:“yyyy-MM-dd”),可以生成通俗易懂的注释(如:in 2 hours,14 minutes),或者用预先定义的一个格式来 ...
- 字符串处理sdut 2411
题目:http://www.sdutacm.org/sdutoj/problem.php?action=showproblem&problemid=2411 关于字符串处理的题,此题坑点很多w ...
- tomcat 日志禁用
1.禁用catalina.out日志通过修改catalina.sh配置可以控制tomcat不生成该文件只要将if [ -z "$CATALINA_OUT" ] ; then CAT ...
- Java 关于final那些事
先说结论:对于引用类型的变量,Java本身会创建两个东西,一个是对象本身,另一个是记录对象地址的一个int值,将引用类型的对象声明为final实际上是固定记录地址的那个int的值不能改变,如果通过某种 ...