题目大意:给定一个区间,查询子区间里出现次数不小于二的数的个数

此题想了好久没想出来,后来是在网上学习的一个方法

首先按查询区间的右端点进行排序,按右端点从小到大处理

假设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]采花--离线树状数组+差分的更多相关文章

  1. 【BZOJ2743】[HEOI2012]采花 离线+树状数组

    [BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...

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

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

  3. [bzoj2743][HEOI2012]采花(树状数组)

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

  4. [bzoj2743][HEOI2012]采花_树状数组

    采花 bzoj-2743 HEOI-2012 题目大意:给定n朵花,每朵花有一个种类,m次询问:一段区间中至少出现两朵花的种类的个数. 注释:$1\le n,m\le10^6$. 想法:这个题超级像H ...

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

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

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

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

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

    听说这题的所发和HH的项链很像. 然而那道题我使用莫队写的... 这是一个套路,pre数组加升维(在线). 记录一个\(pre\)数组,\(pre[i]\)代表上一个和i颜色相同的下标. 我们把询问离 ...

  8. BZOJ 2743 采花(树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题意:给出一个数列,每个询问查询[L,R]中至少出现两次的数字有多少种? 思路:(1 ...

  9. BZOJ_2743_[HEOI2012]采花_离线+树状数组

    BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...

随机推荐

  1. 为什么我们可以使用while(~scanf("%d"))读到文件末尾

    经过测试文件末尾是一个标志位EOF 在c语言里我们用int来输出EOF 可以发现EOF等于-1 我们之前那个文章已经写过了..在c语言里负数的存储策略是补码 [-1]的补码=~(1)+1 那么就是比如 ...

  2. FileSeek文件内容搜索工具下载

    Windows 内建的搜索功能十分简单,往往不能满足用户的需要.很多的第三方搜索工具因此诞生,比如 Everything,Locate32等. 而FileSeek也是一款不错的搜索工具,其不同于其他搜 ...

  3. Java调优经验谈

    对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题到底出在哪里.此时就 ...

  4. hdu5092 dp(递推)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5092 题意:给一个m*n的矩阵,找到一个纵向的"线"使得线上的和最小并 ...

  5. css/js(工作中遇到的问题)-3

    设置宽高比 使用padding/margin-top/bottom; 设置出教准确的自适应布局; 用于预加载图片; 关于数据库设置 添加extra对象用于扩展; 添加type类型; 对于字体 使用百分 ...

  6. 01 HTML基础

    HTML就是超文本标记语言的简写,是最基础的网页语言. 通过标签定义的语言,代码都是由标签所组成的.(最重要的标签是定义标题.段落和换行的标签) 不区分大小写 head部分是给html页面增加一些辅助 ...

  7. 【bzoj2440】【bzoj3994】莫比乌斯反演学习

    哇..原来莫比乌斯代码这么短..顿时感觉逼格-- 写了这道题以后,才稍稍对莫比乌斯函数理解了一些 定理:和是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论 在上面的公式中有一个函数,它 ...

  8. BZOJ3257 : 树的难题

    设$f[x][i][j]$表示以$x$为根的子树,与$x$连通部分有$i$个黑点,$j$个白点,不联通部分都是均衡的最小代价.若$i>1$,则视作$1$:若$j>2$,则视作$2$. 然后 ...

  9. CSS3弹性盒模型flexbox布局基础版

    原文链接:http://caibaojian.com/using-flexbox.html 最近看了社区上的一些关于flexbox的很多文章,感觉都没有我这篇文章实在,最重要的兼容性问题好多人都没有提 ...

  10. BZOJ1036[ZJOI2008]树的统计Count 题解

    题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...