Luogu 3939 数颜色

随手点开一个题。

咦,这不是裸的动态开点线段树吗?写一个写一个……

Code:

#include <cstdio>
#include <cstring>
using namespace std;

const int N = 3e5 + 5;

int n, qn, a[N];

inline void read(int &X) {
    X = 0;
    char ch = 0;
    int op = 1;
    for(; ch > ‘9‘ || ch < ‘0‘; ch = getchar())
        if(ch == ‘-‘) op = -1;
    for(; ch >= ‘0‘ && ch <= ‘9‘; ch = getchar())
        X = (X << 3) + (X << 1) + ch - 48;
    X *= op;
} 

struct Node {
    int lc, rc, sum;
};

namespace PSegT {
    int root[N], nodeCnt;
    Node s[N * 80];

    #define mid ((l + r) >> 1)

    void up(int p) {
        if(p) s[p].sum = s[s[p].lc].sum + s[s[p].rc].sum;
    }

    void ins(int &p, int l, int r, int x) {
        if(!p) p = ++nodeCnt;
        if(l == x && x == r) {
            s[p].sum++;
            return;
        }

        if(x <= mid) ins(s[p].lc, l, mid, x);
        else ins(s[p].rc, mid + 1, r, x);
        up(p);
    }

    void del(int &p, int l, int r, int x) {
        if(l == x && x == r) {
            s[p].sum--;
            if(s[p].sum == 0) p = 0;
            return;
        }
        if(x <= mid) del(s[p].lc, l, mid, x);
        else del(s[p].rc, mid + 1, r, x);
        up(p);

        if(!s[p].lc && !s[p].rc && !s[p].sum) p = 0;
    } 

    int query(int p, int l, int r, int x, int y) {
        if(!p) return 0;
        if(x <= l && y >= r) return s[p].sum;

        int res = 0;
        if(x <= mid) res += query(s[p].lc, l, mid, x, y);
        if(y > mid) res += query(s[p].rc, mid + 1, r, x, y);
        return res;
    }

} using namespace PSegT;

inline void swap(int &x, int &y) {
    int t = x;
    x = y;
    y = t;
}

int main() {
    read(n), read(qn);
    nodeCnt = 0;
    for(int i = 1; i <= n; i++) {
        read(a[i]);
        ins(root[a[i]], 1, n, i);
    }

    for(int op; qn--; ) {
        read(op);
        if(op == 1) {
            int x, y, c;
            read(x), read(y), read(c);
            printf("%d\n", query(root[c], 1, n, x, y));
        } else {
            int x;
            read(x);
            del(root[a[x]], 1, n, x);
            del(root[a[x + 1]], 1, n, x + 1);
            swap(a[x], a[x + 1]);
            ins(root[a[x]], 1, n, x);
            ins(root[a[x + 1]], 1, n, x + 1);
        }
    }

    return 0;
}

写完题的我:

内存太小,差评,卡常数,差评……这sb题……

点开题解:

……大概说的就是我……

没事复杂度其实是一样的

警醒a!!!不要一上手就乱写数据结构……

原文地址:https://www.cnblogs.com/CzxingcHen/p/9470370.html

时间: 2024-08-04 17:12:56

Luogu 3939 数颜色的相关文章

[luogu]P3939 数颜色[二分]

[luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排,来给他们喂胡萝卜吃. 排列完成后,第 i 只兔子的颜色是 ai?. 俗话说得好,“萝卜青菜,各有所爱”.小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好.比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而 绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小 C 十

luogu P3939 数颜色

题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 nn 的 nn 只兔子排成长长的一排,来给他们喂胡萝卜吃. 排列完成后,第 ii 只兔子的颜色是 a_iai?. 俗话说得好,“萝卜青菜,各有所爱”.小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好.比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡

luogu P3939 数颜色 |vector

题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排,来给他们喂胡萝卜吃. 排列完成后,第 i 只兔子的颜色是 ai 俗话说得好,"萝卜青菜,各有所爱".小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好.比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而 绿色的兔子却喜欢吃酸一点的胡萝卜--为了满足兔子们的要求,小 C 十分苦恼.所以,为 了使得胡萝

数颜色(带修莫队模板)

数颜色(luogu) Description 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 为了满足墨墨的要求,你知道你需要干什么了吗? 输入格式 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数. 第2行N个整数,分别代表初始画笔排中第i支画笔的颜色. 第3行到第2+M行

BZOJ2120: 数颜色

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 1394  Solved: 516[Submit][Status] Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Inpu

cogs 1901. [国家集训队2011]数颜色

Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔.2. R P Col 把第P支画笔替换为

bzoj 2120 数颜色

2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 5039  Solved: 2012 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? Input 第1行两个整数N,M,分别

bzoj 2120: 数颜色 线段树套平衡树

/************************************************************** Problem: 2120 User: wangyucheng Language: C++ Result: Time_Limit_Exceed ****************************************************************/ #include<iostream> #include<cstdio> #incl

[BZOJ2120][BZOJ2453]数颜色

[BZOJ2120]数颜色 试题描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? 输入 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分别代表墨墨会做的一件