题目传送门


题目描述

小$C$的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有相同的颜色。小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃。排列完成后,第$i$只兔子的颜色是$a_i$。
俗话说得好,“萝卜青菜,各有所爱”。小$C$发现,不同颜色的兔子可能有对胡萝卜的不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小$C$十分苦恼。所以,为了使得胡萝卜喂得更加准确,小$C$想知道在区间$[l_j,r_j]$里有多少只颜色为$c_j$的兔子。不过,因为小$C$的兔子们都十分地活跃,它们不是很愿意待在一个固定的位置;与此同时,小$C$也在根据她知道的信息来给兔子们调整位置。所以,有时编号为$x_j$和$x_{j+1}$的两只兔子会交换位置。
小$C$被这一系列麻烦事给难住了。你能帮帮她吗?


输入格式

输入第$1$行两个正整数$n,m$。
输入第$2$行$n$个正整数,第$i$个数表示第$a_i$只兔子的颜色 。
输入接下来$m$行,每行为以下两种中的一种:
“$1\ l_j\ r_j\ c_j$”:询问在区间$[l_j,r_j]$里有多少只颜色为$c_j$的兔子;
“$2\ x_j$:$x_j$和$x_{j+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

样例输入2:

10 9
1 2 3 4 5 6 1 2 3 4
1 1 3 3
1 4 6 3
2 3
1 1 3 3
1 4 6 3
1 1 10 4
1 1 10 3
1 1 10 2
1 1 10 1

样例输出2:

1
0
0
1
2
2
2
2


数据范围与提示

样例$1$说明:

前两个$1$操作和后两个$1$操作对应相同;在第三次的$2$操作后,$3$号兔子和$4$号兔子交换了位置,序列变为$1\ 2\ 2\ 3\ 3\ 3$。

数据范围:

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。
对于所有测试点,有$1\leqslant l_j\leqslant r_j\leqslant n,1\leqslant x_j\leqslant n$。
每个测试点的数据规模及特点如下表:

测试点       $n$                    操作$1$             操作$2$             $a_i,c_j$           特殊性质$1$           特殊性质$2$
    $1$           $2$                     $6$                     $0$                     $\leqslant  2$                     $\surd$                          $\surd$
    $2$           $2$                     $1000$             $1000$              $\leqslant 1000$              $\surd$                          $\surd$
    $3$          $1000$              $1000$              $0$                     $\leqslant 1000$              $\times$                          $\times$
    $4$          $1000$              $1000$              $1000$              $\leqslant  10$                   $\times$                          $\times$
    $5$          $1000$              $1000$              $1000$              $\leqslant 1000$              $\times$                         $\surd$
    $6$          $1000$              $1000$              $1000$              $\leqslant 1000$              $\times$                         $\times$
    $7$          $5\times {10}^4$        $5\times {10}^4$        $0$                     $\leqslant 5\times {10}^4$        $\surd$                         $\times$
    $8$          $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 10$                   $\times$                         $\times$
    $9$          $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\surd$
    $10$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $11$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $12$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $13$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $14$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $15$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 10$                   $\times$                         $\times$
    $16$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\surd$
    $17$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\surd$                         $\times$
    $18$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $19$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $20$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$


题解

$30\%$算法:

啥也甭管,暴力搞就好了。

时间复杂度:$\Theta(n\times m)$。

期望得分:$30$分(朴素),$60$分($luoguO2+$卡常)。

$65\%$算法:

树套树。

时间复杂度:$\Theta(n\log^2n)$。

带修莫队。

时间复杂度:$\Theta(n^{\frac{5}{3}})$。

期望得分:$60\thicksim 100$分。

$100\%$算法:

记录每种颜色的每个兔子的出现位置,然后进行二分查找答案,操作$2$只需要改变坐标即可。

需要注意的是,如果交换的两个兔子颜色一样不要交换它们,否则会导致坐标的无序。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。


代码时刻

$30\%$算法(朴素):

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300001];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int l,r,c,ans=0;
scanf("%d%d%d",&l,&r,&c);
for(int i=l;i<=r;i++)
if(a[i]==c)ans++;
printf("%d\n",ans);
}
else
{
int x;
scanf("%d",&x);
swap(a[x],a[x+1]);
}
}
return 0;
}

$30\%$算法($luoguO2$+卡常):

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#pragma GCC optimize(s)
using namespace std;
int n,m;
int a[300001];
int main()
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
while(m--)
{
register int opt;
scanf("%d",&opt);
if(opt==1)
{
register int l,r,c,ans=0;
scanf("%d%d%d",&l,&r,&c);
for(register int i=l;i<=r;i++)
if(a[i]==c)ans++;
printf("%d\n",ans);
}
else
{
register int x;
scanf("%d",&x);
swap(a[x],a[x+1]);
}
}
return 0;
}

