BZOJ 2120 数颜色 【带修改莫队】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120
2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MB
Submit: 10095 Solved: 4222
[Submit][Status][Discuss]
Description
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?
Input
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
Output
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
Sample Input
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
Sample Output
4
3
4
HINT
对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
2016.3.2新加数据两组by Nano_Ape
解题思路:
单点更新,xjb查询,莫队或者分块。
但是莫队需要离线,这里需要修改,怎么办呢?
引入第三个参数记录时间,根据时间点的不同更新答案。
AC code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 1e4+;
const int MAXM = 1e6+;
int N, M;
int h[MAXN], num[MAXN];
int ans[MAXN], sum[MAXM];
struct Query
{
int l, r, id, t;
}Q[MAXN]; struct Time
{
int ip, co, lt;
}t[MAXN];
int last[MAXN]; bool cmp(Query a, Query b)
{
if(h[a.l] != h[b.l]) return h[a.l] < h[b.l];
else{
if(h[a.r] != h[b.r]) return h[a.r] < h[b.r];
else return a.t < b.t;
}
} int update(int tt, int L, int R, int no)
{
int res = ;
int x = t[tt].ip, val = t[tt].co, lst = t[tt].lt;
if(t[tt].ip >= L && t[tt].ip <= R){
if(sum[num[x]] == ) res--;
sum[num[x]]--;
if(no == ){
if(sum[val] == ) res++;
sum[val]++;
}
else if(no == -){
if(sum[lst] == ) res++;
sum[lst]++;
}
}
if(no == ) num[x] = val;
else if(no == -) num[x] = lst;
return res;
} int add(int x, int val)
{
int res = ;
if(val == && sum[num[x]] == ) res++;
if(val == - && sum[num[x]] == ) res--;
sum[num[x]]+=val;
return res;
} int main()
{
scanf("%d %d", &N, &M);
for(int i = ; i <= N; i++){
scanf("%d", &num[i]);
last[i] = num[i];
}
int lim = pow(N, (double)/);
for(int i = ; i <= N; i++) h[i] = (i-)/lim+;
int cnt = , Tcnt = ;
char com[];
for(int i = ; i <= M; i++){
scanf("%s", com);
if(com[] == 'Q'){
cnt++;
scanf("%d %d", &Q[cnt].l, &Q[cnt].r);
Q[cnt].t = Tcnt;
Q[cnt].id = cnt;
}
else{
Tcnt++;
scanf("%d %d", &t[Tcnt].ip, &t[Tcnt].co);
t[Tcnt].lt = last[t[Tcnt].ip];
last[t[Tcnt].ip] = t[Tcnt].co;
//printf("%d %d\n", t[Tcnt].co, t[Tcnt].lt);
}
}
sort(Q+, Q++cnt, cmp); int L = , R = , T = , cur = ;
for(int i = ; i <= cnt; i++){
while(T < Q[i].t) cur+=update(++T, L, R, );
while(T > Q[i].t) cur+=update(T--, L, R, -);
while(L < Q[i].l) cur+=add(L++, -);
while(L > Q[i].l) cur+=add(--L, );
while(R < Q[i].r) cur+=add(++R, );
while(R > Q[i].r) cur+=add(R--, -);
ans[Q[i].id] = cur;
} for(int i = ; i <= cnt; i++){
printf("%d\n", ans[i]);
} return ; }
BZOJ 2120 数颜色 【带修改莫队】的更多相关文章
- bzoj 2120 数颜色 带修改莫队
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- Luogu P1903 BZOJ 2120 数颜色 带修改的莫队
https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...
- P1903 [国家集训队]数颜色 (带修改莫队)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- P1903 [国家集训队]数颜色 带修改莫队板子
大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...
- [国家集训队][bzoj2120] 数颜色 [带修改莫队]
题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...
随机推荐
- RPA流程自动化-UIPath简介
UiPath简介 转自: http://www.cnblogs.com/mxue/p/UiPath_To147_Road.html 最近RPA比较火,UiPath工具排名前几位并且免费试用,很多朋友们 ...
- Netezza External Tables --How to use local files in external table
FROM: http://tennysusantobi.blogspot.com/2012/08/netezza-external-tables.html Netezza External Table ...
- MVC中FileResult 返回类型返回Excel
公司中以前写的导出有问题.原来使用的XML格式字符串拼接然后转化成流输出 action public FileResult ExportJobFair() { try { string name = ...
- Java - 网络IO的阻塞
最近学习时碰到事件驱动和非阻塞的相关知识,随之想到了Java中的Reactor.io与nio的一些东西:在前辈的博客上翻了翻.复习复习,在此记录一番. 实在找不到比较大点的东西,于是随便弄了个压缩包, ...
- .NET的EF框架中:在应用程序配置文件中找不到名为“”的连接字符串问题
今天在使用EF Code First框架时,当把模型都定义好了,想通过程序包管理控制台利用enable-migrations –force来生成数据库表的时候报错了,如下: 找不到连接字符串,但是我仔 ...
- axios发送post请求后台接受不到问题
axios发送post请求后台接受不到问题 1.首先这是前端的问题 2.解决方案不唯一,但这招肯定行 <!DOCTYPE html> <html> <head> & ...
- css常用左右布局方案整理
实际项目开发过程中我们经常会遇到页面div左右布局的需求:左侧 div 固定宽度,右侧 div 自适应宽度,填充满剩余页面,下面整理几种常用的方案 1 左侧 div 设置 float 属性为 le ...
- 互联网轻量级框架SSM-查缺补漏第三天
简言:平安夜,继续慵懒的学习.我真的是不喜欢学习··· 第三章认识MyBatis核心组件 3.1 持久层的概念和MyBatis的特点 持久层:可以将业务数据存储带磁盘,具有长期存储的能力.一般执行持久 ...
- mysql中的find_in_set的使用
原文 http://www.php-note.com/article/detail/383 举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文... ...
- 1004. 填充矩形 (Standard IO)
题目描述 已知矩形的大小为n×m,现用a×a的正方形填充该矩形.输入三个正整数n,m,a(n,m,a≤10^9),计算至多能填入多少正方形?(正方形可以正好碰到矩形边界,但不能超出矩形外) 输入 一行 ...