//表示真的更喜欢洛谷的题面

题目描述

萧芸斓是 Z国的公主,平时的一大爱好是采花。

今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以便于公主采花。

公主每次采花后会统计采到的花的颜色数, 颜色数越多她会越高兴! 同时, 她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。 由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了 m 个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答案! ) ,最后会选择令公主最高兴的行程(为了拿到更多奖金! ) 。

输入输出格式

输入格式:

第一行四个空格隔开的整数 n、c 以及 m。

接下来一行 n 个空格隔开的整数,每个数在[1, c]间,第i 个数表示第 i 朵花的颜色。

接下来 m 行每行两个空格隔开的整数 l 和 r(l ≤ r) ,表示女仆安排的行程为公主经过第 l 到第r 朵花进行采花。

输出格式:

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

输入输出样例

输入样例#1:

5 3 5
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5
输出样例#1:

2
0
0
1
0

说明//洛谷的原数据范围

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

HINT//BZOJ的加强版数据范围

【数据范围】

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

解题思路

  思路和上一题HH的项链差不多,只需改很少的几个地方就可以AC了。这题的区别是区间中要有至少两朵花才能被统计,所以标记打在next[i]而不是i

  滑动窗口移动时,窗口左边被标记过的花(标记在next[i]处)释放标记是要先把next[i]的标记释放(减1)(hh的项链那题不用释放,因为我们对询问区间排过序,这次第i朵花能被采需要在next[i]处有标记,当i不在滑动窗口内,标记的next[i]却在其中时,不释放标记就会出事),然后给next[next[i]]加上一个标记(加1)。

  这个滑动窗口我在HH的项链里解释过,个人感觉挺形象的。

  HH的项链那题用莫队的除外。这题n在BZOJ上是1E6,莫队用不了啦。

#include<cstdio>
#include<algorithm>
#define lowbit(x) (x)&(-x) int n,m,mx;
int a[]={},next[]={};
int p[]={};//每种颜色出现的位置 int c[]={};
int query(int pos)
{
int ans=;
while(pos)
{
ans+=c[pos];
pos-=lowbit(pos);
}
return ans;
}
void add(int pos,int x)
{
while(pos<=n)
{
c[pos]+=x;
pos+=lowbit(pos);
}
} struct Ask{
int l,r,id,ans;
}ask[];
bool cmp1(const Ask & a,const Ask & b)
{
return a.l==b.l?a.r<b.r:a.l<b.l;
}
bool cmp2(const Ask & a,const Ask & b)
{
return a.id<b.id;
} int main()
{
scanf("%d%d%d",&n,&mx,&m);
for(int i=;i<=n;i++) scanf("%d",a+i);
for(int i=n;i>;i--)
{
next[i]=p[a[i]];
p[a[i]]=i;
}
for(int i=;i<=mx;i++) if(next[p[i]])add(next[p[i]],); for(int i=,l,r;i<=m;i++)
{
scanf("%d%d",&l,&r);
ask[i]={l,r,i,};
} std::stable_sort(ask+,ask++m,cmp1);//这个纯归并与sort相比常数大但是稳,听说apio2017有大佬被这给卡了
for(int i=,ll=;i<=m;i++)
{
while(ll<ask[i].l)
{
if(next[ll]) add(next[ll],-);
if(next[next[ll]]) add(next[next[ll]],);
ll++;
}
ask[i].ans=query(ask[i].r)-query(ask[i].l-);
} std::stable_sort(ask+,ask++m,cmp2);
for(int i=;i<=m;i++)
printf("%d\n",ask[i].ans); return ;
}

洛谷 P2056 BZOJ 2743 [HEOI2012]采花的更多相关文章

  1. BZOJ 2743: [HEOI2012]采花

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

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

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

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

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

  4. BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]

    题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...

  5. ●BZOJ 2743 [HEOI2012]采花

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题解: 树状数组,离线 求区间里面有多少种出现次数大于等于 2 的颜色. 类似某一个题 ...

  6. bzoj 2743: [HEOI2012]采花【树状数组】

    离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...

  7. 2743: [HEOI2012]采花

    Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...

  8. 【BZOJ】2743: [HEOI2012]采花(树状数组)

    题目 传送门:QWQ 分析 已经凉凉.看错数据范围敲了发莫队........ 和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加. 区间加就树状数组特技 代码 #include & ...

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

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

随机推荐

  1. luogu3119 草鉴定

    题目大意 给出一个有向图,问将图中的哪一个边翻转,会使节点1所在的强连通分量内的节点数最多.输出这个节点数. 题解 让我们看看暴力怎么做,即枚举每一条边,将其翻转,然后求节点1所在强连通分量节点数,然 ...

  2. luogu1063 能量项链

    题目大意 有一串项链,项链上的每个珠子有首尾两个数字,首尾相连的两个珠子的尾数字和头数字相同.每次选择相连的一对珠子,得到第一个项链的首数字*第一个项链的尾数字(第二个项链的首数字)*第二个项链的尾数 ...

  3. 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录

    我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录 准备安装包: gcc48 glibc--SP4-DVD-x86_64-GM-DVD1.iso tensorflow_ ...

  4. yrzl-cloud

  5. Coursera Algorithms week1 查并集 练习测验:3 Successor with delete

    题目原文: Given a set of n integers S = {0,1,…,N-1}and a sequence of requests of the following form: Rem ...

  6. Webpack 2.0 的文档

    Webpack 2.0 的文档 https://webpack.js.org/get-started/

  7. [Apple开发者帐户帮助]六、配置应用服务(1.1)Apple Pay:配置Apple Pay(iOS,watchOS)

    Apple Pay允许用户在您的应用中购买商品和服务.要将Apple Pay 权利添加到您的App ID,请先创建商家标识符,然后启用Apple Pay并创建付款处理证书. 或者,您可以使用Xcode ...

  8. python 4:str.lstrip()、str.rstrip()、str.strip()(分别去除首空格,尾空格,首尾空格;不改变原有变量,除非赋给)

    name = " Hello,World! Hello,Python! " print(name + "检测行末空格的") print(name.lstrip( ...

  9. Java NIO Buffer说明

    Buffer 有3个重要的参数:位置(position).容量(capactiy).上限(limit) 位置(position): 写:当前缓冲区的位置,将从position的下一个位置写数据. 读: ...

  10. C# 不卡屏延时方法,延迟系统时间,但系统又能同时能执行其它任务

    //延迟系统时间,但系统又能同时能执行其它任务,不卡屏延时方法 public static void Delay(int milliSecond) { int start = Environment. ...