记录编号 421819 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]数颜色 最终得分 100
用户昵称 Gravataryymxw 是否通过 通过
代码语言 C++ 运行时间 0.425 s
提交时间 2017-07-08 10:26:46 内存使用 0.58 MiB
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
vector<int> pos[10100];
map<int,int> ma;
inline 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<<3)+(x<<1)+ch-'0';
    ch=getchar();
  }
  return x*f;
}
int n,m,len,x,y,ji=0;
int a[10010],match[10010],pre[10010],cop[10010];
char s;
int query(int x,int y)
{
  int shu=0;
  if(match[x]+1>=match[y])
  {
    for(int i=x;i<=y;++i)
      if(cop[i]<x)
        shu++;
  }
  else
  {
    for(int i=x;i;++i)
    {
      if(match[x]!=match[i])
        break;
      if(cop[i]<x)
      {
        shu++;
      }
    }
    for(int i=y;i;--i)
    {
      if(match[y]!=match[i])
        break;
      if(cop[i]<x)
      {
        shu++;
      }
    }
    for(int i=match[x]+1;i<=match[y]-1;++i)
    {
      int l=(i-1)*len+1,r=(i-1)*len+len,mid;
      while(l<=r)
      {
        mid=(l+r)/2;
        if(pre[mid]<x)
          l=mid+1;
        else
          r=mid-1;
      }
      shu+=l-(i-1)*len-1;
    }
  }
  return shu;
}
void change(int x,int y)
{
  a[x]=y;
  if(ma.count(a[x]))
  {
    a[x]=ma[a[x]];
  }
  else
  {
    ji++;
    a[x]=ma[a[x]]=ji;
  }
  for(int i=x+1;i<=n;++i)
  {
    if(cop[i]==x)
    {
      cop[i]=cop[x];
      for(int j=(match[i]-1)*len+1;j<=min(match[i]*len,n);++j)
        pre[j]=cop[j];
      sort(pre+(match[i]-1)*len+1,pre+min(match[i]*len,n)+1);
      break;
    }
  }
  for(int i=x+1;i<=n;++i)
  {
    if(a[i]==a[x])
    {
      cop[i]=x;
      for(int j=(match[i]-1)*len+1;j<=min(match[i]*len,n);++j)
        pre[j]=cop[j];
      sort(pre+(match[i]-1)*len+1,pre+min(match[i]*len,n)+1);
      break;
    }
  }
  pre[x]=0;
  cop[x]=0;
  for(int i=x-1;i>=1;--i)
  {
    if(a[i]==a[x])
    {
      cop[x]=i;
      break;
    }
  }
  for(int j=(match[x]-1)*len+1;j<=min(match[x]*len,n);++j)
    pre[j]=cop[j];
  sort(pre+(match[x]-1)*len+1,pre+min(match[x]*len,n)+1);
}
int main()
{
  freopen("nt2011_color.in","r",stdin);
  freopen("nt2011_color.out","w",stdout);
  //memset(pre,0x3f,sizeof(pre));
  //memset(cop,0x3f,sizeof(cop));
  n=read();m=read();
  len=(int)sqrt(n+0.5);
  //len=50;
  for(int i=1;i<=n;++i)
  {
    a[i]=read();
    if(ma.count(a[i]))
    {
      a[i]=ma[a[i]];
    }
    else
    {
      ji++;
      a[i]=ma[a[i]]=ji;
    }
    if(pos[a[i]].empty())
      pre[i]=cop[i]=0;
    else
      pre[i]=cop[i]=pos[a[i]][pos[a[i]].size()-1];
    pos[a[i]].push_back(i);
  }
  //for(int i=1;i<=n;++i)
    //for(int j=i-1;j>=1;--j)
      //if(a[j]==a[i])
        //pre[i]=cop[i]=j;
  for(int i=1;i<=n;++i)
    match[i]=(i-1)/len+1;
  for(int i=1;i<=match[n];++i)
    sort(pre+(i-1)*len+1,pre+min(i*len,n)+1);
  for(int i=1;i<=m;++i)
  {
    scanf("%s",&s);
    x=read();y=read();
    if(s=='Q')
    {
      int e=query(x,y);
      printf("%d\n",e);
    }
    if(s=='R')
    {
      change(x,y);
    }
  }
  //system("pause");
  return 0;
}