树状数组:

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int id[maxn],tree[maxn],vis[maxn],num[maxn];
int n,m;
struct Tree{
int l,r;
int pos;
};
Tree a[maxn];
int buf[];
inline void read(int &x){
char ch=getchar(); x=;
while(ch<'') ch=getchar();
while(ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
}
inline void write(int x){
if(!x){putchar('');putchar(' ');return;}
register int cnt=;
while(x)buf[++cnt]=(x%)+,x/=;
while(cnt)putchar(buf[cnt--]);
putchar('\n');
}
bool cmp(Tree x,Tree y){
return x.r < y.r;
}
int lowbit(int x){
return x & -x;
}
void add(int x,int now){
while(x <= n){
tree[x] += now;
x += lowbit(x);
}
}
int sum(int n){
int ans = ;
while(n != ){
ans += tree[n];
n -= lowbit(n);
}
return ans;
}
int main(){
read(n);
for(int i = ;i <= n;i++)
read(id[i]);
read(m);
for(int i = ;i <= m;i++){
read(a[i].l);
read(a[i].r);
a[i].pos = i;
}
sort(a+,a++m,cmp);
int next = ;
for(int i = ;i <= m;i++){
for(int j = next;j <= a[i].r;j++){
if(vis[id[j]])
add(vis[id[j]],-);
add(j,);
vis[id[j]] = j;
}
next = a[i].r+;
num[a[i].pos] = sum(a[i].r)-sum(a[i].l-);
}
for(int i = ;i <= m;i++)
write(num[i]);
return ;
}

线段树:

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 5e6+;
struct segment_tree{
int l,r,s,sum;
};
segment_tree ask[maxn<<],tree[maxn<<];
int next[maxn],pre[maxn],a[maxn],x[maxn],n,m;
int buf[];
inline void read(int &x){
char ch=getchar(); x=;
while(ch<'') ch=getchar();
while(ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
}
inline void write(int x){
if(!x){putchar('');putchar(' ');return;}
register int cnt=;
while(x)buf[++cnt]=(x%)+,x/=;
while(cnt)putchar(buf[cnt--]);
putchar('\n');
}
bool cmp1(segment_tree x,segment_tree y){
if (x.l == y.l)return x.r < y.r;
else return x.l < y.l;
}
bool cmp2(segment_tree x,segment_tree y){
return x.s < y.s;
}
inline void pushup(int root){
tree[root].sum = tree[root<<].sum+tree[root<<|].sum;
}
inline void build(int root,int l,int r){
tree[root].l = l;
tree[root].r = r;
if(l == r){
tree[root].sum = a[l];
return;
}
int mid = (l+r)>>;
build(root<<,l,mid);
build(root<<|,mid+,r);
pushup(root);
}
inline void update(int root,int k){
if (tree[root].l == k && tree[root].r == k){
a[k] = ;
tree[root].sum = a[k];
return;
}
int mid = (tree[root].l+tree[root].r)>>;
if(k <= mid)update(root<<,k);
else update(root<<|,k);
pushup(root);
}
inline int query(int root,int l,int r){
if(tree[root].l == l && tree[root].r == r)
return tree[root].sum;
int mid = (tree[root].l+tree[root].r)>>;
if(r <= mid)return query(root<<,l,r);
else
if(l > mid)return query(root<<|,l,r);
else return(query(root<<,l,mid)+query(root<<|,mid+,r));
}
int main(){
read(n);
for(register int i = ;i <= n;i++){
read(x[i]);
next[pre[x[i]]] = i;
if(!pre[x[i]])a[i] = ;
pre[x[i]] = i;
}
build(,,n);
scanf("%d",&m);
for(register int i = ;i <= m;i++){
read(ask[i].l);
read(ask[i].r);
ask[i].s = i;
}
sort(ask+,ask+m+,cmp1);
ask[].l = ;
for(register int i = ;i <= m;i++){
if(ask[i-].l != ask[i].l)
for(register int j = ask[i-].l;j <= ask[i].l-;j++)
if(next[j])update(,next[j]);
ask[i].sum = query(,ask[i].l,ask[i].r);
}
sort(ask+,ask+m+,cmp2);
for(register int i=;i<=m;i++)
write(ask[i].sum);
return ;
}

别问我为什么补贴出来分块做法...

因为没学懂!!!没打出来!!!好不容易打出来,给我超时!!!气死了!!!

[SDOI2009]HH的项链-树状数组/线段树的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

  7. BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...

  8. BZOJ 3333 排队计划 树状数组+线段树

    题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...

  9. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

随机推荐

  1. MapReduce实例——求平均值,所得结果无法写出到文件的错误原因及解决方案

    1.错误原因 mapreduce按行读取文本,map需要在原有基础上增加一个控制语句,使得读到空行时不执行write操作,否则reduce不接受,也无法输出到新路径. 2.解决方案 原错误代码 pub ...

  2. 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解

    方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二   1. 方法一: 思路: 1. 新创建一个链表节点头,假设这里就叫 head3: 2. 因为另外两个链表都为单调递增,所 ...

  3. Net包管理NuGet(2)nuget包的生成方法

    1,下载NuGetPackageExplorer,可以下载运行源码,也可以直接下载安装包安装安装之后打开 设置好内容之后点击绿色的打钩保存然后操作右边空白处 然后点击File>Save;保存之后 ...

  4. Nginx配置http跳转https访问

    Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 server{ listen ; s ...

  5. Netty 客户端断线重连

    client 关闭后会执行 finally 代码块,可以在这里可以进行重连操作 public class NettyClient implements Runnable { private final ...

  6. [ffmpeg] AVOption

    在ffmpeg中,常使用AVOption的API来进行参数设置.AVOption的API主要分为设置参数以及提取参数两种,无论是哪一种API都主要分为两大步骤: 寻找出参数所在的内存位置. 如果是设置 ...

  7. Linux 下安装idea,提示svn版本太低问题

    在 RedHat 6.5 虚拟机上装了 Idea 2017, 将项目代码从 Windows 共享到虚拟机中,然后 Idea 提示 svn 版本太旧, 上网查资料说 Idea 2018 不支持1.7以下 ...

  8. HDU 1757 A Simple Math Problem (矩阵快速幂)

    题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...

  9. js的数组的一些操作

    1 arr.reduce let xxx = arr.reduce( function (pv, cv, ci ,arr) { return }[, init_val] ) 对arr的每个元素,执行匿 ...

  10. Gitlab安装简明文档

    1.关于Gitlab CE / GitLab EE版本的区别:Gitlab CE(Community Edition):Gitlab社区版,可以免费试用,无官方支持.GitLab EE(Enterpr ...