2453: 维护队列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 952  Solved: 432
[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福建集训

  把询问和修改分开排序,修改按时间排,询问以左端点所在块为第一关键字,右端点所在块为第二关键字,时间为第三关键字排序。

  维护左右时间三个指针,不断修改还原。

  块大小为$n^{\frac{2}{3}}$。

  左指针每个询问走$n^{\frac{2}{3}}$。

  右指针同理,不过要多上每次总从左走到右的复杂度,总共$n\times n^{\frac{2}{3}}+n\times n^{\frac{1}{3}}$。

  时间指针每次左右端点所在块变化重新开始走,一共$n^{\frac{2}{3}}$个不同的左右块匹配数,复杂度$n\times n^{\frac{2}{3}}$.

  好像块开100比较快。

  (写莫队时一定要先把lr往两边移,再向中间移)

  

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define d 100
#define N 10005
using namespace std;
int n,m;
int c[N];
struct node
{
int l,r,t,pr;
node(){l=r=t=;}
}q[N],g[N];
int cnt1,cnt2;
bool cmp1(const node &aa,const node &bb)
{
return aa.t<bb.t;
}
int be1[N],be2[N];
bool cmp2(const node &aa,const node &bb)
{
if(be1[aa.l]==be1[bb.l])
{
if(be2[aa.r]==be2[bb.r])return aa.t<bb.t;
return aa.r<bb.r;
}
return aa.l<bb.l;
}
int ans[N];
int now[N*],cnt;
void solve()
{
int p1,p2,p;
memset(now,,sizeof(now));
now[c[]]=;cnt=;g[cnt1+].t=;
p=p1=;
p2=;
for(int i=;i<=cnt2;i++)
{
while(g[p2+].t<q[i].t)
{
p2++;
int tmp=c[g[p2].l];
g[p2].pr=tmp;
c[g[p2].l]=g[p2].r;
if(g[p2].l<=p&&g[p2].l>=p1)
{
now[tmp]--;
if(!now[tmp])cnt--;
now[g[p2].r]++;
if(now[g[p2].r]==)cnt++;
}
}
while(g[p2].t>q[i].t)
{ c[g[p2].l]=g[p2].pr;
if(g[p2].l<=p&&g[p2].l>=p1)
{
now[g[p2].r]--;
if(!now[g[p2].r])cnt--;
now[g[p2].pr]++;
if(now[g[p2].pr]==)cnt++;
}
p2--;
}
while(p<q[i].r)
{
p++;now[c[p]]++;
if(now[c[p]]==)cnt++;
}
while(p>q[i].r)
{
now[c[p]]--;if(!now[c[p]])cnt--;
p--;
}
while(p1<q[i].l)
{
now[c[p1]]--;if(!now[c[p1]])cnt--;
p1++;
}
while(p1>q[i].l)
{
p1--;now[c[p1]]++;
if(now[c[p1]]==)cnt++;
}
ans[q[i].t]=cnt;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<=n;i++)
{
be1[i]=be2[i]=(i-)/d+;
}
memset(ans,-,sizeof(ans));
char s[];
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='R')
{
cnt1++;
scanf("%d%d",&g[cnt1].l,&g[cnt1].r);
g[cnt1].t=i;
}
else
{
cnt2++;
scanf("%d%d",&q[cnt2].l,&q[cnt2].r);
q[cnt2].t=i;
}
}
sort(q+,q+cnt2+,cmp2);
sort(g+,g+cnt1+,cmp1);
solve();
for(int i=;i<=m;i++)
{
if(ans[i]!=-)printf("%d\n",ans[i]);
}
return ;
}

bzoj 2453 : 维护队列 带修莫队的更多相关文章

  1. 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队

    题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...

  2. Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  3. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  4. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  5. P1903 [国家集训队]数颜色 / 维护队列 带修改莫队

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  6. luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队

    十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...

  7. P1903 [国家集训队]数颜色 / 维护队列(带修莫队)

    题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...

  8. BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )

    题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...

  9. BZOJ 3052/Luogu P4074 [wc2013]糖果公园 (树上带修莫队)

    题面 中文题面,难得解释了 BZOJ传送门 Luogu传送门 分析 树上带修莫队板子题... 开始没给分块大小赋初值T了好一会... CODE #include <bits/stdc++.h&g ...

随机推荐

  1. 配置tensorflow环境(anaconda+jupyter notebook)

    很早之前,tensorflow环境之前我也曾装过,但是用的不是很舒服,很多问题都不明所以然.今天想要系统地学习一下tensorflow,于是又重新搭建了一遍,这次还是踩了不少坑.特此写下此文,供有兴趣 ...

  2. jobs命令详解

    基础命令学习目录首页 在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台.导致无法退出root的. 输入命令:exit终端显示:There are stopped jobs. 解决方法:方法一 ...

  3. js中使用对象注意

    var myObject = { hello: '你好', world : '世界' } 正常使用 myObject.hello   //输出你好 若引用的属性本身是一个变量: 需要用方括号使用 va ...

  4. servlet基础学习总结

    Servlet的任务 1.  读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单 2.  读取客户端发送的隐式的数据,包括cookies.媒体类型等 3.  处理数据并产生结果 4.  ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 第12章 优先队列与堆 一.概述 堆 堆的前提就是他首先是一个完全二叉树,其次就是满足 ...

  6. 团队冲刺——Five

    昨天: 司宇航:web项目如何部署到公网,把网址做成桌面图标链接,登录记住密码功能. 王金萱:注册和登录界面,用户数据库的信息录入. 马佳慧:做界面. 季方:处理爬虫数据,实现统计功能. 遇到的问题: ...

  7. iOS学习资源搜集

    swift 2.0 新的开始 iOS7初学者入门 斯坦福大学公开课:iOS 8开发 苹果官方开发 中文 iOS/Mac 开发博客列表    git

  8. Leetcode题库——5.最长回文子串

    @author: ZZQ @software: PyCharm @file: longestPalindrome.py @time: 2018/9/18 20:06 要求:给定一个字符串 s,找到 s ...

  9. es6 ...展开运算符

    展开运算符,目前应用在数组上,对象展开运算符,将在es7 提案 1.两个对象连接返回新的对象   let a = {aa:'aa'} let b = {bb:'bb'} let c = {...a,. ...

  10. testng对执行失败的用例,再次执行

    前段时间在网络上看到通过重写TestNG的接口,可以再次执行失败的测试用例,于是学习了,我之前的做法是当自己的脚本中碰到异常,就自动调用方法本身来达到再次执行用例的目的,这个过程中有设定重试的次数 对 ...