P3939 数颜色

题目背景

大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg

题目描述

小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 n" role="presentation" style="position: relative;">nn 的n" role="presentation" style="position: relative;">nn 只兔子排成长长的一排,来给他们喂胡萝卜吃。 排列完成后,第 ii 只兔子的颜色是4ai" role="presentation" style="position: relative;">4ai4ai 。俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而 绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小 C 十分苦恼。所以,为 了使得胡萝卜喂得更加准确,小 C 想知道在区间 [lj,rj]" role="presentation" style="position: relative;">[lj,rj][lj,rj]里有多少只颜色为 cj" role="presentation" style="position: relative;">cjcj 的兔子。

不过,因为小 C 的兔子们都十分地活跃,它们不是很愿意待在一个固定的位置;与此同 时,小 C 也在根据她知道的信息来给兔子们调整位置。所以,有时编号为 xj" role="presentation" style="position: relative;">xjxj和 xj+1" role="presentation" style="position: relative;">xj+1xj+1的两 只兔子会交换位置。 小 C 被这一系列麻烦事给难住了。你能帮帮她吗?

输入输出格式

输入格式:

从标准输入中读入数据。 输入第 1 行两个正整数 n" role="presentation" style="position: relative;">nn , m" role="presentation" style="position: relative;">mm 。

输入第 2 行 n" role="presentation" style="position: relative;">nn 个正整数,第 i" role="presentation" style="position: relative;">ii 个数表示第 i" role="presentation" style="position: relative;">ii 只兔子的颜色 ai" role="presentation" style="position: relative;">aiai。

输入接下来 mm 行,每行为以下两种中的一种:

“1 lj rj cj1" role="presentation" style="position: relative;">1 lj rj cj11 lj rj cj1 ” :询问在区间[lj,rj]" role="presentation" style="position: relative;">[lj,rj][lj,rj]里有多少只颜色为cj" role="presentation" style="position: relative;">cjcj​ 的兔子;

“ 2 xj" role="presentation" style="position: relative;">2 xj2 xj”: xj" role="presentation" style="position: relative;">xjxj和 xj+1" role="presentation" style="position: relative;">xj+1xj+1两只兔子交换了位置。

输出格式:

输出到标准输出中。

对于每个 1 操作,输出一行一个正整数,表示你对于这个询问的答案。

输入输出样例

输入样例#1:

6 5

1 2 3 2 3 3

1 1 3 2

1 4 6 3

2 3

1 1 3 2

1 4 6 3

输出样例#1:

1

2

2

3

说明

【样例 1 说明】

前两个 1 操作和后两个 1 操作对应相同;在第三次的 2 操作后,3 号兔子和 4 号兔子

交换了位置,序列变为 1 2 2 3 3 3。

【数据范围与约定】

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。 对于所有测试点,有 1≤lj&lt;rj≤n" role="presentation" style="position: relative;">1≤lj<rj≤n1≤lj<rj≤n,1≤xj&lt;n" role="presentation" style="position: relative;">1≤xj<n1≤xj<n 每个测试点的数据规模及特点如下表:



特殊性质 1:保证对于所有操作 1,有|rj−lj|≤20" role="presentation" style="position: relative;">|rj−lj|≤20|rj−lj|≤20或 |rj−lj|≤n−20" role="presentation" style="position: relative;">|rj−lj|≤n−20|rj−lj|≤n−20

特殊性质 2:保证不会有两只相同颜色的兔子。

