zoukankan      html  css  js  c++  java
  • 【Luogu1903】数颜色

    Link:
    https://www.luogu.com.cn/problem/P1903


    Solution

    这个 sort

    本来我 T 了三个点的 cmp 函数如下

    bool cmp(const s_q &a, const s_q &b)
    {
        if (belong[a.x] == belong[b.x])
        {
            if (a.y == b.y)
            {
                if (belong[a.x] & 1) return a.t < b.t;
                return a.t > b.t;
            }
            if (belong[a.x] & 1)
            {
                return a.y < b.y;
            }
            return a.y > b.y;
        }
        return belong[a.x] < belong[b.x];
    }
    

    为什么这是错误的?
    因为这样的复杂度是 (O(ncdot sizecdot t))

    正确写法见下方
    复杂度分析一下
    l 最多跑 (O(ncdot size))
    r 最多跑 (O(ncdot count))
    t 最多跑 (O(countcdot countcdot t))



    Code

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cctype>
    #include<cmath>
    
    using namespace std;
    
    char frBB[1<<12], *frS=frBB, *frT=frBB;
    #define getchar() (frS==frT&&(frT=(frS=frBB)+fread(frBB,1,1<<12,stdin),frS==frT)?EOF:*frS++)
    double _db_read()
    {
        bool w = 0; char ch = 0; double x = 0;
        while (!isdigit(ch)) w |= ch == '-', ch = getchar();
        while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
        if (ch == '.')
        {
    		double y = 1.0; ch = getchar();
            while (isdigit(ch)) x += (y /= 10) * (ch ^ 48), ch = getchar();
        }
        return w ? -x : x;
    }
    int _n_read()
    {
        bool w = 0; char ch = 0; int x = 0;
        while (!isdigit(ch)) w |= ch == '-', ch = getchar();
        while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
        return w ? -x : x;
    }
    #define read(x) x=_n_read()
    
    const int MAXN = 15e4;
    const int MAXC = 1e6 + 10;
    
    int n, m, _Time = 0, block_siz, block_cnt, belong[MAXN], col[MAXN], _col_Temp[MAXN];
    
    int Modify_Target[MAXN], Modify_Result[MAXN], Before_Modify[MAXN], _m_Temp = 0;
    
    int Bucket[MAXC];
    
    int Answer[MAXN];
    
    struct s_q
    {
        int id, x, y, t;
    
        // type == 1 :
        // x : Query_L
        // y : Query_R
    
        s_q(const int &aug1 = 0, const int &aug2 = 0, const int &aug3 = 0, const int &aug4 = 0)
        {
            id = aug1;
            x = aug2;
            y = aug3;
            t = aug4;
        }
    
    } sq[MAXN];
    
    bool cmp(const s_q &a, const s_q &b)
    {
    	if (belong[a.x] != belong[b.x]) return belong[a.x] < belong[b.x];
    	if (belong[a.y] != belong[b.y]) return (belong[a.x] & 1) ? (belong[a.y] < belong[b.y]) : (belong[a.y] > belong[b.y]);
    	return (belong[a.y] & 1) ? (a.t < b.t) : (a.t > b.t);	
    }
    
    int main()
    {
        read(n);
        read(m);
    
        for (int i = 1; i <= n; ++i)
        {
            read(col[i]);
            _col_Temp[i] = col[i];
        }
    
        // Queries+ReadIn
        {
            char ch;
    
            for (int i = 1; i <= m; ++i)
            {
            	while(ch = getchar())
            	{
            		if (isalpha(ch)) break;
            	}
    
                if (ch == 'Q')
                {
                    sq[++_m_Temp].t = _Time;
                    read(sq[_m_Temp].x);
                    read(sq[_m_Temp].y);
                    sq[_m_Temp].id = _m_Temp;
                    continue;
                }
    
                // ch == 'R'
                {
                    ++_Time;
                    read(Modify_Target[_Time]);
                    read(Modify_Result[_Time]);
                    Before_Modify[_Time] = _col_Temp[Modify_Target[_Time]];
                    _col_Temp[Modify_Target[_Time]] = Modify_Result[_Time];
                }
            }
    
            m = _m_Temp;
        }
    
        block_siz = ceil(pow(n, 0.75));
    
        for (int cur_block_id = 1, cur_block_pos = 0, i = 1; i <= n; ++i)
        {
            ++cur_block_pos;
            if (cur_block_pos == block_siz + 1)
            {
                ++cur_block_id;
                cur_block_pos = 1;
            }
            belong[i] = cur_block_id;
        }
    
        block_cnt = belong[n];
    
        sort(sq + 1, sq + 1 + m, cmp);
    
        // Run+DaiXiu_MoDui
        {
            int l = 1, r = 0, t = 0;
    
            for (int _answer_Temp = 0, i = 1; i <= m; ++i)
            {
    
                while (l < sq[i].x)
                {
                    _answer_Temp -= !--Bucket[col[l++]];
                }
                while (l > sq[i].x)
                {
                    _answer_Temp += !Bucket[col[--l]]++;
                }
                while (r < sq[i].y)
                {
                    _answer_Temp += !Bucket[col[++r]]++;
                }
                while (r > sq[i].y)
                {
                    _answer_Temp -= !--Bucket[col[r--]];
                }
                while (t < sq[i].t)
                {
                    ++t;
                    if (sq[i].x <= Modify_Target[t] && Modify_Target[t] <= sq[i].y)
                    {
                        _answer_Temp -= !--Bucket[col[Modify_Target[t]]];
                        _answer_Temp += !Bucket[Modify_Result[t]]++;
                    }
                    col[Modify_Target[t]] = Modify_Result[t];
                }
                while (t > sq[i].t)
                {
                    if (sq[i].x <= Modify_Target[t] && Modify_Target[t] <= sq[i].y)
                    {
                        _answer_Temp -= !--Bucket[col[Modify_Target[t]]];
                        _answer_Temp += !Bucket[Before_Modify[t]]++;
                    }
                    col[Modify_Target[t]] = Before_Modify[t];
                    --t;
                }
                Answer[sq[i].id] = _answer_Temp;
            }
        }
    
        for (int i = 1; i <= m; ++i)
        {
        	printf("%d
    ", Answer[i]);
        }
    
        return 0;
    }
    
  • 相关阅读:
    Educational Codeforces Round 10 C. Foe Pairs 水题
    Educational Codeforces Round 10 B. z-sort 构造
    CDOJ 1048 Bob's vector 三分
    Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
    第14届电子科大初赛民间盗版部分题目题解
    HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
    HDU 5653 Bomber Man wants to bomb an Array. dp
    HDU 5652 India and China Origins 二分+并查集
    HDU 5651 xiaoxin juju needs help 数学
    HDU 5650 so easy 数学
  • 原文地址:https://www.cnblogs.com/ccryolitecc/p/13991822.html
Copyright © 2011-2022 走看看