$65\%$算法(常数小,可AC):

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300001];
int rt[300001],trsum[10000000],son[10000000][2],tot;
void change(int &x,int l,int r,int to,int d)
{
if(!x)x=++tot;
trsum[x]+=d;
if(l==r)return;
int mid=(l+r)>>1;
if(to<=mid)change(son[x][0],l,mid,to,d);
else change(son[x][1],mid+1,r,to,d);
}
int ask(int x,int l,int r,int L,int R)
{
if(!x)return 0;
if(l==L&&r==R)return trsum[x];
int mid=(l+r)>>1;
if(L>mid)return ask(son[x][1],mid+1,r,L,R);
else if(R<=mid)return ask(son[x][0],l,mid,L,R);
else return ask(son[x][0],l,mid,L,mid)+ask(son[x][1],mid+1,r,mid+1,R);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
change(rt[a[i]],1,n,i,1);
}
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
printf("%d\n",ask(rt[c],1,n,l,r));
}
else
{
int x;
scanf("%d",&x);
change(rt[a[x ]],1,n,x ,-1);
change(rt[a[x ]],1,n,x+1, 1);
change(rt[a[x+1]],1,n,x+1,-1);
change(rt[a[x+1]],1,n,x , 1);
a[x]^=a[x+1]^=a[x]^=a[x+1];
}
}
return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[300001];
vector<int> v[300001];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
v[a[i]].push_back(i);
}
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
printf("%d\n",upper_bound(v[c].begin(),v[c].end(),r)-lower_bound(v[c].begin(),v[c].end(),l));
}
else
{
int x;
scanf("%d",&x);
if(a[x]!=a[x+1])
{
(*lower_bound(v[a[x]].begin(),v[a[x]].end(),x))++;
(*lower_bound(v[a[x+1]].begin(),v[a[x+1]].end(),x+1))--;
swap(a[x],a[x+1]);
}
}
}
return 0;
}

rp++

[洛谷P3939]:数颜色(二分)的更多相关文章

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

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

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

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

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

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

  4. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  5. [洛谷P3939]数颜色

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

  6. [luogu]P3939 数颜色[二分]

    [luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...

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

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

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

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

  9. 洛谷P1903 数颜色 [国家集训队] 莫队

    正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...

随机推荐

  1. Nginx日志监控 使用 goaccess查看nginx日志

    nginx日志监控 yum install goaccess   安装使用教程 goaccess access.log -o ../html/report.html --real-time-html ...

  2. [Web 前端] 028 jQuery 事件

    目录 jQuery 的事件 1. 事件绑定 1.1 事件的获取 1.2 基本绑定 1.3 动态绑定 2. 事件触发 2.1 触发的写法 2.2 常用的鼠标事件 3. 事件冒泡和默认行为 3.1 事件冒 ...

  3. Spring Boot 2.2.0 正式发布,支持 JDK 13!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 推荐阅读: Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Centr ...

  4. Java中的sort

    Java中对集合排序有两种方式 Comparable和Comparator public static <T> void sort(List<T> list); 将集合中的数据 ...

  5. CSP2019

    $CSP\space S$ 格雷码 $solution:$ 直接模拟即可. 时间复杂度 $O(n)$ . #include<iostream> #include<cstring> ...

  6. 小程序中页面兼容h5标签的解析

    有时候当小程序向后台拿数据是一篇html标签的文章时,把它放进小程序会发现很多标签就不兼容,如果要一个个改又很麻烦,有没有方法可以很快地兼容html标签呢? 有个工具可以做到:wxParse 下载了它 ...

  7. 1rem,1em,1vh,1px含义

    rem:相对于页面根元素<html>元素,通常做法是给html元素设置一个字体大小,然后其他元素的大小就是相对于根元素的大小 em:相对于父元素字体大小,元素的width/height/p ...

  8. React中配置Sass引入.scss文件无效

    React中配置Sass引入.scss文件无效 在react中使用sass时,引入.scss文件失效尝试很多方法没法解决,最终找到解决方法,希望能帮助正在坑里挣扎的筒子~ 在node_modules文 ...

  9. Java JPA设置默认值、Timestamp设置、自动获取时间

    设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...

  10. JSP页面包含其他页面的三种方式及区别

    一. <%@ include file="header.inc"%> 该指令在编译之前先读入指定的页面中的内容(并不对动态内容求值),融合后的完整页面再被整体的转换为一 ...