[bzoj2743][HEOI2012]采花(树状数组)
题目描述
萧薰儿是古国的公主,平时的一大爱好是采花。
今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。
花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。
由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了m个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。
输入输出格式
输入格式:
第一行四个空格隔开的整数n、c以及m。接下来一行n个空格隔开的整数,每个数在[1, c]间,第i个数表示第i朵花的颜色。接下来m行每行两个空格隔开的整数l和r(l ≤ r),表示女仆安排的行程为公主经过第l到第r朵花进行采花。
输出格式:
共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。
输入输出样例
说明
对于100%的数据,1 ≤ n ≤ 2*10^62∗106 ,c ≤ n,m ≤ 2*10^62∗106 。
本题有两个subtask
subtask1保证 n,m,c \leq 3*10^5n,m,c≤3∗105 ,占100分
subtask2保证 n,m,c \leq 2*10^6n,m,c≤2∗106 ,占100分
题解
标签莫队卡莫队……
那只好和HH的项链一样用树状数组啦……
不过我们不考虑维护某一个数出现的最后的位置,而是考虑维护某一个数出现的第二个位置中最前的一个
总而言之,就是枚举$l$,然后考虑从它开始到结尾的区间中每一个数字出现的第二个位置在哪儿
然后在树状数组中对所有的这些位置$+1$然后区间查询即可
然后我们可以记录每一个数字出现的下一个位置Next
如果一个数在$l$的左边了,那么它的Next就不是第二个出现的了,变成第一个出现的,那么就要把它的Next上的1减掉,然后把它的Next的Next位置上的数+1
可能有点抽象,感性理解一下
- //minamoto
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
- char buf[<<],*p1=buf,*p2=buf;
- inline int read(){
- #define num ch-'0'
- char ch;bool flag=;int res;
- while(!isdigit(ch=getc()))
- (ch=='-')&&(flag=true);
- for(res=num;isdigit(ch=getc());res=res*+num);
- (flag)&&(res=-res);
- #undef num
- return res;
- }
- char sr[<<],z[];int C=-,Z;
- inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
- inline void print(int x){
- if(C><<)Ot();if(x<)sr[++C]=,x=-x;
- while(z[++Z]=x%+,x/=);
- while(sr[++C]=z[Z],--Z);sr[++C]='\n';
- }
- const int N=2e6+;
- struct node{
- int l,r,id;
- inline bool operator <(const node &b)const{return l<b.l;}
- }q[N];
- int a[N],ans[N],c[N],cnt[N],Next[N],last[N],b[N],n,k,m;
- inline void add(int x,int y){
- for(;x<=n;x+=x&-x) c[x]+=y;
- }
- inline int query(int x){
- int res=;
- for(;x;x-=x&-x) res+=c[x];
- return res;
- }
- int main(){
- n=read(),k=read(),m=read();
- for(int i=;i<=n;++i) a[i]=read();
- for(int i=n;i;--i) Next[i]=last[a[i]],last[a[i]]=i;
- for(int i=;i<=n;++i)
- if(++b[a[i]]==) add(i,);
- for(int i=;i<=m;++i)
- q[i].l=read(),q[i].r=read(),q[i].id=i;
- sort(q+,q++m);
- int now=;
- for(int i=;i<=m;++i){
- while(now<q[i].l){
- if(Next[now]) add(Next[now],-);
- if(Next[Next[now]]) add(Next[Next[now]],);
- ++now;
- }
- ans[q[i].id]=query(q[i].r)-query(q[i].l-);
- }
- for(int i=;i<=m;++i) print(ans[i]);
- Ot();
- return ;
- }
[bzoj2743][HEOI2012]采花(树状数组)的更多相关文章
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
- [BZOJ2743] [HEOI2012] 采花 (树状数组)
Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...
- bzoj2743 [HEOI2012]采花——树状数组+离线
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2743 和 HH的项链 那道题很像,也是类似的做法: 但不同的是这里的点只有有前驱时才起作用: ...
- 【bzoj2743】[HEOI2012]采花 树状数组
题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公 ...
- [HEOI2012]采花 树状数组 BZOJ 2743
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]
题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...
- BZOJ2743 HEOI2012采花(离线+树状数组)
如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...
- BZOJ-2743: [HEOI2012]采花 前缀和 树状数组
BZOJ-2743 LUOGU:https://www.luogu.org/problemnew/show/P4113 题意: 给一个n长度的序列,m次询问区间,问区间中出现两次及以上的数字的个数.n ...
- bzoj2743: [HEOI2012]采花--离线树状数组+差分
题目大意:给定一个区间,查询子区间里出现次数不小于二的数的个数 此题想了好久没想出来,后来是在网上学习的一个方法 首先按查询区间的右端点进行排序,按右端点从小到大处理 假设pre[a[i]]是与a[i ...
随机推荐
- zedgraph控件的一些比较有用的属性
(1)zedgraph控件属性具体解释: AxisChange()() ->> This performs an axis change command on the graphPane. ...
- DAY11-MYSQL索引原理与慢查询优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- CentOS6.5 增加交换空间
在CentOS 6.5安装Oracle 11g的时候,提示交换空间不足,百度来下,找到来增加交换空间的方法,特此记录一下 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap ...
- eclipse 报错:GC overhead limit exceeded
还是eclipse内存问题 修改eclipse.ini -Xms512m -Xmx1024m 必要的情况下, 添加 -XX:MaxPermSize=1024M 表示在编译文件时一直占有最大内存
- 支撑矢量机SVM
1.线性SVM 首先,回顾一下SVM问题的定义,如下: 线性约束很烦,不方便优化,是否有一种方法可以将线性约束放到优化问题本身,这样就可以无拘无束的优化,而不用考虑线性约束了.其对应的拉格朗日对偶形式 ...
- ActionbarActivity和普通的Activity的区别
ActionbarActivity用于支持API11以下的程序支持ActionBar的功能,但是需要加入支持库 不这样做的话只有API11以上的才能支持ActionBar
- [patl2-011]玩转二叉树
解题关键:数据结构课本上的裸题. #include<cstdio> #include<cstdlib> #include<cstring> #include< ...
- 【总结整理】地理信息系统GIS的基础坐标知识
关于辰青2018.03.31 1.地理坐标系和投影坐标系的区别 答案: 1.地理坐标系统是一种球面坐标,而投影坐标系统是平面坐标 2.投影坐标系统在二维平面上有恒定的长度.角度和面积 3.投影坐标系统 ...
- Ros学习——launch文件解析
launch文件的重点是:节点(node)元素的集合. roslaunch 则是让所有的节点共享同一个终端. 1.标签(元素)说明 1. group标签 2. node标签 <group ns= ...
- SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询
1 业务需求 有的系统业务逻辑比较复杂,存在着多表关联查询的的情况,查询的内容不仅仅是单张表的的内容而是多张表的字段组合而成的,直接使用SplringDataJPA实现是比较复杂的,但是如果使用Que ...