zoukankan      html  css  js  c++  java
  • cdoj 1259 昊昊爱运动 II 线段树+bitset

    昊昊爱运动 II

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

    昊昊喜欢运动

    NN天内会参加MM种运动(每种运动用一个[1,m][1,m]的整数表示)

    现在有QQ个操作,操作描述如下

    • 昊昊把第ll天到第rr天的运动全部换成了xx(x[1,m]x∈[1,m])
    • 问昊昊第ll天到第rr天参加了多少种不同的运动

    Input

    输入两个数NN, MM (1N1051≤N≤105, 1M1001≤M≤100);

    输入NN个数aiai(ai[1,m]ai∈[1,m])表示在第i天昊昊做了第aiai类型的运动;

    输入一个数QQ(1Q1051≤Q≤105);

    输入QQ行 每行描述以下两种操作

    • 形如M l r x,表示昊昊把第ll天到第rr天的运动全部换成了xx(x[1,m]x∈[1,m])
    • 形如Q l r,表示昊昊想知道他第ll天到第rr天参加了多少种不同的运动

    Output

    对于所有的Q操作,每一行输出一个数 表示昊昊在第ll天到第rr天一共做了多少种活动

    Sample input and output

    Sample InputSample Output
    5 3
    1 2 3 2 3
    4
    Q 1 4
    Q 2 4
    M 5 5 2
    Q 1 5
    
    3
    2
    3
    

    Source

    咦。。。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    const int N=1e5+10,M=4e6+10,inf=1e9+10;
    struct is
    {
        int l,r;
        int lazy;
        bitset<110>b;
    }tree[N<<2];
    int a[N];
    void pushup(int pos)
    {
        tree[pos].b=tree[pos<<1].b|tree[pos<<1|1].b;
    }
    void pushdown(int pos)
    {
        if(tree[pos].lazy)
        {
            tree[pos<<1].lazy=tree[pos].lazy;
            tree[pos<<1|1].lazy=tree[pos].lazy;
            tree[pos<<1].b.reset();
            tree[pos<<1].b.set(tree[pos].lazy);
            tree[pos<<1|1].b.reset();
            tree[pos<<1|1].b.set(tree[pos].lazy);
            tree[pos].lazy=0;
        }
    }
    void build(int l,int r,int pos)
    {
        tree[pos].l=l;
        tree[pos].r=r;
        tree[pos].lazy=0;
        tree[pos].b.reset();
        if(l==r)
        {
            tree[pos].b.set(a[l]);
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,pos<<1);
        build(mid+1,r,pos<<1|1);
        pushup(pos);
    }
    void update(int l,int r,int change,int pos)
    {
        if(tree[pos].l==l&&tree[pos].r==r)
        {
            tree[pos].b.reset();
            tree[pos].b.set(change);
            tree[pos].lazy=change;
            return;
        }
        pushdown(pos);
        int mid=(tree[pos].l+tree[pos].r)/2;
        if(r<=mid)
        update(l,r,change,pos<<1);
        else if(mid<l)
        update(l,r,change,pos<<1|1);
        else
        {
            update(l,mid,change,pos<<1);
            update(mid+1,r,change,pos<<1|1);
        }
        pushup(pos);
    }
    bitset<110> query(int l,int r,int pos)
    {
        if(tree[pos].l==l&&tree[pos].r==r)
        return tree[pos].b;
        pushdown(pos);
        int mid=(tree[pos].l+tree[pos].r)>>1;
        if(r<=mid)
        return query(l,r,pos<<1);
        else if(l>mid)
        return query(l,r,pos<<1|1);
        else
        return query(l,mid,pos<<1)|query(mid+1,r,pos<<1|1);
    }
    char ch[10];
    int main()
    {
        int n,m,i;
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        build(1,n,1);
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int l,r,p;
            scanf("%s%d%d",ch,&l,&r);
            if(ch[0]=='Q')
                printf("%d
    ",query(l,r,1).count());
            else
                scanf("%d",&p),update(l,r,p,1);
        }
        return 0;
    }
  • 相关阅读:
    python 中文字符的处理
    python的一些内置函数
    python之命令行解析工具argparse
    牛客-小阳买水果
    牛客-小石的海岛之旅 (线性联通块)
    腾讯笔试-拼凑硬币
    2020腾讯笔试--Ice Cave
    2020-字节跳动笔试(树距离之和[距离按%3值不同,分为三类])
    2020-字节跳动笔试(最少工资)
    干物妹小埋(吉首大学2019)---线段树+dp
  • 原文地址:https://www.cnblogs.com/jhz033/p/5837677.html
Copyright © 2011-2022 走看看