【BZOJ2473/2120】维护队列 分块+二分
Description
Input
Output
Sample Input
1 2
Q 1 2
R 1 2
Q 1 2
Sample Output
1
HINT
对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。
Source
惭愧,又看了黄学长题解。。。引入一个pre数组,记录前一个相同颜色的位置,块内排序,有点像一个链?,然后查询时只要比pre【i】比l小,则同一个块内前面的都满足。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define N 10010
using namespace std;
int last[],pre[N],a[N],b[N],pos[N];
int n,m,q,block;
void build()
{
for (int i=;i<=n;i++)
{
b[i]=last[a[i]];
last[a[i]]=i;
pos[i]=(i-)/block+;
}
}
void make_block(int x)
{
int l=(x-)*block+,r=min(x*block,n);
for (int i=l;i<=r;i++) pre[i]=b[i];
sort(pre+l,pre+r+);
}
int er_find(int x,int v)
{
int l=(x-)*block+,r=min(x*block,n),l1;
l1=l;
while (l<=r)
{
int mid=(l+r)>>;
if (pre[mid]<v) l=mid+;
else r=mid-;
}
return l-l1;
}
int query(int l,int r)
{
int ans=;
if (pos[l]==pos[r]) {for (int i=l;i<=r;i++) if (b[i]<l) ans++;}
else
{
for (int i=l;i<=pos[l]*block;i++) if (b[i]<l) ans++;
for (int i=(pos[r]-)*block+;i<=r;i++) if (b[i]<l) ans++;
for (int i=pos[l]+;i<pos[r];i++) ans+=er_find(i,l);
}
return ans;
}
void change(int x,int v)
{
for (int i=;i<=n;i++) last[a[i]]=;
a[x]=v;
for (int i=;i<=n;i++)
{
int t=b[i];
b[i]=last[a[i]];
if (t!=b[i]) make_block(pos[i]);
last[a[i]]=i;
}
}
int main()
{
scanf("%d%d",&n,&q);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
block=int(sqrt(n));
if (n%block) m=n/block+;
else m=n/block;
build();
for (int i=;i<=m;i++) make_block(i);
for (int i=;i<=q;i++)
{
char ch[];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if (ch[]=='Q') printf("%d\n",query(x,y));
else change(x,y);
}
return ;
}
【BZOJ2473/2120】维护队列 分块+二分的更多相关文章
- 【bzoj2453】维护队列 (分块 + 二分)
传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...
- [BZOJ2453]维护队列|分块
Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...
- BZOJ 2453 维护队列 | 分块
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...
- 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 578 Solved: 247[Submit][Status][Discuss] ...
- 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块
[BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...
- BZOJ2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 183 Solved: 89[Submit][Status] Descripti ...
随机推荐
- [LeetCode] Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- CentOS下用yum配置php+mysql+apache(LAMP)
#安装需要的包,有依赖关系,自动帮你解决 yum install httpd mysql mysql-server php php-gd php-mbstring php-mysql #启动httpd ...
- html5 web database
html5 web database <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Win10 VS2015 社区版切换到VS2013社区版 进行维护之前的项目
前提:当先在Win10 OS 安装了vs2015之后开发Win UAP,之后要维护之前的WP8 版本,安装了VS2013社区版 打开后 1问.Exception from HRESULT: 0x897 ...
- C语言面试
最全的C语言试题总结 第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被 ...
- Git提交基本流程
在无其他分支,大家都向同一分支master分支提交代码的情况下: 1.查看本地对代码的修改情况,即可以被提交的修改记录 git status 其中被修改过的文件标识为modified,删除的文件del ...
- 设定自动获得DNS服务器地址
情况说明:操作系统是Win7 64位, 网络是有线 1 2 3 4 5
- [Liferay6.2]AUI表单验证示例
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib uri="http://jav ...
- loj 1377 (bfs)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1377 思路:这道题只要处理好遇到"*"这种情况就可以搞定了.我们可 ...
- 软引用SoftReference异步加载图片
HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了. 机制 ...