您的位置:首页 > 运维架构

bzoj 2453: 维护队列

2016-03-31 22:36 197 查看

2453: 维护队列

Time Limit: 10 Sec Memory Limit: 128 MB

Submit: 621 Solved: 264

[Submit][Status][Discuss]

Description

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

Input

输入文件第一行包含两个整数N和M。
第二行N个整数,表示初始队列中弹珠的颜色。
接下来M行,每行的形式为“Q L R”或“R x c”,“Q L R”表示A想知道从队列第L个弹珠到第R个弹珠中,一共有多少不同颜色的弹珠,“R x c”表示A把x位置上的弹珠换成了c颜色。

Output

对于每个Q操作,输出一行表示询问结果。

Sample Input

2 3

1 2

Q 1 2

R 1 2

Q 1 2

Sample Output

2

1

HINT

对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。

Source

2011福建集训

细节决定成败啊,改变一个语句就有可能从TLE 转变为AC啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 10003
using namespace std;
int n,m,t,cnt,s;
int point[1000003],next
,pre
;
int a
,pos
;
void work(int x)
{
int l=(x-1)*cnt+1; int r=min(cnt*x,n);
for (int i=l;i<=r;i++)
next[i]=pre[i];
sort(next+l,next+r+1);
}
void change(int x,int v)
{
for(int i=1;i<=n;i++)
point[a[i]]=0;
a[x]=v;
for (int i=1;i<=n;i++)
{
int t=pre[i];
pre[i]=point[a[i]];
if (t!=pre[i])  work(pos[i]);
point[a[i]]=i;
}
}
int ask(int x,int y)
{
int ans=0;
if (pos[x]==pos[y])
{
for (int i=x;i<=y;i++)  if (pre[i]<x)  ans++;
}
else
{
for (int i=x;i<=pos[x]*cnt;i++)  if (pre[i]<x)  ans++;
for (int i=(pos[y]-1)*cnt+1;i<=y;i++) if (pre[i]<x) ans++;
for (int i=pos[x]+1;i<=pos[y]-1;i++)
{
int l=(i-1)*cnt+1; int r=min(i*cnt,n);
int t=lower_bound(next+l,next+r+1,x)-next;
t-=(l-1);
ans+=t-1;
}
}
return ans;
}
int main()
{
freopen("a.in","r",stdin);
freopen("my.out","w",stdout);
scanf("%d%d",&n,&m);
cnt=sqrt(n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
pos[i]=(i-1)/cnt+1;
}
for (int i=1;i<=n;i++)
pre[i]=point[a[i]],point[a[i]]=i;
if (n%cnt) s=n/cnt+1;
else s=n/cnt;
for (int i=1;i<=s;i++)  work(i);
for (int i=1;i<=m;i++)
{
char c[10]; int x,y;
scanf("%s%d%d",c,&x,&y);
if (c[0]=='R')  change(x,y);
else  printf("%d\n",ask(x,y));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: