bzoj2120 数颜色 分块
分块大法好 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 数颜色 分块的更多相关文章
- 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] ...
随机推荐
- java并发包分析之———concurrentHashMap
一.Map体系 Hashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.synchronizedMap不算).Hashtable继承的是Dictionary(Hasht ...
- SDL相关资料
SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏.游戏SDK.演示软件.模拟器.MPEG播放器和其他应用软件.目前支持windows,linux ...
- 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 ...
- ES 在聚合结果中进行过滤
ES查询中,先聚合,在聚合结果中进行过滤 { "size": 0, "aggs": { "terms": { "terms&quo ...
- Spring温故而知新 – AOP代理
AOP的概念 AOP:Aspect-Oriented Programming(面向切面编程),维基百科的解释如下:Aspect是一种新的模块化机制,用来描述分散在对象.类或者函数中的横切关注点,从关注 ...
- CSS 外边距合并。
<div id = "parent"> <div id = "child"> demo </div> </div> ...
- Django入门三之urls.py重构及参数传递
1. 内部重构 2. 外部重构 website/blog/urls.py website/website/urls.py 3. 两种参数处理方式 -1. blog/index/?id=1234& ...
- larave5.4自定义公共函数的创建
原文地址:http://blog.csdn.net/qq_38125058/article/details/76862151 公共函数,简单来说就是在任何地方都可以直接使用这个函数.简单介绍两种实现方 ...
- python_函数设计
>>> def check_permission(func): def wrapper(*args,**kwargs): if kwargs.get('username')!='ad ...
- vue-awesome-swiper 的使用
第一步 : cnpm i vue-awesome-swiper --save (已经安装淘宝镜像 / 否则用 npm) 第二部: 在main.js 中 导入: import VueAwesomeS ...