BZOJ2453维护队列&&BZOJ2120数颜色

2016-05-28 11:20:22

共同的思路:维护某种颜色上一次在哪里出现

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=0,f=1;char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
  return x*f;
}
int block,n,m,q;
int a[N],b[N],c[N],pre[M],pos[N];
char ch[2];
void reset(int x){
  int l=(x-1)*block+1,r=min(x*block,n);
  for(int i=l;i<=r;i++)b[i]=a[i];
  sort(b+l,b+r+1);
}
void update(int x,int v){
  for(int i=1;i<=n;i++)pre[c[i]]=0;
  c[x]=v;
  for(int i=1;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-1)*block+1,r=x*block,mid,tmp;
  while(l<=r){
    mid=l+r>>1;
    if(b[mid]<v)tmp=mid,l=mid+1;
    else r=mid-1;
  }
  return tmp-(x-1)*block;
}
int query(int l,int r){
  int ans=0;
  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]-1)*block+1;i<=r;i++)if(a[i]<l)ans++;
  }
  for(int i=pos[l]+1;i<pos[r];i++)ans+=find(i,l);
  return ans;
}
int main(){
  n=read();q=read();
  for(int i=1;i<=n;i++){
    c[i]=read();a[i]=pre[c[i]];
    pre[c[i]]=i;
  }
  block=(int)sqrt(n);
  for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;
  if(n%block)m=n/block+1;else m=n/block;
  for(int i=1;i<=m;i++)reset(i);
  while(q--){
    scanf("%s",ch);
    int x=read(),y=read();
    if(ch[0]==‘Q‘)printf("%d\n",query(x,y));
    else update(x,y);
  }
  return 0;
}

时间: 2024-10-13 14:38:18

BZOJ2453维护队列&&BZOJ2120数颜色的相关文章

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

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6286  Solved: 2489[Submit][Status][Discuss] Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干

BZOJ2120: 数颜色

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 1394  Solved: 516[Submit][Status] Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Inpu

[bzoj2453]维护队列_带修改莫队

维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话,我们就正常按照莫队一样左右移动区间即可. 有了修改操作的话,我们把块变成$n^{\frac{2}{3}}$,关键字变成:左端点所在块.右端点所在块和时间戳. 然后暴力就行了. Code: #include <iostream> #include <cstdio> #include &

BZOJ2453: 维护队列

2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 183  Solved: 89[Submit][Status] Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色.但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助. Inp

bzoj2120 数颜色 莫队 带修改

[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分

BZOJ2120数颜色(带修改莫队)

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 7384  Solved: 2998[Submit][Status][Discuss] Description 墨 墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要

bzoj2120: 数颜色 &amp;&amp;bzoj2453: 维护队列

题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色.             但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助. 题解:莫队或者分块 代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio>

BZOJ2120 数颜色 分块+二分法

题意:给定一个颜色序列,维护:1.单点修改  2.区间查询不同颜色的种数 题解: 定义f[i]为i左边第一个和i颜色相同的位置,用分块来维护f. 询问:看区间中有多少个位置的f[i]<l 更新:暴力枚举p左右最近的与p颜色相同的位置,更新即可 #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #includ

【分块】bzoj2120 数颜色

分块,在每个点记录一下它之前离它最近的相同颜色的位置pre[i],显然问题转化成了求[l,r]中pre[i]<l的值的个数. 这是分块擅长的,在每个块内记录有序表,查询时对零散的暴力,整块的二分即可. 修改时有点麻烦,设修改a[p]. 可能会对pre[p]产生影响: 可能会对p位置之后的第一个 与a[p]修改前相等的值 的pre 产生影响: 可能会对p位置之后的第一个 与a[p]修改后相等的值 的pre 产生影响. 细节蛮多,调了很久.<---蒟蒻. 1 #include<cstdio&