题目

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

输入格式

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

输出格式

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

输入样例

5 3 5

1 2 2 3 1

1 5

1 2

2 2

2 3

3 5

输出样例

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的花各一朵,公主不采。

提示

【数据范围】

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

题解

考虑离线,按左端点排序
每种颜色只产生一个贡献而且必须有两个
那么我们在每种颜色第二次出现的地方+1
然后从左开始扫,每到一个颜色就对该颜色next的位置-1,next的next位置+1,顺便算出以当前位置为左端点的答案

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 1000005,maxm = 100005,INF = 1000000000;
inline int RD(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}return out * flag;
}
int Last[maxn],nxt[maxn],s[maxn],c[maxn],ans[maxn],N,C,M;
void add(int u,int v){if (u) while (u <= N) s[u] += v,u += lbt(u);}
int query(int u){int ans = 0; while (u) ans += s[u],u -= lbt(u); return ans;}
int sum(int l,int r){return query(r) - query(l - 1);}
struct Que{int l,r,id;}Q[maxn];
inline bool operator <(const Que& a,const Que& b){return a.l < b.l;}
int main(){N = RD(); C = RD(); M = RD();REP(i,N){c[i] = RD();if (Last[c[i]]) nxt[Last[c[i]]] = i;Last[c[i]] = i;}memset(Last,0,sizeof(Last));REP(i,N) if (nxt[i] && !Last[c[i]]) Last[c[i]] = i,add(nxt[i],1);REP(i,M) Q[i].l = RD(),Q[i].r = RD(),Q[i].id = i;sort(Q + 1,Q + 1 + M); int j = 0;REP(i,N){while (Q[j + 1].l == i) ans[Q[++j].id] = query(Q[j].r);if (nxt[i]) add(nxt[i],-1);if (nxt[nxt[i]]) add(nxt[nxt[i]],1);}REP(i,M) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8282719.html

BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】相关推荐

  1. [HEOI2012]采花 (离线树状数组)

    原题链接 思路: 本质是求区间数量大于1的数的个数,考虑一个 next 数组记录相同数最近的下一个位置(经典套路)查询区间离线后 l 从小到大排序,要删掉 l 上的数 如果下一个数存在就要减去下一个数 ...

  2. BZOJ-2743 [HEOI2012]采花 【树状数组+离线处理】

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

  3. P4113 [HEOI2012]采花 【树状数组 AC】【莫队/主席树 TLE】

    传送门 题意简述:给定一个长度为 n 的序列,有 m 次询问,每次询问一段区间,求区间中有多少个数出现次数超过 1 次 这道题真的有点恶心...在洛谷上属于莫队,但是莫队会T,数据居然有2e6.莫队的 ...

  4. NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)

    P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...

  5. [HEOI2012]采花(思维 + 离线 + 树状数组)

    题目链接 分析 我只能说太妙了- 离线 + 树状数组 参考题解: 这个题要和<HH的项链>做对比: 关键就是为什么要离线处理,以及 怎么对区间进行排序和维护: [SDOI2009]HH的项 ...

  6. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  7. HDU3333 Turing Tree 离线树状数组

    题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...

  8. 牛客小白9 换个角度思考(离线+树状数组)

    title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...

  9. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  10. 【BZOJ3653】谈笑风生 离线+树状数组+DFS序

    [BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道高明到哪里去了&quo ...

最新文章

  1. HTML 5 input type 属性
  2. LeetCode刷题之旅
  3. 万能点位图软件_【像素图】复古提花毛衣+秋风落叶十字绣图,非常适合这个季节...
  4. abp框架java,【Net】ABP框架学习之正面硬钢
  5. 机器学习速成课程 | 练习 | Google Development——编程练习:验证
  6. 受众定向_我如何了解社区与受众之间的差异
  7. Maven : maven工程libraries没有maven dependencies
  8. 基于OpenCV实现图像平移
  9. 树莓派命令行连接蓝牙音箱及不出声问题
  10. 我每天都是和有钱人打交道
  11. C#图片处理之:色彩调整
  12. SQL:PostgreSQL设置自增序列
  13. eclipse java常用插件_Java 开发的 10 大必备 Eclipse 插件
  14. Linux操作系统启动流程、daemon与服务(service)、systemctl管理服务
  15. nodejs 连接数据库 并在数据库上进行增删改查操作
  16. PG-FP6烧录机1拖16上位机项目
  17. 《社交网络》中Facemash算法分析
  18. vb html ie弹出窗口,vb操作ie浏览器
  19. 和平精英亚服服务器信号差,和平精英延迟高怎么办 网络卡顿解决方法
  20. 3.空间域图像处理入门

热门文章

  1. 【CyberSecurityLearning 附】OpenVAS安装
  2. 在pycharm安装MySQLdb库和pymysql库的区别
  3. RedHat YUM configure
  4. 为自增(++)自减(--)运算符正名
  5. 【C/C++多线程编程之四】终止pthread线程
  6. 全连接where 取最新日期_SQL学习笔记(4)——集合、连接与窗口函数
  7. JZOJ 3401 JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法
  8. JZOJ 5354. 【NOIP2017提高A组模拟9.9】导弹拦截
  9. mysql数据首次导入hive_sqoop1.4.7环境搭建及mysql数据导入导出到hive
  10. postgresql 备份_在Kubernetes上使用PostgreSQL的正确姿势:第三部分