「SDOI2009」HH的项链

「SDOI2009」HH的项链

传送门
数据加强了,莫队跑不过了。
考虑用树状数组。
先把询问按右端点递增排序。
然后对于每一种贝壳,我们都用它最右一次出现的位置计算答案。
具体细节看代码吧。
参考代码:

#include <algorithm>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while ('0' > c || c > '9') f |= c == '-', c = getchar();
    while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
    s = f ? -s : s;
}

const int _ = 1e6 + 5;

int n, q, a[_], res[_], tr[_], tag[_];

struct node { int l, r, id; } t[_];
inline bool cmp(const node& x, const node& y) { return x.r < y.r; }

inline int lb(int x) { return x & -x; }

inline void update(int x, int v)
{ for (rg int i = x; i <= n; i += lb(i)) tr[i] += v; }

inline int query(int x)
{ int res = 0; for (rg int i = x; i >= 1; i -= lb(i)) res += tr[i]; return res; }

int main() {
#ifndef ONLINE_JUDGE
    file("cpp");
#endif
    read(n);
    for (rg int i = 1; i <= n; ++i) read(a[i]);
    read(q);
    for (rg int i = 1; i <= q; ++i) read(t[i].l), read(t[i].r), t[i].id = i;
    sort(t + 1, t + q + 1, cmp);
    int pos = 1;
    for (rg int i = 1; i <= q; ++i) {
        for (rg int j = pos; j <= t[i].r; ++j) {
            if (tag[a[j]]) update(tag[a[j]], -1);
            update(j, 1), tag[a[j]] = j;
        }
        pos = t[i].r + 1;
        res[t[i].id] = query(t[i].r) - query(t[i].l - 1);
    }
    for (rg int i = 1; i <= q; ++i) printf("%d\n", res[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/zsbzsb/p/12231638.html

时间: 2024-11-10 14:49:51

「SDOI2009」HH的项链的相关文章

【BZOJ】【1878】【SDOI2009】HH的项链

树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边那个才对答案有贡献. 那么我们O(n)预处理一个next数组,满足a[i]=a[next[i]],且i~next[i]这一段中没有与a[i]相等的数....其实就是 i 右边第一个跟a[i]相等的值的下标啦.. 再回头看下我们的询问:对答案有贡献的数的特点是:它在整个序列中第一次出现,或者它是区间外

【SDOI2009】HH的项链 线段树

题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长.有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答……因为项链实在是太长了.于是,他只好求助睿智的你,来解决这个问题. 输入输出格式 输入格式: 第一行:一个整数N,表示项链的长度. 第二行:N 个整数,表示依次表示项链中贝壳的编号(编号为0 到1000000 之间

【SDOI2009】HH的项链

洛谷题目链接 题意: 给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数 染色问题神烦啊,最近刚会做,感觉都可以用统一的方法 首先要算出与一个元素相同的最邻近的上一个元素的位置,这样的话只要求出区间内上一位置小于下限的就是元素种类数 ——非常有道理的样子,但是第一次见肯定想不到 于是实现了          颜色种类问题->范围内数的个数          的问题转化 然后就简单了,交给权值主席树就好了 算是第二道主席树练习题吧 深井冰错误:构造权值线段树的时候忘记把0构

[SDOI2009][bzoj1878] HH的项链 [莫队模板题]

题面: 传送门 思路: 就是一道莫队的模板题目...... 开一个1000000的数组记录每个数出现的次数,然后每次从1到0或者从0到1更新答案 莫队讲解看这里:莫队 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 inline int

「树状数组」[SDOI2009]HH的项链

[SDOI2009]HH的项链 原题链接 [SDOI2009]HH的项链 题目大意 给你 \(n\) 个数,再给你 \(q\) 次询问,每次询问给你 \(l, r\) ,问你 \(l, r\) 中有多少个不同的数 题目题解 分析这道题我们发现,对于一个 \([L_1, R_1]\) 存在另一个 \([L_2, R_1]\) 且 \(L_2\) 严格大于 \(L_1\),那么就一定存在第一个区间不同的数 大于等于 第二个区间的不同的数,这里很显然有一种等于的情况,什么情况等于?在\([L_2,R_

P1972 [SDOI2009]HH的项链

P1972 [SDOI2009]HH的项链 2017-09-18 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长.有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答--因为项链实在是太长了.于是,他只好求助睿智的你,来解决这个问题. 输入输出格式 输入格式: 第一行:一个整数N,表示项链的长度. 第二行:N 个整

BZOJ 1878: [SDOI2009]HH的项链( BIT )

离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define

luogu P1972 [SDOI2009]HH的项链

二次联通门 : luogu P1972 [SDOI2009]HH的项链 /* luogu P1972 [SDOI2009]HH的项链 莫队水过 记录一个count数组 来记录每个数出现了几次 缩小区间时只要看是否只出现一次 扩张区间时只要看看是否出现过即可 */ #include <algorithm> #include <cstdio> #include <cmath> #define Max 1000001 void read (int &now) { no

[bzoj1878] [SDOI2009]HH的项链(树状数组+离线)

1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3210  Solved: 1619[Submit][Status][Discuss] Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变得越来越长.有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同 的