HYSBZ 4551 (树状数组) 采花
题目:这里
题意:
Input
Output
输出一个正整数,表示结果
Sample Input
1 2
1 3
2 4
2 5
Q 2
C 2
Q 2
Q 5
Q 3
Sample Output
2
2
1
HINT
明显与两个相同的数在数组中的位置有关系。
求出颜色数组的前缀(前面一个该颜色值的位置)或者后缀(后一个该颜色的位置,以后缀为例),这里可以用树状数组解决,将给没个询问区间按照左范围从小到大
排序,然后遍历一边大区间1到n,当 i 小于询问范围左端点的的时候将其加入树状数组,等于询问范围左端点的时候既求区间范围和,注意的是,由于只有同种
颜色的花的数目大于1才算,所以事先将符合条件的花先加进数组,然后遍历的时候考虑失去 i 这个位置的时候是加一还是减一
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int M = 1e6 + ;
int has[M],has1[M],vis[M],b[M],ans[M],n;
int q[M]; struct node{
int x,y,id;
}a[M]; int lowbit(int x){return x&(-x);} void add(int x,int y)
{
while (x<=M){
has[x]+=y;
x+=lowbit(x);
}
} int getsum(int x)
{
int ans=;
while (x>){
ans+=has[x];
x-=lowbit(x);
}
return ans;
} bool cmp(node a,node b)
{
if (a.x==b.x) return a.y<b.y;
return a.x<b.x;
} int main()
{
int c,m;
bool flag=false;
scanf("%d%d%d",&n,&c,&m);
memset(vis,,sizeof(vis));
memset(has1,,sizeof(has1));
for (int i= ; i<=n ; i++){
scanf("%d",&b[i]);
/*if (has1[b[i]]==0) vis[i]=i,has1[b[i]]=i;
else{
vis[i]=has1[b[i]];
has1[b[i]]=i;
}*/
}
for(int i=n ;i>= ; i--){ //求后缀
vis[i]=has1[b[i]];
has1[b[i]]=i;
}
for (int i= ; i<=m ; i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
}
for(int i= ; i<=c ; i++){ //满足的先加上
if (vis[has1[i]])
add(vis[has1[i]],);
//cout<<has1[i]<<endl;
}
sort(a+,a+m+,cmp);
int j=;
// memset(q,0,sizeof(q));
for(int i= ; i<=m ; i++){
while (j<a[i].x){
if (vis[vis[j]])add(vis[vis[j]],);
if (vis[j]) add(vis[j],-);
j++;
}
ans[a[i].id]=getsum(a[i].y)-getsum(a[i].x-);
}
for (int i= ; i<=m ; i++){
printf("%d\n",ans[i]);
}
//cout<<getsum(1)<<endl;
return ;
}
HYSBZ 4551 (树状数组) 采花的更多相关文章
- HYSBZ 2743 (树状数组) 采花
题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...
- BZOJ_2743_[HEOI2012]采花_离线+树状数组
BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- 【BZOJ2743】[HEOI2012]采花 离线+树状数组
[BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...
- 【bzoj2743】[HEOI2012]采花 树状数组
题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公 ...
- [HEOI2012]采花 树状数组 BZOJ 2743
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- [bzoj2743][HEOI2012]采花(树状数组)
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- bzoj 2743: [HEOI2012]采花【树状数组】
离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...
- bzoj2743: [HEOI2012]采花--离线树状数组+差分
题目大意:给定一个区间,查询子区间里出现次数不小于二的数的个数 此题想了好久没想出来,后来是在网上学习的一个方法 首先按查询区间的右端点进行排序,按右端点从小到大处理 假设pre[a[i]]是与a[i ...
随机推荐
- Windows Azure初体验
目前在IT界,云这个概念的第一意思不再是词典里的解释了.不过它们还是有相同点的——也许确实会酝酿出一块大蛋糕,可也是飘在天上,众神分食之,与我等P民无关.所谓云,不过是网络时代发展到一定阶段的必然产物 ...
- 逻辑运算符&&和&的区别 ||和|的区别
A:最终结果一样. B:&& 和 || 有短路作用,左边是false ,右边不执行.
- 转换,2D,3D
一,转换定义: 1,能够改变元素的形状,尺寸,位置 2,转换分两种: 2D转换:只能在X,Y轴发生改变: 例子:旋转(rotate).拉伸(scale).平移(move).倾斜(skew) 3D转换: ...
- vagrant初始登录失败的一般性解决方案
如果是下载的box文件,vagrant box add和init之后启动,可能出现长时间无法通过vagrant ssh登陆的问题 ==> localvm2: Importing base box ...
- MATLAB 文件对话框之图片格式转换
localpathname为当前路径,需要保存图片的位置,根据自己的实际路径设置,usedpathname用来保存打开的文件位置,方便下次打开文件对话框以上次的路径为默认路径. global used ...
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- Matlab Map
http://blog.csdn.net/yuzhiyuxia/article/details/7305225 >> weekmap = containers.Map({'Monday', ...
- PostgreSQL系列一:PostgreSQL简介与安装
一.PostgreSQL简介 1.1 PostgreSQL概述 PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON和JSONB类型. ...
- RabbitMQ的work queue(2)
课堂上work queue没能很好的理解,看了大神的博客,顿觉醍醐灌顶,豁然开朗. work queue有两种模式: 平均分配:(默认)//channel.basicQos(1);即把 同一时刻服务器 ...
- Java画图程序设计
本文讲述一个画图板应用程序的设计,屏幕抓图如下: 『IShape』 这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”.名字开头的I表示它是一个接 ...