Description

萧芸斓是Z国的公主,平时的一大爱好是采花。
今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了m个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。

Input

 第一行四个空格隔开的整数n、c以及m。接下来一行n个空格隔开的整数,每个数在[1, c]间,第i个数表示第i朵花的颜色。接下来m行每行两个空格隔开的整数l和r(l ≤ r),表示女仆安排的行程为公主经过第l到第r朵花进行采花。

Output

  共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。

Sample Input

  5 3 5
  1 2 2 3 1
  1 5
  1 2
   2 2
  2 3
  3 5

Sample Output

  2
  0
  0
  1
  0
【样例说明】
  询问[1, 5]:公主采颜色为1和2的花,由于颜色3的花只有一朵,公主不采;询问[1, 2]:颜色1和颜色2的花均只有一朵,公主不采;  
  
询问[2, 2]:颜色2的花只有一朵,公主不采;
  询问[2, 3]:由于颜色2的花有两朵,公主采颜色2的花;
  询问[3, 5]:颜色1、2、3的花各一朵,公主不采。

HINT

【数据范围】

  对于100%的数据,1 ≤ n ≤    10^6,c ≤ n,m ≤10^6。

思路

  话说HE是哪里。。

  一开始打算用莫队做的,结果nsqrt(n)果断TTTTTTTTTT

  然后知道这种题在线是不可做的。。果断离线处理。

  将所有的询问[st,ed]按照st为第一关键字,ed为第二关键字排序。

  然后预处理记录下每个位置的花的下一个相同颜色的花的位置在哪里,i号位上的花的下一个记为next[i]

  首先对于所有的颜色的花next[next[pos[i]]++;(POS[i]是第一个第i种颜色的花的位置)

  然后由于询问的st被排过序,是递增的,那么我们维护一个变量L,每次处理新的询问的时候往右扫,对于那些原本在询问范围内但更新了询问范围后不在的花相应更新树状数组。

  

 #include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
const double eps=1e-;
///==============struct declaration==============
struct Querys{
int st,ed,No;
bool operator <(const Querys &rhs) const{
return st==rhs.st?ed<rhs.ed:st<rhs.st;
}
};
///==============var declaration=================
const int MAXN=;
int n,c,m;
int color[MAXN],pos[MAXN],next[MAXN];
int A[MAXN],ans[MAXN];
Querys Query[MAXN];
///==============function declaration============
void Add_Bit(int x,int v);
int Query_Bit(int x);
int lowbit(int x){return x&-x;}
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
scanf("%d%d%d",&n,&c,&m);
for(int i=;i<=n;i++) scanf("%d",color+i);
for(int i=n;i>=;i--){
next[i]=pos[color[i]];
pos[color[i]]=i;
}
for(int i=;i<=c;i++)
if (next[pos[i]])
Add_Bit(next[pos[i]],);
for(int i=;i<=m;i++){
scanf("%d%d",&Query[i].st,&Query[i].ed);
Query[i].No=i;
}
sort(Query+,Query++m);
int L=;
for(int i=;i<=m;i++){
while (L<Query[i].st){
if (next[next[L]])
Add_Bit(next[next[L]],);
if (next[L])
Add_Bit(next[L],-);
L++;
}
ans[Query[i].No]=Query_Bit(Query[i].ed)-Query_Bit(Query[i].st-);
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}
///================fuction code====================
void Add_Bit(int x,int v){
while (x<=n){
A[x]+=v;
x+=lowbit(x);
}
}
int Query_Bit(int x){
int res=;
while (x>){
res+=A[x];
x-=lowbit(x);
}
return res;
}

BZOJ1878

【HEOI2012】采花 BZOJ2743的更多相关文章

  1. [HEOI2012]采花 BZOJ2743

    分析: 听说主席树和莫队可以做,前者不想写,后者我不会... 我们考虑将询问离线,按照左端点排序,之后先处理好从1开始选的答案,之后枚举从1到n,之后依次删除nxt[i],添加nxt[nxt[i]], ...

  2. 【BZOJ2743】[HEOI2012]采花 离线+树状数组

    [BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...

  3. [bzoj2743][HEOI2012]采花_树状数组

    采花 bzoj-2743 HEOI-2012 题目大意:给定n朵花,每朵花有一个种类,m次询问:一段区间中至少出现两朵花的种类的个数. 注释:$1\le n,m\le10^6$. 想法:这个题超级像H ...

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

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 1832  Solved: 954[Submit][Status] ...

  5. BZOJ 2743: [HEOI2012]采花

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 2056  Solved: 1059[Submit][Status ...

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

    处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...

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

    BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...

  8. BZOJ 2743: [HEOI2012]采花 离线树状数组

    2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...

  9. cogs:1619. [HEOI2012]采花/luogu P2056

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿是 ...

  10. 1619. [HEOI2012]采花

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比 时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿 ...

随机推荐

  1. VS2015 使用及插件推荐

      环境搭建与插件推荐 Cpp in Win10 x64 vs2015 + Resharper/Visual Assist X vs2015Pro: Download or see BaiDu 中文专 ...

  2. JavaScript模板引擎artTemplate.js——template.helper()方法

    上一篇文章我们已经讲到了helper()方法,但是上面的例子只是一个参数的写法,如果是多个参数,写法就另有区别了. <div id="user_info"></d ...

  3. SpringMVC注解汇总(一)-定义

    本文根据开涛哥学习SpringMVC汇总而成,方便更好查阅! 网址:http://jinnianshilongnian.iteye.com/blog/1752171 注解式控制器简介 @Control ...

  4. C# mysql 获取所有表名

    public static List<string> GetAllTableName()        {            List<string> retNameLis ...

  5. delphi 取硬盘号

    function GetVolumeID: string; var vVolumeNameBuffer: ..] of Char; vVolumeSerialNumber: DWORD; vMaxim ...

  6. Sql 2008 的常用函数

    1.LEN 函数:返回数据的长度 ') 返回:8 2.ASCII函数:返回字符串最左边的ascii值 SELECT ASCII('abc') 返回:97 3.LEFT函数:从左边开始截取指定长度的字符 ...

  7. Git bash下中文乱码问题

    Git bash下中文乱码--解决方案 解决办法1: 在git bash下,右键 出现下图,选择options: 选择"Text" 将Character set设置为 UTF-8 ...

  8. python 杂七杂八 :

    subprocess.Popen(...) python3 实现代码: 备注write 要使用bytes 在最后结果转为str 显示时才不会出现 b'' 这样的字节显示 import subproce ...

  9. 爬虫框架--webmagic

    官方有详细的使用文档:http://webmagic.io/docs/zh/ 简介:这只是个java爬虫框架,具体使用需要个人去定制,没有图片验证,不能获取js渲染的网页,但简单易用,可以通过xpat ...

  10. iOS - URL Scheme 操作

    推荐JLRoutes路由跳转 NSScanner 在寻找更加灵活的页面跳转和通知,我遇见了JLRoutes,从而学习使用URL Scheme来定义界面入口.以前从来没有使用过,不过很多大厂和流行的框架 ...