BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MB
Submit: 3478 Solved: 1342
[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
题目链接:BZOJ 2120
一直比较喜欢莫队的暴力式算法,但是会的都too simple,这题的莫队里加了一个修改的操作就比纯暴力有意思,但是这样加上去要如何修改呢?修改的顺序应该是怎么样的呢?
一种解法是将询问和修改操作分开存放,询问要增加一个记录当前询问时已出现修改次数的变量t,再继续按照原来莫队的排序顺序进行排序,修改则是用另外的结构体存放修改位置和修改之前这个位置的值(至于为什么要存之前的值后面会说),每一次先把区间移动好,再看操作次数T与当前询问的t之间的关系,若不同则要进行撤回或者更新,怎么撤回更新呢?这时候就要用到修改结构体中记录修改前的值的作用了,每一次撤回或者更新,都把当前的val与当前修改的位置的值作交换,那么假设是更新,把原来的值交换到了现在的val里,现在的arr[x]中是修改后的val,假设又要撤回了,那又一次地把val与arr[x]交换,这样确实做到了撤回,为什么可以这样呢?因为在更新的时候T的变化是连续的而不是跳跃着更新,不然这个修改结构体里的val多经过几次修改就会对不上号了。
其中需要注意一些细节,比如说询问的存放显然是可以从0~cnt_query,但是询问的t肯定是从1开始的,因此记录修改次数的cc要先自增1再把修改操作存入C[cc]……然后就是++ -- 对应的判断1或0别写反了就行……写完发现比原来参考的别人的题解速度快一倍,真是奇怪……,哦还有另外一种做法就是主席树+树状数组,然而并不会就只能默默地学习一个莫队了
送一组发现了某处低级错误错误的数据
2 4
1 2
Q 1 2
R 1 3
Q 1 2
Q 1 1
Ans
2
2
1
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=10010;
const int M=1000007;
struct info
{
int l,r,t;
int b,id;
bool operator<(const info &t)const
{
if(b==t.b)
return r<t.r;
return b<t.b;
}
};
struct modify
{
int pos;
int val;
}; modify C[N];
info Q[N];
int arr[N],ans[N],vis[M];
char ops[3]; int main(void)
{
int n,m,l,r,x,i,val;
while (~scanf("%d%d",&n,&m))
{
CLR(vis,0);
CLR(ans,0);
int unit=(int)sqrt(n); for (i=1; i<=n; ++i)
scanf("%d",&arr[i]); int cq=0,cc=0;
for (i=0; i<m; ++i)
{
scanf("%s",ops);
if(ops[0]=='Q')
{
scanf("%d%d",&l,&r);
Q[cq].l=l;
Q[cq].r=r;
Q[cq].b=Q[cq].l/unit;
Q[cq].id=cq;
Q[cq].t=cc;
++cq;
}
else
{
++cc;
scanf("%d%d",&x,&val);
C[cc].pos=x;
C[cc].val=val;
}
}
sort(Q,Q+cq);
int L=1,R=0,T=0;
int temp=0; for (i=0; i<cq; ++i)
{
while (L<Q[i].l)
{
if(--vis[arr[L]]==0)
--temp;
++L;
}
while (L>Q[i].l)
{
--L;
if(++vis[arr[L]]==1)
++temp;
}
while (R<Q[i].r)
{
++R;
if(++vis[arr[R]]==1)
++temp;
}
while (R>Q[i].r)
{
if(--vis[arr[R]]==0)
--temp;
--R;
}
while (T<Q[i].t)///大于区间
{
++T;
if(L<=C[T].pos&&C[T].pos<=R)
{
if(--vis[arr[C[T].pos]]==0)
--temp;
}
swap(C[T].val,arr[C[T].pos]);
if(L<=C[T].pos&&C[T].pos<=R)
{
if(++vis[arr[C[T].pos]]==1)
++temp;
}
}
while (T>Q[i].t)///缩小区间
{
if(L<=C[T].pos&&C[T].pos<=R)
{
if(--vis[arr[C[T].pos]]==0)
--temp;
}
swap(C[T].val,arr[C[T].pos]);
if(L<=C[T].pos&&C[T].pos<=R)
{
if(++vis[arr[C[T].pos]]==1)
++temp;
}
--T;
}
ans[Q[i].id]=temp;
}
for (i=0; i<cq; ++i)
printf("%d\n",ans[i]);
}
return 0;
}
BZOJ 2120 数颜色(带修改的莫队)的更多相关文章
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- Luogu P1903 BZOJ 2120 数颜色 带修改的莫队
https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- 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 单点修改 思路 ...
- P1903 [国家集训队]数颜色 (带修改莫队)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
随机推荐
- ios获取一个文件夹下的文件(夹)列表
NSArray* ary=[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] pathFo ...
- [Android Pro] Android签名与认证详细分析之二(CERT.RSA剖析)
转载自: http://www.thinksaas.cn/group/topic/335449/ http://blog.csdn.net/u010571535/article/details/899 ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.r ...
- 归并排序的分析与Java实现
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并排序 ...
- C#(去、过滤)掉字符中的换行符
本文介绍的方法需要先导入命名空间:usingSystem.Text.RegularExpressions; 字符串里所有的的换行符都去掉:textStr = Regex.Replace(textStr ...
- 【spring bean】bean的配置和创建方式
---恢复内容开始--- 项目结构如下: lib如下: 1.首先建立SayHell.java接口 package com.it.sxd; public interface SayHell { publ ...
- <select>在chrome浏览器下背景透明问题
在上篇文章<只用CSS美化选择框>运用了背景透明的技巧来美化选择框,但在chrome浏览器下遇到了跟ie.ff不一样的透明效果,下面重现一下: 在一个大的div(背景红色)内放置一个sel ...
- VMware Tools安装
不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少 ...
- D6 I
I - I Time Limit:1000MS Memory Limit:2048KB 64bit IO Format:%lld & %llu Submit Status Pr ...
- Zookeeper实战之单机模式
Zookeeper介绍 Zookeeper 分布式服务框架是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等.本文主要从使用者角度来介 ...