bzoj 2453: 维护队列
2016-03-31 22:36
197 查看
2453: 维护队列
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 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 31 2
Q 1 2
R 1 2
Q 1 2
Sample Output
21
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)); } }
相关文章推荐
- linux下常用命令
- Linux_ mkfifo 命名管道 操作
- Linux_ pipe 匿名管道demo
- bzoj 2453: 维护队列
- 关于java,tomcat直连mySql,Sqlserver数据库
- Linux_ pipe 匿名管道 浅解
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- 开放搜索服务OpenSearch
- Linux_信号操作 demo
- linux下的hugepage
- 文章标题
- Linux_信号操作
- Linux Socket 原始套接字编程
- 硬链接和软连接
- ./spark-submit --class Test --master spark://localhost:7077 /usr/local/aa.jar
- 登录式shell的执行顺序及简单应用
- Linux学习笔记7
- hadoop入门教程-程序小实例
- shell 之 bash 与sh 区别
- Linux平台RTL8188CUS驱动移植及测试