SDOI2009HH的项链

2023-11-02 04:33
文章标签 项链 sdoi2009hh

本文主要是介绍SDOI2009HH的项链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步
完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此,
他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同
的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只好求助睿智的你,来解

决这个问题。

在线貌似不可做?

可以用离线算法,先预处理出与当前位置颜色相同的下一个颜色在哪,然后对每一个询问按左端点排序,对于每一个询问,将其查询区间左边的所有“下一个颜色“位置的值加1,

答案即为(右端点)前缀和减去(左端点减一)前缀和之差。

答案正确性证明:

因为要相减,所以1-(左端点-1)不用考虑,因为相减抵消了,而在当前区间内,没出现过的不用讨论,而出现过的因为只计算其区间左端点之前的“下一个颜色位置”,所以不会计算多次,如下:

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=50000+10;
int a[maxn];
int next[1000010]={0};
int p[1000010]={0};
int s[maxn];
int n,m;
struct T{
    int l,r,id;
    bool operator<(const T&c)const{
        if(l==c.l)
            return r<c.r;
        return l<c.l;
    }
}A[200010];
int ans[200010];
inline void add(int x,int p){
    while(x<=n){
        s[x]+=p;
        x+=x&(-x);
    }
}
inline int sum(int x){
    int tmp=0;
    while(x){
        tmp+=s[x];
        x-=x&(-x);
    }
    return tmp;
}
int main(){
    freopen("diff.in","r",stdin);
    freopen("diff.out","w",stdout);
    int mx=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),mx=max(mx,a[i]);
    for(int i=n;i>=1;i--)
        next[i]=p[a[i]],p[a[i]]=i;
    for(int i=0;i<=mx;i++)
        if(p[i])
            add(p[i],1);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
        scanf("%d %d",&A[i].l,&A[i].r),A[i].id=i;
    sort(A+1,A+m+1);
    int l=1;
    for(int i=1;i<=m;i++){
        while(l<A[i].l){
            if(next[l])
                add(next[l],1);
            l++;
        }
        ans[A[i].id]=sum(A[i].r)-sum(A[i].l-1);
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",ans[i]);
return 0;
}

这篇关于SDOI2009HH的项链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328147

相关文章

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

【COGS】421 [SDOI2009] HH的项链 树状数组

传送门:【COGS】421 [SDOI2009] HH的项链 题目分析:将区间以右端点为关键字降序排序,然后从左到右依次遍历每个数并插入到树状数组中,如果遍历到一个数的时候在他的前面已经有一个相同的数时,将之前位置上的数从树状数组中删除。然后我们每处理完一个位置上的数后,看这个位置上是否有右端点,如果有则做一次求和,这个右端点属于的区间【L,R】的值即sum(R)-sum(L-1)。

NYOJ 280 LK的项链 POJ 2409 Let it Bead(polya 定理)

NYOJ 280 LK的项链  :click here POJ 2409 Let it Bead:click here 题意:一盒有红、蓝、绿三种颜色的珠子,每种颜色珠子的个数都大于24,现在LK想用这一盒珠子穿出一条项链,项链上的珠子个数为n(0<=n&lt;=24),请你帮她计算一下一共可以用这一盒珠子可以穿出多少条不同的项链。通过旋转、翻转达到同一种状态的被认为是相同的项链。

【一百一十】【算法分析与设计】[SDOI2009] HH的项链,树状数组应用,查询区间的种类数,树状数组查询区间种类数

P1972 [SDOI2009] HH的项链 [SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。

搜狐[编程题]彩色宝石项链.有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等

时间限制:1秒 空间限制:32768K 有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项

HSACM 1680 能量项链

 1680: 能量项链 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 39   Solved: 13   Scores: 90.11 [ Submit][ Status][ BBS] Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有 N颗能量珠。能量珠是一颗有头标记与尾标

蓝桥杯 能量项链(区间dp)

能量项链 区间dp模板题 #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int main(){int head[220],tail[220],dp[220][220];int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&head[

P1972 [SDOI2009]HH的项链(树状数组离线,主席树)

题意: 多次询问 [ l , r ] [l,r] [l,r]中有多少不同的数。 思路: 本题卡了莫队。 树状数组离线:每个点代表这个位置的值,然后每次遇到这个数,就把上次的位置清空。这样当前维护的区间里面就没有重复数了。 可持久化线段树:其实和树状数组离线一样,就是基于上一个前缀的线段树,将当前位置的值设置为 a [ i ] a[i] a[i],同时将 a [ i ] a[i] a[i]上一

蓝桥杯---试题 算法提高 分割项链(尺取法)

试题 算法提高 分割项链 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   两个强盗刚刚抢到一条十分珍贵的珍珠项链,正在考虑如何分赃。由于他们不想破坏项链的美观,所以只想把项链分成两条连续的珍珠链。然而亲兄弟明算账,他们不希望因为分赃不均导致不必要的麻烦,所以他们希望两条珍珠链的重量尽量接近。于是他们找到了你,希望让你帮忙分赃。   我们认为珍珠项链是由n颗不同的珍珠组成的,

3790: 神奇项链

容易发现,处理回文串的时候得到的答案是可以去更新答案的, 即 令 f[i] f [ i ] f[i] 表示处理前 i i i 个最小由几个回文串构成, 那么,对于第iii个位置,他由 [i−p[i],n] [ i − p [ i ] , n ] [i-p[i],n]能更新的就是 前 [1,i+p[i]−1] [ 1 , i + p [ i ] − 1 ] [1,i+p[i]-