SCUT - G - 魔法项链 - 树状数组
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 - 魔法项链 - 树状数组的更多相关文章
- BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理
标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现 ...
- [BZOJ1878] [SDOI2009] HH的项链 (树状数组)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- LOJ.#6468. 魔法[差分+树状数组]
题意 题目链接 分析 将询问差分并不断加入颜色. 每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号. 实现可以使用树状数组. 总时间复 ...
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- 【bzoj1878】[SDOI2009]HH的项链 树状数组
题目描述 HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变得越来越长.有一 ...
- [SDOI2009]HH的项链 树状数组 BZOJ 1878
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- bzoj1878 [SDOI2009]HH的项链——树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...
- luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
随机推荐
- option跳转页面并选中当前值
思路:使用cookie传值赋值 具体实现部分代码: <select onchange="test(this)" class="form-control" ...
- 【java工具类】生成Zip压缩包
多文件生成压缩包,返回压缩包生成位置的路径. FileUtil.java /** * 文件打压缩包 * @param files * @param Name * @return * @throws E ...
- 2019hdu多校 AND Minimum Spanning Tree
题目链接:Click here 题目大意:两个点之间的边权为编号按位与的值,求最小生成树,方案要字典序最小 Solution: 一道不难的构造题,每个点连向他取反后的lowbit值,这样边权为0,若l ...
- 关于win7系统下gitbook的安装与gitbook editor的配合使用
1.安装nodejs 2.node -v,可查看node版本: npm -v,可查看npm版本 3.npm install gitbook-cli -g,安装gitbook 此过程经常报错,如果报错, ...
- Xshell Linux常用命令
Xshell :一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议. 0 帮助 命令 与清屏 help 查看帮助命令 ls ...
- Spring Cloud Stream教程(五)编程模型
本节介绍Spring Cloud Stream的编程模型.Spring Cloud Stream提供了许多预定义的注释,用于声明绑定的输入和输出通道,以及如何收听频道. 声明和绑定频道 触发绑定@En ...
- ACCESS数据库注入
0X01 我们想来了解一下access数据库 Access注入是暴力猜解 Access数据结构(access只有一个数据库) Access数据库 表名 列名 数据 没有库这个概念 只有表这个概念 这应 ...
- 8.并发编程--多线程通信-wait-notify-模拟Queue
并发编程--多线程通信-wait-notify-模拟Queue 1. BlockingQueue 顾名思义,首先是一个队列,其次支持阻塞的机制:阻塞放入和获取队列中的数据. 如何实现这样一个队列: 要 ...
- deepfm代码参考
https://github.com/lambdaji/tf_repos/blob/master/deep_ctr/Model_pipeline/DeepFM.py https://www.cnblo ...
- Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView、TTreeViewItem
Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView.TTreeViewItem TScrollBox -> TCustomTreeView -> ...