【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 ...
随机推荐
- phpcms v9 常用调用标签(全)
本文介绍phpcms v9中模板标签使用说明. {template ) {==} {/,,)} loop是data的时候用{thumb($v[thumb],,)} 分页标签------{$ ...
- 配置ogg异构oracle-mysql 双向同步注意事项
双向同步需要考虑的是怎么解决循环复制,以及同时更新一张表以谁为基准. 配置过程就不写了,大致和oracle到mysql的单向+mysql到oracle的单向差不多. 需要注意的有如下几点: 1.ora ...
- csc.rsp Invent by Microshaoft
# This file contains command-line options that the C# # command line compiler (CSC) will process as ...
- PHP模拟POST请求,获取response内容
/* * 模拟POST请求,获取response内容 */ protected function curl($url, $type, $header, $data) { $CURL_OPTS = ar ...
- 【vijos】P1514天才的记忆
描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏.题目 ...
- 即时通讯(IM-instant messager)
即时通讯又叫实时通讯,简单来说就是两个及以上的人使用网络进行文字.文件.语音和视频的交流. 首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是xmpp.xmpp协议要传递的消息类型是xm ...
- Apache Tomcat配置
- em与rem
em是相对于父元素的font-size,rem是相对于根元素的font-size. rem的补充: ① 对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明.这些浏览器会忽略用rem设定 ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- 关于oracle ORA-28001的解决方法
今天发现客户的机器上的系统登录不上了,并且提示如下情况: 发现原来Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修 ...