bzoj2743: [HEOI2012]采花--离线树状数组+差分
题目大意:给定一个区间,查询子区间里出现次数不小于二的数的个数
此题想了好久没想出来,后来是在网上学习的一个方法
首先按查询区间的右端点进行排序,按右端点从小到大处理
假设pre[a[i]]是与a[i]相同的前一个数的位置,记为left[i]
当查询到第i个数时,对left[left[i]]+1~left[i]的每个数的权值w[]加1
也就是说:左端点在left[left[i]]+1~left[i]内,右端点为i的区间里,出现次数不小于二的数+1
那么对于查询i,答案就是w[left[i]]
因为对于查询L~R,区间里的每个数都小于等于r,因此L~R里的每个数若出现了两次都可能会被w[left[i]]+1
所以这个算法是可行的,而且很奇妙。。
那么对于成段的区间修改,我们可以考虑用线段树lazy标记,但是很麻烦
所以可以用树状数组维护差分序列,更简洁。
差分序列是什么呢?
对于数列 a1, a2, a3 ... an
构造新数列 b1, b2, b3 .. bn
其中b1 = a1
b2 = a2 - a1
b3 = a3 - a2
....
bn = bn - bn-1
新数列就是差分序列
那么要得到ai,就只要算b1~bi的和就行了
用差分序列的好处就是,对于成段的区间修改i~j(权值+1),出了第i和第j个数,中间的相邻的数的差是不变的
那么只要b(i) + 1, b(j+1) -1 就可以了
这样修改的时间复杂度由O(n)降为O(1)
而查询的时间复杂度由O(1) 升为log(n),用树状数组维护的话
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 1000100
using namespace std;
struct node{
int l,r,id;
}q[maxn];
int n,m,c,p[maxn],left[maxn],pre[maxn],a[maxn],res[maxn];
bool cmp(node a, node b){
return a.r<b.r;
}
void add(int x, int c){
while (x<=n){
p[x]+=c;
x+=x&-x;
}
}
int get_sum(int x){
;
while (x){
tot+=p[x];
x-=x&-x;
}
return tot;
}
void change(int x){
left[x]=pre[a[x]];
pre[a[x]]=x;
if (left[x]){
add(left[left[x]]+,);
add(left[x]+,-);
}
}
int main(){
scanf("%d%d%d", &n, &c, &m);
memset(p,,sizeof(p));
memset(left,,sizeof(left));
; i<=n; i++){
scanf("%d", &a[i]);
}
; i<=m; i++){
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id=i;
}
sort(q+,q++m,cmp);
;
; i<=n; i++){
change(i);
for (;q[head].r==i;head++)
res[q[head].id]=get_sum(q[head].l);
}
; i<=m; i++) printf("%d\n", res[i]);
;
}
bzoj2743: [HEOI2012]采花--离线树状数组+差分的更多相关文章
- 【BZOJ2743】[HEOI2012]采花 离线+树状数组
[BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- [bzoj2743][HEOI2012]采花(树状数组)
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- [bzoj2743][HEOI2012]采花_树状数组
采花 bzoj-2743 HEOI-2012 题目大意:给定n朵花,每朵花有一个种类,m次询问:一段区间中至少出现两朵花的种类的个数. 注释:$1\le n,m\le10^6$. 想法:这个题超级像H ...
- bzoj 2743: [HEOI2012]采花【树状数组】
离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...
- 【BZOJ】2743: [HEOI2012]采花(树状数组)
题目 传送门:QWQ 分析 已经凉凉.看错数据范围敲了发莫队........ 和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加. 区间加就树状数组特技 代码 #include & ...
- [HEOI2012]采花(树状数组+离线)
听说这题的所发和HH的项链很像. 然而那道题我使用莫队写的... 这是一个套路,pre数组加升维(在线). 记录一个\(pre\)数组,\(pre[i]\)代表上一个和i颜色相同的下标. 我们把询问离 ...
- BZOJ 2743 采花(树状数组)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题意:给出一个数列,每个询问查询[L,R]中至少出现两次的数字有多少种? 思路:(1 ...
- BZOJ_2743_[HEOI2012]采花_离线+树状数组
BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...
随机推荐
- 用DOM4J解析XML文件案例
用DOM4J解析XML文件案例,由于DOM4J不像JAXP属于JAVASE里,所以如果要使用DOM4J,则必须额外引入jar包,如图:
- 【转】Kylin的cube模型
转自:http://www.cnblogs.com/en-heng/p/5239311.html 1. 数据仓库的相关概念 OLAP 大部分数据库系统的主要任务是执行联机事务处理和查询处理,这种处理被 ...
- BurpSuite的使用总结
BurpSuite BurpSuite 是一款使用Java编写的,用于Web安全审计与扫描套件.它集成了诸多实用的小工具以完成http请求的转发/修改/扫描等,同时这些小工具之间还可以 互相协作,在B ...
- loadrunner写入数据到文件
首先在F盘创建: F:\\LR\\test.txt文件 #define USERCOUNT 100 //定义参数数量 Action() { char *namecommon=" ...
- Android 使用 LruCache 缓存图片
在你应用程序的 UI 界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来.在很多情况下,(比如使用 ListView, GridView 或者 ViewP ...
- Visual Studio工具栏中无法选择调试设备
Visual Studio工具栏中无法选择调试设备 在Visual Studio工具栏中,默认显示已经识别的设备.用户可以从中选择对应的设备,进行调试和部署App.但是由于误操作,可能导致该选项丢失. ...
- spring 架构学习
学习目的用于抽象业务逻辑,因spring本身就是抽象业务逻辑的框架,如做业务架构网面的工作 spring为不二之选. 一些好的网址 http://www.ibm.com/developerworks/ ...
- iOS 查找文件、遍历文件系统
NSFileManager *manager = [NSFileManager defaultManager]; NSString *home = [@"~" stringByEx ...
- Date 对象转换——toString、toTimeString、toDateString、toUTCString、toLocaleString()、toLocaleTimeString()、toLocaleDateString()
JavaScript toString() 方法 JavaScript Date 对象参考手册 定义和用法:toString() 方法可把 Date 对象转换为字符串,并返回结果. 语法:dateOb ...
- 使用 Git 和 Visual Studio Online 进行版本控制
参考资料: 在开发计算机上设置 Git(配置.创建.克隆.添加) 关于 Git 和 Visual Studio Online 是什么请自行百度 转载请注明来源: http://www.cnblogs. ...