zoukankan      html  css  js  c++  java
  • (待修莫队 没过! 抽空在检查)Dynamic len(set(a[L:R])) UVA

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 50004, INF = 0x7fffffff;
    int n, m, pos[maxn], s[1000005], c[maxn], ans, t[maxn];
    int qsz, csz;
    struct node
    {
        int l, r, t, id, res;
    }Node[maxn];
    
    void add(int l, int r, int t, int id)
    {
        Node[id].l = l;
        Node[id].r = r;
        Node[id].t = t;
        Node[id].id = id;
    }
    int l = 1, r = 0, T = 0;
    struct change
    {
        int pos, Old, New;
    }Cha[maxn];
    
    void add_(int pos, int New, int Old, int cnt)
    {
        Cha[cnt].pos = pos;
        Cha[cnt].New = New;
        Cha[cnt].Old = Old;
    }
    
    bool cmp(node a, node b)
    {
        if(pos[a.l] == pos[b.l])
        {
            if(pos[a.r] == pos[b.r])
                return a.t < b.t;
            return pos[a.r] < pos[b.r];
        }
        return pos[a.l] < pos[b.l];
    }
    
    bool cmp_id(node a, node b)
    {
        return a.id < b.id;
    }
    
    void ad(int val)
    {
        s[val]++;
        if(s[val] == 1)
            ans++;
    }
    
    void de(int val)
    {
        s[val]--;
       // cout<< ans <<endl;
        if(s[val] == 0)
            ans--;
    }
    
    void go(int idx, int val)
    {
        if(l <= idx && idx <= r)
        {
            de(c[idx]);
            ad(val);
        }
        c[idx] = val;
    }
    
    
    int main()
    {
        qsz = csz = 0;
        ans = 0;
        scanf("%d%d", &n, &m);
        for(int i=1; i<=n; i++)
        {
            scanf("%d", &c[i]);
            t[i] = c[i];
        }
        int block = pow(n, 2.0/3);
        for(int i=1; i<=n; i++)
            pos[i] = (i-1)/block + 1;
        for(int i=1; i<=m; i++)
        {
            char str[5];
            int x, y;
            scanf("%s%d%d", str, &x, &y);
            if(str[0] == 'Q')
            {
                add(++x, y, csz, ++qsz);
            }
            else
            {
                add_(++x, y, t[x], ++csz);
                t[x] = y;
            }
        }
        sort(Node+1, Node+1+qsz, cmp);
    //    for(int i=1; i<=qsz; i++)
    //        cout<< Node[i].l << "  " << Node[i].r << endl;
        for(int i=1; i<=qsz; i++)
        {
            for(; T < Node[i].t; T++)
                go(Cha[T+1].pos, Cha[T+1].New);
            for(; T > Node[i].t; T--)
                go(Cha[T].pos, Cha[T].Old);
    
            for(; r < Node[i].r; r++)
                ad(c[r+1]);
            for(; r > Node[i].r; r--)
                de(c[r]);
            for(; l < Node[i].r; l++)
                de(c[l]);
            for(; l > Node[i].l; l--)
                ad(c[l-1]);
    //        for(; T < Node[i].t; T++)
    //            go(Cha[T+1].pos, Cha[T+1].New);
    //        for(; T > Node[i].t; T--)
    //            go(Cha[T].pos, Cha[T].Old);
    
            Node[i].res = ans;
        }
        sort(Node+1, Node+qsz+1, cmp_id);
        for(int i=1; i<=qsz; i++)
            printf("%d
    ",Node[i].res);
    
    
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    一个C#操作Excel类,功能比较全
    以纯面向对象的JS编写最基本的数据字典案例
    使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
    使用ztree.js,受益一生,十分钟学会使用tree树形结构插件
    shiro和quartz同时存在于项目中,解决冲突的方案
    以最简单的登录为例,诠释JS面向对象的简单实例
    BeJavaGod
    前端这条路怎么走,作为一名后端er,说说我的见解
    安全框架
    文档!重要的事情说第四遍~
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9348152.html
Copyright © 2011-2022 走看看