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


    标题效果:一些珠子项链。珠具有不同的颜色。我们问了很多次有多少种不同的颜色有过一段范围。


    思考:这个问题让我学会聪明的离线实践。按左端点排序问题。加工出来的位置每种颜色首次出现。每一种颜色的下一次出现的位置。然后,1至cnt周期,这里有一个问题的左端点是当前节点,就处理他的答案。方法是前缀合,能够用树状数组。然后把这个颜色的下一个出现的位置+1。

    这样做就避免了一种颜色在询问中被处理两次。


    CODE:


    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define MAX 1000010
    using namespace std;
    
    struct Complex{
        int x,y,_id;
    
        bool operator <(const Complex &a)const {
            return x < a.x;
        }
        void Read() {
            scanf("%d%d",&x,&y);
        }
    }ask[MAX];
    
    int cnt,src[MAX],asks;
    int ans[MAX];
    int tree[MAX];
    int _next[MAX],last_color[MAX];
    
    void Fix(int x);
    int GetSum(int x);
    
    int main()
    {
        cin >> cnt;
        for(int i = 1;i <= cnt; ++i)
            scanf("%d",&src[i]);
        cin >> asks;
        for(int i = 1;i <= asks; ++i) {
        	ask[i].Read();
        	ask[i]._id = i;
        }
        sort(ask + 1,ask + asks + 1);
        for(int i = 1;i <= cnt; ++i) {
        	if(!last_color[src[i]])	Fix(i);
        	_next[last_color[src[i]]] = i;
        	last_color[src[i]] = i;
        }
        int p_ask = 1;
        for(int i = 1;i <= cnt; ++i) {
            while(ask[p_ask].x == i) {
        		ans[ask[p_ask]._id] = GetSum(ask[p_ask].y) - GetSum(ask[p_ask].x - 1);
                p_ask++;
            }
            if(_next[i])
                Fix(_next[i]);
        }
        for(int i = 1;i <= asks; ++i)
        	printf("%d
    ",ans[i]);
        return 0;
    }  
    
    void Fix(int x)
    {   
        for(int i = x;i <= cnt;i += i&-i)
            tree[i]++;
    }
    
    int GetSum(int x)
    {  
        int re = 0;
        for(int i = x;i > 0;i -= i&-i)
            re += tree[i];
        return re;
    }


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    AppCompatActivity、ActionBarActivity、FragmentActivity和Activity的区别
    Android-Async-Http
    如何在Android studio中同时打开多个工程?
    Multi-threading Android Apps for Multi-core Processors – Part 1 of 2
    Performance Tips
    容器生态系统
    Docker生态不会重蹈Hadoop的覆辙
    Docker生态会重蹈Hadoop的覆辙吗?
    国外牛人的五个Kubernetes学习建议
    Kubernetes基本概念
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4906146.html
Copyright © 2020-2023  润新知