• 【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;
    }
    
  • 相关阅读:
    Python进程、线程
    Maven项目的坐标GroupId和ArtifactId
    java中的变量
    java中new一个对象的执行过程及类的加载顺序
    java中string和int互相转化
    什么是设计模式?
    Mybatis解决了JDBC编程哪些问题
    SQL注入、占位符拼接符
    JDBC、事务和连接池
    关于Spring配置文件xml文档的schema约束
  • 原文地址:https://www.cnblogs.com/ccryolitecc/p/13991822.html
Copyright © 2020-2023  润新知