BZOJ2453维护队列&&BZOJ2120数颜色
2016-05-28 11:20:22
共同的思路:
维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案
块内按照pre排序
修改的时候重新O(n)扫一遍,如果和之前的不一样,则重置所在块
查询时和普通分块一样,整块二分,两边暴力
BZOJ2453 http://www.lydsy.com/JudgeOnline/problem.php?id=2453
BZOJ2120 http://www.lydsy.com/JudgeOnline/problem.php?id=2120
#include<bits/stdc++.h>
#define inf 1000000000
#define ll long long
#define N 10005
#define M 1000005
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int block,n,m,q;
int a[N],b[N],c[N],pre[M],pos[N];
char ch[];
void reset(int x){
int l=(x-)*block+,r=min(x*block,n);
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+);
}
void update(int x,int v){
for(int i=;i<=n;i++)pre[c[i]]=;
c[x]=v;
for(int i=;i<=n;i++){
int t=a[i];
a[i]=pre[c[i]];
if(t!=a[i])reset(pos[i]);
pre[c[i]]=i;
}
}
int find(int x,int v){
int l=(x-)*block+,r=x*block,mid,tmp;
while(l<=r){
mid=l+r>>;
if(b[mid]<v)tmp=mid,l=mid+;
else r=mid-;
}
return tmp-(x-)*block;
}
int query(int l,int r){
int ans=;
if(pos[l]==pos[r]){
for(int i=l;i<=r;i++)if(a[i]<l)ans++;
}
else{
for(int i=l;i<=block*pos[l];i++)if(a[i]<l)ans++;
for(int i=(pos[r]-)*block+;i<=r;i++)if(a[i]<l)ans++;
}
for(int i=pos[l]+;i<pos[r];i++)ans+=find(i,l);
return ans;
}
int main(){
n=read();q=read();
for(int i=;i<=n;i++){
c[i]=read();a[i]=pre[c[i]];
pre[c[i]]=i;
}
block=(int)sqrt(n);
for(int i=;i<=n;i++)pos[i]=(i-)/block+;
if(n%block)m=n/block+;else m=n/block;
for(int i=;i<=m;i++)reset(i);
while(q--){
scanf("%s",ch);
int x=read(),y=read();
if(ch[]=='Q')printf("%d\n",query(x,y));
else update(x,y);
}
return ;
}
BZOJ2453维护队列&&BZOJ2120数颜色的更多相关文章
- BZOJ2120 数颜色 【带修莫队】
BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...
- [bzoj2453]维护队列_带修改莫队
维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...
- BZOJ2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 183 Solved: 89[Submit][Status] Descripti ...
- bzoj2120 数颜色 莫队 带修改
[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- 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 数颜色(树套树)
B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...
- [Bzoj2120]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
- bzoj2120: 数颜色 &&bzoj2453: 维护队列
题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...
随机推荐
- MyEclipse 选中右侧编辑的文件时自动展开左侧目录树
- 再谈EF Core内存数据库单元测试问题
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在用EF Core的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...
- 智能车学习(三)—— ADC学习
一.代码分享: 1.ADC头文件 #ifndef ADC_H_ #define ADC_H_ #include "common.h" typedef enum { // ----- ...
- Android Studio 插件整理
1.GsonFormat 快速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程. 使用方法:快捷键Alt+S也可以使用Alt+Insert选择G ...
- RMI的概念
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来 ...
- AJAX案例三:处理XML响应
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- Uva 129 Krypton Factor
0.这道题的输出 处理起来挺麻烦的 以后类似的可以借鉴一下 ;i<cur;i++) { && i%==) printf("\n%c",a[i]); & ...
- PHP学习之常量
1.常量是一个简单值的标识符,该值在脚本中不能改变: 2.一个常量由英文字母,下划线,和数字组成,但数字不能作为首字母出现:(常量名中不需要加$修饰符) 3.常量在整个脚本中都可以使用: 4.设置PH ...
- MVVM datatemplate 下button.contextmenu的command 失效解决方案
<Button CommandParameter="{Binding}" Tag="{Binding RelativeSource={RelativeSource ...
- css3 -- 伪类与伪元素
伪类: 1.结构伪类 A:E : first-child{} E : nth-*(n){} E : first-*(even){} E : first-*(odd){} B:nth-child 是根 ...