UESTC-1259 昊昊愛運動 II

昊昊愛運動 II

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

昊昊喜歡運動c++

N天內會參加M種運動(每種運動用一個[1,m]的整數表示)ui

如今有Q個操做,操做描述以下spa

  • 昊昊把第l天到第r天的運動所有換成了x(x[1,m])
  • 問昊昊第l天到第r天參加了多少種不一樣的運動

Input

輸入兩個數N, M (1N105, 1M100);code

輸入N個數ai(ai[1,m])表示在第i天昊昊作了第ai類型的運動;blog

輸入一個數Q(1Q105);input

輸入Q行 每行描述如下兩種操做it

  • 形如M l r x,表示昊昊把第l天到第r天的運動所有換成了x(x[1,m])
  • 形如Q l r,表示昊昊想知道他第l天到第r天參加了多少種不一樣的運動

Output

對於全部的Q操做,每一行輸出一個數 表示昊昊在第l天到第r天一共作了多少種活動table

Sample input and output

Sample Input Sample 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

咦。。。     
 
分析
這道題看上去像是Dynamic len(set(a[LR])),可是單點更新變成了區間更新,看上去不太好搞。
注意到m比較小,能夠用更簡單的方式來維護,線段樹每一個結點用bitset保存一下這m個數字的出現狀況和更新標記就行了。
 
/*********************************************************
*      --------------Alfheim--------------               *
*   author AbyssalFish                                   *
**********************************************************/
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAX_N = 1e5+5, MAX_M = 100+28;
int N, M;

int a[MAX_N];

#define para int o = 1, int l = 1, int r = N
#define lo (o<<1)
#define ro (o<<1|1)
#define Tvar int md = (l+r)>>1;
#define lsn lo,l,md
#define rsn ro,md+1,r
#define insd ql <= l && r <= qr
const int ST_SIZE = 1<<18;

int S[ST_SIZE];
bitset<MAX_M> E[ST_SIZE];

inline void sink(int o,int s)
{
    E[o].reset(); E[o].set(S[o] = s);
}

void build(para)
{
    if(l == r){
        E[o].set(a[l]);
    }
    else {
        Tvar
        build(lsn);
        build(rsn);
        E[o] = E[lo] | E[ro];
    }
}



inline void push_down(int o)
{
    if(S[o]){
        sink(lo,S[o]);
        sink(ro,S[o]);
        S[o] = 0;
    }
}

bitset<MAX_M> res;
int ql,qr;
void query(para)
{
    if(insd){
        res |= E[o];
    }
    else {
        push_down(o);
        Tvar
        if(ql <= md) query(lsn);
        if(qr > md) query(rsn);
    }
}

int qval;
void modify(para)
{
    if(insd){
        sink(o,qval);
    }
    else {
        push_down(o);
        Tvar
        if(ql <= md) modify(lsn);
        if(qr > md) modify(rsn);
        E[o] = E[lo] | E[ro];
    }
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("data.txt","r",stdin);
#endif
    scanf("%d%d",&N,&M);
    for(int i = 1; i <= N; i++) scanf("%d",a+i);
    build();
    int Q; scanf("%d",&Q);
    char op[2];
    while(Q--){
        scanf("%s%d%d",op,&ql,&qr);
        if(*op == 'Q'){
            res.reset();
            query();
            printf("%d\n", res.count());
        }
        else {
            scanf("%d",&qval);
            modify();
        }
    }
    return 0;
}
相關文章
相關標籤/搜索