HYSBZ - 2120 数颜色 (带修改莫队)

2人阅读 评论(0) 收藏 举报
分类:

2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 7874  Solved: 3209
[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

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。


2016.3.2新加数据两组by Nano_Ape

Source

[Submit][Status][Discuss]



解题思路:带修改莫队。

完美版本:700ms

只对左区间和时间排序:1000ms

只对右区间和时间排序:1000ms

只对区间排序:1200ms

先对右区间排序再对左区间排序:2000ms(有人能解释这个么……)

去掉排序版本:2000ms


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200005;

struct Query
{
	int l;
	int r;
	int id;
	int cti;
} q[MAXN];
int qn;

struct Change
{
	int x;
	int val;
} cha[MAXN];
int cn;

int block[MAXN], blocksize;
bool cmp(Query a, Query b)
{
	if (block[a.l] != block[b.l])
		return a.l < b.l;
	if (block[a.r] != block[b.r])
		return a.r < b.r;
	return a.cti < b.cti;
}

int a[MAXN];
int N, M;
int ans[MAXN];
int res = 0;
int vis[1000005];
void add(int num)
{
	if (vis[a[num]] == 0)
		res++;
	vis[a[num]]++;
}
void remove(int num)
{
	if (vis[a[num]] == 1)
		res--;
	vis[a[num]]--;
}
void change(int ti, int l, int r)
{
	if (cha[ti].x >= l && cha[ti].x <= r)
		remove(cha[ti].x);
	swap(cha[ti].val, a[cha[ti].x]);
	if (cha[ti].x >= l && cha[ti].x <= r)
		add(cha[ti].x);
}

void solve()
{
	int r = 0;
	int l = 0;
	int now = 0;
	for (int i = 0; i < qn; i++)
	{
		while (q[i].r > r)
			r++, add(r);
		while (q[i].r < r)
			remove(r), r--;
		while (q[i].l > l)
			remove(l), l++;
		while (q[i].l < l)
			l--, add(l);

		while (now > q[i].cti)
			change(now, l, r), now--;
		while (now < q[i].cti)
			now++, change(now, l, r);

		ans[q[i].id] = res;
	}
}

int main()
{

	scanf("%d%d", &N, &M);
	blocksize = sqrt(N);
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &a[i]);
		block[i] = (i - 1) / blocksize + 1;
	}

	char op[5];
	int x, y;

	for (int i = 0; i < M; i++)
	{
		scanf("%s%d%d", op, &x, &y);
		if (op[0] == 'Q')
		{
			q[qn].l = x;
			q[qn].r = y;
			q[qn].cti = cn;
			q[qn].id = qn;
			qn++;
		}
		else
		{
			cn++;
			cha[cn].x = x;
			cha[cn].val = y;
		}
	}

	sort(q, q + qn, cmp);

	solve();
	for (int i = 0; i < qn; i++)
		printf("%d\n", ans[i]);

	return 0;
}




查看评论

【BZOJ2120】数颜色,带修莫队

翘文科课到机房来_(:зゝ∠)_
  • xym_CSDN
  • xym_CSDN
  • 2016-09-08 09:28:44
  • 819

bzoj 2120: 数颜色(带修改的莫队算法)

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 2908  Solved: 1130 [Submit][Status][Dis...
  • clover_hxy
  • clover_hxy
  • 2016-05-09 21:47:57
  • 2544

bzoj2120(带修改莫队 或 树状数组套主席树)

带修改莫队模板 第一关键字:左端点的块 第二:右端点块 第三:前面的修改次数,这里称time #include #include #include #include #include using na...
  • running_in_dark
  • running_in_dark
  • 2017-02-07 10:25:29
  • 673

bzoj2120 数颜色 分块

据说暴力可过2200ms。。。然而我写分块也才1200ms。。然而很多人写分块跑不过暴力。。。        参考了将狼踩尽(http://www.cnblogs.com/jianglangcaiji...
  • lych_cys
  • lych_cys
  • 2016-02-05 22:38:43
  • 903

[BZOJ2120]数颜色(带修改莫队)

题目描述传送门题解和BZOJ2453相同,在这里可以看到分块的做法 而这道题同时又是一道带修莫队裸题 带修莫队大体方法如下: 1、将修改询问离线并分开,记录每一个修改之前最近的一次询问的编号 ...
  • Clove_unique
  • Clove_unique
  • 2017-03-06 22:40:12
  • 437

【模板】带修改莫队 (模板题:洛谷P1903数颜色)

带修改莫队讲解 ~阅前提示: 拥有普通莫队的基础知识;理解莫队的思想; ~简介: 莫队支持的是离线操作,普通莫队只支持查询操作; 而带修改莫队还支持单点修改操作。 ~原理: 普通莫队每一个...
  • zj_yuneng
  • zj_yuneng
  • 2017-05-25 18:38:25
  • 375

bzoj 2120: 数颜色 带修改莫队算法

题意:有n个位置(n
  • qq_33229466
  • qq_33229466
  • 2016-08-18 15:49:38
  • 540

【bzoj2120】分块/带修改莫队板子

昨晚梦到和wtt在学校里抓可爱的小鱼?然后被于校长宣布留级?最后我一通电话+巧舌如簧(划)就让他撤回了决定.......
  • Blue_CuSO4
  • Blue_CuSO4
  • 2017-09-12 14:19:55
  • 224

HYSBZ - 2120:数颜色 (带修改操作的莫队算法)

HYSBZ - 2120:数颜色 (带修改操作的莫队算法) 神奇的修改
  • f2935552941
  • f2935552941
  • 2017-10-03 23:26:03
  • 143

【带修改莫队】BZOJ2120 数颜色

题面在这里带修莫队第一题……十分简单,没有什么可讲的 不会的可以看这里但是查了一个下午……心态奔溃了 原因竟然是pow(n,2/3)的2/3是整数除,外加一些奇怪的东西附上代码:#include ...
  • linkfqy
  • linkfqy
  • 2017-04-27 16:24:53
  • 964
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 2728
    排名: 1万+
    Visitors
    Flag Counter
    文章分类
    最新评论