bzoj 2453 : 维护队列 带修莫队
2453: 维护队列
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 952 Solved: 432
[Submit][Status][Discuss]
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
把询问和修改分开排序,修改按时间排,询问以左端点所在块为第一关键字,右端点所在块为第二关键字,时间为第三关键字排序。
维护左右时间三个指针,不断修改还原。
块大小为$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 : 维护队列 带修莫队的更多相关文章
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...
- P1903 [国家集训队]数颜色 / 维护队列(带修莫队)
题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...
- BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )
题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...
- BZOJ 3052/Luogu P4074 [wc2013]糖果公园 (树上带修莫队)
题面 中文题面,难得解释了 BZOJ传送门 Luogu传送门 分析 树上带修莫队板子题... 开始没给分块大小赋初值T了好一会... CODE #include <bits/stdc++.h&g ...
随机推荐
- DP使用GUI推送WIN客户端是报110:1022错误的解决办法
在使用GUI推送WIN客户端时,输入用户名和密码后报错: [Critical 110::1022] Cannot connect to the SCM (Service Control Manage ...
- Linux(Contos7.5)环境搭建之JDK1.8安装(二)
1.下载安装包 wget -p 目录 url包地址 2.解压安装包 tar -xzvf 文件 -C 指定目录 3.修改名称 mv jdk1.8.0_45 jdk1.8 4.配置环境变量 vim /e ...
- SpringCloud学习:Eureka、Ribbon和Feign
Talk is cheap,show me the code , 书上得来终觉浅,绝知此事要躬行.在自己真正实现的过程中,会遇到很多莫名其妙的问题,而正是在解决这些问题的过程中,你会发现自己之前思维的 ...
- CentOs6.5中安装和配置vsftp简明教程[转]
CentOs6.5中安装和配置vsftp简明教程 林涛 发表于:2017-3-17 10:10 分类:WebServer 标签: 101次 一.vsftp安装篇 复制代码代码如下: # 安装vsftp ...
- 用java进行简单的万年历编写
import java.util.Scanner; public class PrintCalendarDemo1 { public static void main(String[] args) { ...
- GITHUB随笔 15-5月 junit
junit 是用来做单元测试的一个工具 测试是一个持续的过程.也就是说测试贯穿与开发的整个过程中,单元测试尤其适合于迭代增量式的开发过程. @ignore: 该元数据标记的测试方法在测试中会被忽 ...
- Leetcode题库——28.实现strStr()
@author: ZZQ @software: PyCharm @file: strStr.py @time: 2018/11/6 20:04 要求:给定一个 haystack 字符串和一个 need ...
- mvc 路由配置-学习
MapRoute(RouteCollection, String, String) 映射指定的URL路由. 'Declaration <ExtensionAttribute> _ Publ ...
- SCRUM:第一、二天任务实现情况
在团队项目“广商百货”的SCRUM项目中我认领的任务: LOGO设计 5.18熬夜完成LOGO设计(投票通过): 设计理念: 1.全矢量图设计,适应各种超大尺寸使用: 2.3D化透视设计,简约视效,也 ...
- 【最简单】不用ps也可以批量转换图片格式
不废话直接开始~ 1.新建文件夹,把需要转换的图片放进去,如图: 2.文件夹里建一txt文本,重点来了!txt文本的内容,如果是jpg转为png,则输入“ren *.jpg *.png”,同理png转 ...