https://scut.online/contest/30/G

很久以前做的一个东西,当时是对R排序之后树状数组暴力统计当前区间的前缀和。每有一个元素出现在R的范围内,就解除他的同样元素的影响,在他上一个同样元素曾经+1的位置给他-1。因为已经对R进行排序了,下一个询问一定会更容易包含后面出现的那一个。

今天又演了居然想尺取,做不到做不到,L是会不断变化的,不满足尺取的条件。

然后重写的时候发现

last[a[R]]=R++;

last[a[R]]=R;
++R;

并不等价。

看来会改变的同一个变量最好只在一句话中出现一次。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; struct Query {
int l, r, id;
} q[1000005]; bool cmp1(const Query& q1, const Query& q2) {
return q1.r != q2.r ? q1.r < q2.r : q1.l < q2.l;
} int ans[1000005]; int n, m, a[1000005];
int last[1000005], cnt; int bit[1000005]; inline int Sum(int x) {
int res = 0;
for(; x; x -= x & -x)
res += bit[x];
return res;
} inline void Add(int x, int v) {
for(; x <= n; x += x & -x)
bit[x] += v;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
scanf("%d", &m);
for(int i = 1; i <= m; ++i) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q + 1, q + 1 + m, cmp1);
int R = 1;
for(int i = 1; i <= m; ++i) {
while(R <= q[i].r) {
if(last[a[R]])
Add(last[a[R]], -1);
Add(R, 1);
last[a[R]] = R;
++R;
}
ans[q[i].id] = Sum(q[i].r) - Sum(q[i].l - 1);
}
for(int i = 1; i <= m; ++i)
printf("%d\n", ans[i]);
return 0;
}

在不引起混淆的情况下,使用运算符重载会比使用外部cmp快10%。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; struct Query {
int l, r, id;
bool operator<(const Query& q2) {
return r < q2.r;
}
} q[1000005]; int ans[1000005]; int n, m, a[1000005];
int last[1000005], cnt; int bit[1000005]; inline int Sum(int x) {
int res = 0;
for(; x; x -= x & -x)
res += bit[x];
return res;
} inline void Add(int x, int v) {
for(; x <= n; x += x & -x)
bit[x] += v;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
scanf("%d", &m);
for(int i = 1; i <= m; ++i) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q + 1, q + 1 + m);
int R = 1;
for(int i = 1; i <= m; ++i) {
while(R <= q[i].r) {
if(last[a[R]])
Add(last[a[R]], -1);
Add(R, 1);
last[a[R]] = R;
++R;
}
ans[q[i].id] = Sum(q[i].r) - Sum(q[i].l - 1);
}
for(int i = 1; i <= m; ++i)
printf("%d\n", ans[i]);
return 0;
}

SCUT - G - 魔法项链 - 树状数组的更多相关文章

  1. BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理

    标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现 ...

  2. [BZOJ1878] [SDOI2009] HH的项链 (树状数组)

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

  3. LOJ.#6468. 魔法[差分+树状数组]

    题意 题目链接 分析 将询问差分并不断加入颜色. 每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号. 实现可以使用树状数组. 总时间复 ...

  4. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

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

  5. 【bzoj1878】[SDOI2009]HH的项链 树状数组

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

  6. [SDOI2009]HH的项链 树状数组 BZOJ 1878

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

  7. bzoj1878 [SDOI2009]HH的项链——树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...

  8. luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队

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

  9. 洛谷 P1972 [SDOI2009]HH的项链——树状数组

    先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...

随机推荐

  1. 9. ClustrixDB主从复制

    一.在线添加从库 主集群: 10.1.1.23:5306 从集群: 10.1.3.88:5306 主库开启binlog MySQL [(none)]> CREATE BINLOG 'clustr ...

  2. Linux入门培训教程 linux系统中文件I/O教程

    linux 文件I/O教程 一,文件描述符 对内核而言,所以打开的文件都通过文件描述符引用.每个进程都有一些与之关联的文件描述符.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向 ...

  3. 容器适配器————priority_queue

    #include <queue> priority_queue 容器适配器定义了一个元素有序排列的队列.默认队列头部的元素优先级最高.因为它是一个队列,所以只能访问第一个元素,这也意味着优 ...

  4. HDU 2612 Find a way(双向bfs)

    题目代号:HDU 2612 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 Find a way Time Limit: 3000/1000 M ...

  5. 模型层ORM操作

    一.ORM操作 1.关键性字段及参数 DateField 年月日 DateTimeField 年月日时分秒 auto_now: 每次操作改数据都会自动更新时间 auto_now_add: 新增数据的时 ...

  6. CDH搭建和集成spark、kafka操作

    系统:Centos7 CDH版本:5.14.0 请自己提前安装好:mysql.jdk 并下载好相关依赖(每一台机器) yum -y install chkconfig python bind-util ...

  7. 初识REST

    RESTful介绍: REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”. 1 ...

  8. 追加环境变量到Path

    @echo off setlocal enabledelayedexpansion ::使用方法: :: "C:\WINDOWS" :: "C:\jar" SE ...

  9. was安装相关步骤(Linux)

    本次试验目的主要对websphere 二次内部解剖对中间件性能优化垫铺. 1.准备相关文件 其中 iso文件为WAS主要镜像文件(WAS文件所在地) Instalmgr为IBM安装引导程序instal ...

  10. 【mysql】查询最新的10条记录

    实现查询最新10条数据方法: select * from 表名 order by id(主键) desc limit 10 参考文档: MySQL查询后10条数据并顺序输出