好吧这又是一道水题,我可能是最近做数据结构做傻了,搞得连vector" role="presentation" style="position: relative;">vectorvector+二分这种技巧都搞忘了。没错,这道题标解就是vector" role="presentation" style="position: relative;">vectorvector+二分,但看到区间统计数的个数怎能不让人想到主席树呢?于是就有大佬对每种颜色建主席树跑过,但在我看来,这种方法和vector" role="presentation" style="position: relative;">vectorvector+二分的本质思想并没有区别,因此我另辟蹊径,自己yy" role="presentation" style="position: relative;">yyyy了一种做法(下来看了题解之后才发现自己又zz" role="presentation" style="position: relative;">zzzz了)。好吧我们对每个位置建一个主席树,然后主席树就成了前缀的形式,于是我们修改就与后面的前缀无关(因为从xj+1" role="presentation" style="position: relative;">xj+1xj+1到n" role="presentation" style="position: relative;">nn这些位置的每个数的权值仍然是不变的,这样的话操作2就变成了删除和插入操作的组合,不过貌似这样写会被卡常,本蒟蒻被卡了多次后乱改常数终于过了。事实证明switch" role="presentation" style="position: relative;">switchswitch的确快过if" role="presentation" style="position: relative;">ifif啊)

代码如下:

#include<bits/stdc++.h>
#define N 300005
using namespace std;
struct Node{int l,r,sum;}T[N*70];
int cnt=0,rt[N*70],n,m,col[N],siz=0;
inline void update(int &p,int last,int l,int r,int v,int tmp){
    p=++cnt,T[p].l=T[last].l,T[p].r=T[last].r;
    T[p].sum=T[last].sum+tmp;
    if(l==r)return;
    int mid=l+r>>1;
    if(v<=mid)update(T[p].l,T[last].l,l,mid,v,tmp);
    else update(T[p].r,T[last].r,mid+1,r,v,tmp);
}
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
inline int query(int p,int l,int r,int v){
    if(l==r)return T[p].sum;
    int mid=l+r>>1;
    if(v<=mid)return query(T[p].l,l,mid,v);
    else return query(T[p].r,mid+1,r,v);
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;++i)update(rt[i],rt[i-1],1,300000,col[i]=read(),1);
    while(m--){
        int op=read(),l=read();
        switch(op){
            case 1:{
                int r=read(),c=read();
                printf("%d\n",query(rt[r],1,300000,c)-query(rt[l-1],1,300000,c));
                break;
            }
            default:{
                update(rt[l],rt[l],1,300000,col[l],-1);
                update(rt[l],rt[l],1,300000,col[l+1],1);
                col[l]^=col[l+1],col[l+1]^=col[l],col[l]^=col[l+1];
                break;
            }
        }
    }
    return 0;
}

2018.07.07 洛谷 P3939 数颜色(主席树)的更多相关文章

  1. 洛谷——P3939 数颜色(暴力vecotr+二分)

    P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...

  2. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

  3. 洛谷P3939 数颜色(二分 vector)

    题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下. #include<bits/stdc++.h> using namespace std; const in ...

  4. [洛谷P3939]数颜色

    题目大意:有n个物品,每个物品有一个颜色.现在有两种操作:1.查询l-r内有多少颜色为c的物品并输出.2.将第x个物品和第x+1个交换.现在让你实现这些操作. 解题思路:首先一共有300000种颜色, ...

  5. [洛谷P3939]:数颜色(二分)

    题目传送门 题目描述 小$C$的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有相同的颜色.小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃.排列 ...

  6. P3939 数颜色 线段树动态开点

    P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...

  7. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  8. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  9. [bzoj2120] [洛谷P1903] 数颜色

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

随机推荐

  1. mysql数据库复制

    核心命令是 myssqldump mysqldump --host=host1 --opt sourceDb| mysql --host=host2 -C targetDb 详情参考: MySQL数据 ...

  2. 16 python xml模块

    1.基本概念 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单. 不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀. 至今很多传统公司如金 ...

  3. com.google.gson的SerializedName解决实体类与关键字的重名

    使用google的gson包,解决实体类中字段与java关键字的重名: // 比如 当实体类中有switch关键字时,解决冲突如下 @SerializedName("switch" ...

  4. (2)shiro角色资源权限

    一般在web系统权限设计中,一般分为三个维度,用户,角色,资源,一个用户可以拥有多个角色,比如说可以是老师,也可以是班主任,一个角色也可以拥有多个资源. 比如老师同时拥有查看班级学生和批改作业的资源, ...

  5. Egit的merge合并冲突具体解决方法

    稍微总结下弄了半个下午的egit的merge合并冲突解决方法,网上看的都是一个模板出来的,看的糊里糊涂,花了很多时间去实验整个合并流程.. 前提工作 创建一个普通JAVA工程Test,创建一个类Tes ...

  6. while循环出现的问题

    1 int c = 0; while(c<=100) c++ } 自己看了很久没看出来,后来请教同学才知道,变量g是不能写在一开始的,因为while循环只是循环自己的那个花括号内的指令,不会循环 ...

  7. springmvc DispatchServlet初始化九大加载策略(一)

    由于篇幅较长,因此分三篇进行讲解: springmvc DispatchServlet初始化九大加载策略(一) springmvc DispatchServlet初始化九大加载策略(二) spring ...

  8. java的Map浅析

    Map<K,V>是以键-值对存储的(key-value), 而Entry<K,V>是Map中的一个接口,Map.Entry<K,V>接口主要用于获取.比较 key和 ...

  9. 123. Best Time to Buy and Sell Stock III (Array; DP)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  10. 清明梦超能力者黄YY(idx数组)

    清明梦超能力者黄YY https://www.nowcoder.com/acm/contest/206/I 题目描述 黄YY是一个清明梦超能力者,同时也是一个记忆大师.他能够轻松控制自己在梦中的一切, ...