zoukankan      html  css  js  c++  java
  • HDU 3874 Necklace

    莫队算法。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 50000 + 10;
    int n, m;
    int a[maxn],pos[maxn],cnt[1000000+10];
    long long ans[200000+10], Ans;
    int L, R;
    struct X
    {
        int l, r, id;
    }s[200000+10];
    
    bool cmp(const X&a, const X&b)
    {
        if (pos[a.l] == pos[b.l]) return a.r < b.r;
        return a.l < b.l;
    }
    
    int main()
    {
        int T; scanf("%d",&T);
        while (T--)
        {
            memset(cnt,0,sizeof cnt);
            scanf("%d", &n);
            int sz = sqrt(n);
            for (int i = 1; i <= n; i++)
            {
                pos[i] = i / sz;
                scanf("%d", &a[i]);
            }
    
            scanf("%d", &m);
            for (int i = 1; i <= m; i++) {
                scanf("%d%d", &s[i].l, &s[i].r);
                s[i].id = i;
            }
            sort(s + 1, s + 1 + m, cmp);
            Ans=0;
            for (int i = s[1].l; i <= s[1].r; i++)
            {
                cnt[a[i]]++;
                if(cnt[a[i]]==1) Ans=Ans+(long long)a[i];
            }
            ans[s[1].id] = Ans; L = s[1].l; R = s[1].r;
    
            for (int i = 2; i <= m; i++)
            {
                while (L < s[i].l)
                {
                    cnt[a[L]]--;
                    if(cnt[a[L]]==0) Ans=Ans-(long long)a[L];
                    L++;
                }
                while (L > s[i].l)
                {
                    L--;
                    cnt[a[L]]++;
                    if(cnt[a[L]]==1) Ans=Ans+(long long)a[L];
                }
                while (R < s[i].r)
                {
                    R++;
                    cnt[a[R]]++;
                    if(cnt[a[R]]==1) Ans=Ans+(long long)a[R];
                }
                while (R > s[i].r)
                {
                    cnt[a[R]]--;
                    if(cnt[a[R]]==0) Ans=Ans-(long long)a[R];
                    R--;
                }
                ans[s[i].id] = Ans;
            }
    
            for (int i = 1; i <= m; i++) printf("%lld
    ", ans[i]);
        }
        return 0;
    }
  • 相关阅读:
    Python 连接SQLite数据库 及基础操作
    删除爬取字符串中的特殊字符
    网页爬虫中xa0、u3000等字符的解释及去除
    File 文件操作及模式说明
    【re】模块运用,正则匹配操作 待编辑
    MySQL
    正则表达式的常用操作符
    pip操作
    Python 常见运算
    Python32 1.半连接数 2.粘包问题解决
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5412313.html
Copyright © 2011-2022 走看看