题目传送门


题目描述

小$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. 数据库 三范式 BCFN

    # 三范式 范式  设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.  目前关系数据库有六种范式:第一 ...

  2. SSIS包定时执行

    企业管理器 --管理 --SQL Server代理 --右键作业 --新建作业 --"常规"项中输入作业名称 --"步骤"项 --新建 --"步骤名& ...

  3. oracle 实现mysql find_set_in函数

    create or replace FUNCTION F_FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',' ...

  4. vue axios应用

    编写小的demo应用axios异步请求. 效果图示: 功能: 用户在输入框中输入信息进行搜索,并搜索状态随之改变(四种状态). 项目目录: 代码: 1.index.html <!DOCTYPE ...

  5. Codeforces 1262D Optimal Subsequences(BIT+二分)

    首先比较容易想到肯定是前k大的元素,那么我们可以先对其进行sort,如果数值一样返回下标小的(见题意),接下里处理的时候我们发现需要将一个元素下标插入到有序序列并且需要访问第几个元素是什么,那么我们可 ...

  6. socket 服务器向指定的客户端发消息

    一.需求 需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息. 二.解决方案 核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息. socket含有发送方和 ...

  7. 学习MyBatis时报的错

    初学MyBatis第一天跟着敲代码,一直报错,报错到崩溃,错误如下 org.apache.ibatis.exceptions.PersistenceException: ### Error query ...

  8. layoutSubviews何时调用的问题(原文:http://www.cnblogs.com/pengyingh/articles/2417211.html)

    今天跟旺才兄学习了一下UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这 ...

  9. Nginx中配置https中引用http的问题

    Nginx中配置https中引用http的问题 遇到问题: 今天公司要在后台增加直播入口,使用腾讯云的实时音视频,要求是必须使用https,在配置完强制跳转https候,发现后台无法上传图片,在浏览器 ...

  10. /etc/nscd.conf - 域名服务缓存守护进程配置文件

    描述 DESCRIPTION 该文件 /etc/nscd.conf 在启动 nscd(8) 时读入.每一行或者指定一个属性和值,或者指定一个属性.服务和一个值.域之间通过空格或者TAB分开.‘#’表示 ...