BZOJ 2743 HEOI 2012 采花 梳妆数组

题目大意:给出一个序列,问一段序列中,出现两次以上的颜色有多少种。

思路:和HH的项链很像。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 1000010
using namespace std;

struct Ask{
	int x,y,_id;

	bool operator <(const Ask &a)const {
		return x < a.x;
	}
	void Read(int p) {
		scanf("%d%d",&x,&y);
		_id = p;
	}
}ask[MAX];

int cnt,cols,asks;
int fenwick[MAX];
int src[MAX];
int last[MAX],next[MAX];
int T[MAX];

int ans[MAX];

inline void Fix(int x,int c)
{
	if(!x)	return ;
	for(; x <= cnt; x += x&-x)
		fenwick[x] += c;
}

inline int GetSum(int x)
{
	int re = 0;
	for(; x; x -= x&-x)
		re += fenwick[x];
	return re;
}

int main()
{
	cin >> cnt >> cols >> asks;
	for(int i = 1; i <= cnt; ++i)
		scanf("%d",&src[i]);
	for(int i = 1; i <= cnt; ++i) {
		if(++T[src[i]] == 2)
			Fix(i,1);
		if(last[src[i]])
			next[last[src[i]]] = i;
		last[src[i]] = i;
	}
	for(int i = 1;i <= asks; ++i)
		ask[i].Read(i);
	sort(ask + 1,ask + asks + 1);
	ask[0].x = 1;
	for(int i = 1; i <= asks; ++i) {
		for(int j = ask[i - 1].x; j < ask[i].x; ++j) {
			Fix(next[j],-1);
			Fix(next[next[j]],1);
		}
		ans[ask[i]._id] = GetSum(ask[i].y);
	}
	for(int i = 1; i <= asks; ++i)
		printf("%d\n",ans[i]);
	return 0;
}
时间: 2024-10-09 18:51:59

BZOJ 2743 HEOI 2012 采花 梳妆数组的相关文章

[HEOI 2012] 采花

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2743 [算法] 首先预处理nxt[]数组 , 其中 , nxt[i]表示下一个和i号位颜色相同的位置 , 然后离线 , 将询问按左端点排序 , 每次将nxt[i]减一 , nxt[nxt[i]]加一 用树状数组维护即可 , 详见代码 时间复杂度 : O(MlogN) [代码] #include<bits/stdc++.h> using namespace std; const i

洛谷 P2056 BZOJ 2743 [HEOI2012]采花

//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以便于公主采花. 公主每次采花后会统计采到的花的颜色数, 颜色数越多她会越高兴! 同时, 她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花. 由于时

采花 bzoj 2743

采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花. 公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花. 由于时间关系,公

BZOJ 2743: [HEOI2012]采花( 离线 + BIT )

处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 -------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; #define lowbit(x) ((x) & -(x)) const int maxn = 1000009; int N; struct BIT { int b[maxn]; B

[bzoj2743][HEOI2012]采花(树状数组+离线)

2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 1832  Solved: 954[Submit][Status][Discuss] Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴

BZOJ_2743_[HEOI2012]采花_离线+树状数组

Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次 采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某 一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必 能再次采到此颜色的花.由于时间关系,公主只能走过花园连续的一段进

[HEOI2012]采花 树状数组

题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花. 由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆

数据结构(树状数组):HEOI2012 采花

[题目描述] 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花.由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆

[BZOJ2743] [HEOI2012] 采花 (树状数组)

Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花.由于时间关系,公主只能走过花园连续的一段进行采花