此题莫队可过

然而太难了......

我在胡雨菲那看的解法,然后自己打了一波,调了一个错,上交,自信AC。

做法:离线,对于L排序。

每种颜色可能出现很多次,那么我们如何不算重复呢?

只需把[L,n]区间内第一个出现的该颜色标为1即可。

所以我们记录下每个下标i所对应的颜色下一次出现的位置next[i]即可。

每次L挪动时,挪动的每个位置都-1(一定是1不是0),然后把next[i]+1即可。

所求即为∑[1,R]。

 #include <cstdio>
#include <algorithm>
#define lowbit(a) (a&(-a))
#define say(a) printf(#a);
#define ln printf("\n");
using namespace std;
const int N = ; struct Question
{
int L,R,ans,num;
}quest[];
int next[N],lastfind[N],x[N],tree[N],a[N];
int n;
bool cmp1(Question x,Question y) {return x.L<y.L;}
bool cmp2(Question x,Question y) {return x.num<y.num;}
void add(int x,int v)
{
if(x==) return;
for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;
return;
}
int getsum(int x)
{
if(x==) return ;
int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=tree[i];
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),x[i]=a[i];
int m;
scanf("%d",&m);
for(int i=;i<=m;i++) scanf("%d%d",&quest[i].L,&quest[i].R),quest[i].num=i;
sort(x+,x+n+);
int k=;
for(int i=;i<=n;i++) if(x[i]!=x[i-]) x[++k]=x[i]; /// 离散化
for(int i=;i<=n;i++)
{
int p=lower_bound(x+,x+k+,a[i])-x;///预处理出next[i]
if(lastfind[p]) next[lastfind[p]]=i;
else add(i,);///p -> i 这里调一个错,之前写的p
lastfind[p]=i;
}
int j=,ans=;
//for(int i=1;i<=6;i++) printf("%d ",getsum(i)-getsum(i-1));ln;
sort(quest+,quest+m+,cmp1);
for(int i=;i<=m;i++)
{
while(j<quest[i].L)
{ add(j,-);
add(next[j],);
j++;
}
//for(int i=1;i<=6;i++) printf("%d ",getsum(i)-getsum(i-1));ln
quest[i].ans=getsum(quest[i].R);
}
sort(quest+,quest+m+,cmp2);
for(int i=;i<=m;i++) printf("%d\n",quest[i].ans);
return ;
}

AC代码如下:

用了一些特殊的调试手法。。。

P1972 HHのnecklace 离线+树状数组的更多相关文章

  1. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  2. 洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)

    传送门 •题意 给你一个包含 n 个数的数组 $a$: 有 m 此操作,每次操作求区间 [l,r] 中不同数的个数: •题解(离线+树状数组) 以样例 $[1,2,3,4,3,5]$ 为例,求解区间 ...

  3. BZOJ 1878 HH的项链 (树状数组+离线)

    题目大意:给你一个序列,求某区间出现不同的数的个数. 貌似离线树状数组是最好的解法 先把所有询问挂在它们询问的右端点上 然后从头到尾遍历这个序列,记录这个位置的值上一次出现的位置 那么,当遍历到第i位 ...

  4. POJ 3416 Crossing --离线+树状数组

    题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...

  5. HDU 2852 KiKi's K-Number(离线+树状数组)

    题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...

  6. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

    题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...

  7. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

  8. HDU3333 Turing Tree 离线树状数组

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

  9. 离线树状数组 hihocoder 1391 Countries

    官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...

随机推荐

  1. java随笔2 变量类定义

    如果要定义变量为对象,就要创建此对象对应的java类, 且定义的类型为类名,且都为private

  2. 转《JavaScript中的图片处理与合成》

    引言: 本系列现在构思成以下4个部分: 基础类型图片处理技术之缩放.裁剪与旋转(传送门): 基础类型图片处理技术之图片合成(传送门): 基础类型图片处理技术之文字合成(传送门): 算法类型图片处理技术 ...

  3. freemarker 简单操作

    操作字符串函数 1. substring(start,end)从一个字符串中截取子串 start:截取子串开始的索引,start必须大于等于0,小于等于end end: 截取子串的长度,end必须大于 ...

  4. valgrind 检查内存泄露

    https://www.oschina.net/translate/valgrind-memcheck

  5. python数据结构与算法第五天【顺序表】

    1.列表存储的两种方式 (1)元素内置方式 采用元素内置的方式只能存放同类型元素的数据类型,例如列表中的元素都为整形,元素类型相同,每个元素存放的地址空间大小也相同,则列表中每个元素都是顺序存放的 ( ...

  6. Mayor's posters(线段树+离散化)

    这道题最关键的点就在离散化吧. 假如有三张海报[1, 10] [10, 13][15,  20] 仅仅三个区间就得占用到20了. 但是离散化后就可以是[1, 2] [2, 3] [4, 5] n到1e ...

  7. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  8. linq之左连接 + group by

    var list = from item in (from s in _sysBll.GetList(s => s.ParamID == "TraSchType" & ...

  9. HTML元素类别及转换

    位置特性分类元素分为三类:块级元素,行内元素,行级块元素 1.块级元素(block)        特点: (1)可以设置宽高.内.外边距:               (2)独占一行(即前后均有换行 ...

  10. hadoop安装要领

    1.安装JDK tar -zxvf jdk-7u75-linux-i586.tar.gz -C /root/training/ vi ~/.bash_profile JAVA_HOME=/root/t ...