2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 7340  Solved: 2982
[Submit][Status][Discuss]

Description

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令:
1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col
把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

Input

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

2016.3.2新加数据两组by Nano_Ape

题解:这道题,普通莫队也可以做,因为修改不多于1000次

直接10000000+n√n也可以做,这里还是用了带修改的莫队,

复杂度是O(n^(5/3))

这道题目貌似

排序方式,先按第一维块排,然后第二维位置,都一样才第三维时间。这样虽然是错的,但是速度快

因为m的大小是1000,这样√n个块,每次移动不会超过n,每个数之间就算修改为1000次,

那么复杂度是(√n+1000)×n 复杂度不高。

而第二种虽然是正解,因为受到修改次数影响,所以不如上一种优秀。

第一种 904ms

 #pragma GCC optimize(2)
#pragma G++ optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring> #define N 10007
#define M 1000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,num,xgnum,ans,blo;
int ys[N],bl[N],col[M],res[N];
struct Node
{
int x,y,id,xg;
}a[N];
struct Node1
{
int ps,val;
}b[N]; bool operator<(Node x,Node y)
{
if (bl[x.x]!=bl[y.x]) return bl[x.x]<bl[y.x];
if (x.y!=y.y) return x.y<y.y;
return x.xg<y.xg;
}
void del(int x){if(--col[x]==)ans--;}
void ins(int x){if(++col[x]==)ans++;}
void work(int wei,int i)
{
if(b[wei].ps>=a[i].x&&b[wei].ps<=a[i].y)
{
if(--col[ys[b[wei].ps]]==)ans--;
if(++col[b[wei].val]==)ans++;
}
swap(b[wei].val,ys[b[wei].ps]);
//十分巧妙
//对于操作3-7,下一次7-3
//所以直接交换两种颜色即可
}
void solve_modui()
{
int l=,r=,now=;
for (int i=;i<=num;i++)
{
while(l<a[i].x)del(ys[l++]);
while(l>a[i].x)ins(ys[--l]);
while(r<a[i].y)ins(ys[++r]);
while(r>a[i].y)del(ys[r--]);
while(now<a[i].xg)work(++now,i);
while(now>a[i].xg)work(now--,i);
res[a[i].id]=ans;
}
}
int main()
{
n=read(),m=read(),blo=sqrt(n);
for (int i=;i<=n;i++)
ys[i]=read(),bl[i]=(i-)/blo+;
while(m--)
{
char ch[];
scanf("%s",ch);
if(ch[]=='Q')
{
a[++num].x=read(),a[num].y=read();
a[num].id=num,a[num].xg=xgnum;
}
else b[++xgnum].ps=read(),b[xgnum].val=read();
}
sort(a+,a+num+);
solve_modui();
for (int i=;i<=num;i++)
printf("%d\n",res[i]);
}

1376ms

 #pragma GCC optimize(2)
#pragma G++ optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring> #define N 10007
#define M 1000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,num,xgnum,ans,blo;
int ys[N],bl[N],col[M],res[N];
struct Node
{
int x,y,id,xg;
}a[N];
struct Node1
{
int ps,val;
}b[N]; bool operator<(Node x,Node y)
{
if (bl[x.x]!=bl[y.x]) return bl[x.x]<bl[y.x];
if (bl[x.y]!=bl[y.y]) return bl[x.y]<bl[y.y];
return x.xg<y.xg;
}
void del(int x){if(--col[x]==)ans--;}
void ins(int x){if(++col[x]==)ans++;}
void work(int wei,int i)
{
if(b[wei].ps>=a[i].x&&b[wei].ps<=a[i].y)
{
if(--col[ys[b[wei].ps]]==)ans--;
if(++col[b[wei].val]==)ans++;
}
swap(b[wei].val,ys[b[wei].ps]);
//十分巧妙
//对于操作3-7,下一次7-3
//所以直接交换两种颜色即可
}
void solve_modui()
{
int l=,r=,now=;
for (int i=;i<=num;i++)
{
while(l<a[i].x)del(ys[l++]);
while(l>a[i].x)ins(ys[--l]);
while(r<a[i].y)ins(ys[++r]);
while(r>a[i].y)del(ys[r--]);
while(now<a[i].xg)work(++now,i);
while(now>a[i].xg)work(now--,i);
res[a[i].id]=ans;
}
}
int main()
{
n=read(),m=read(),blo=pow(n,/);
for (int i=;i<=n;i++)
ys[i]=read(),bl[i]=(i-)/blo+;
while(m--)
{
char ch[];
scanf("%s",ch);
if(ch[]=='Q')
{
a[++num].x=read(),a[num].y=read();
a[num].id=num,a[num].xg=xgnum;
}
else b[++xgnum].ps=read(),b[xgnum].val=read();
}
sort(a+,a+num+);
solve_modui();
for (int i=;i<=num;i++)
printf("%d\n",res[i]);
}

bzoj 2120 带修改莫队的更多相关文章

  1. BZOJ 2120 带修莫队

    思路: 暴力能过的 嘿嘿嘿 我是来练带修莫队的嗯 复杂度 O(n^5/3) //By SiriusRen #include <cmath> #include <cstdio> ...

  2. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

  3. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  4. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

  5. BZOJ.2453.维护队列([模板]带修改莫队)

    题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...

  6. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  7. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  8. BZOJ2120 数颜色(带修改莫队)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队

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

随机推荐

  1. oracle03

    (1)表中数据操作 插入数据: a.插入单条 insert into myemp(empno,ename) values(1111,'张三'); b.批量插入 insert into myemp se ...

  2. c#套料程序设计

    上的套料基本上都没有源码,开放的sdk都没有,这让很多想做套料,但是又成本太高了. 另外,大部分套料都是c++实现的,效率高,本人尝试用c#做一个套料程序,发现效率也不低,当然会比c++差点. 以下是 ...

  3. ROM、SDRAM、RAM、DRAM、SRAM、FLASH区别

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. Django 模版中如何对主菜单进行选中?

    问题描叙: 在实际模版中,返回的页面我们想要主菜单保持一种状态,这个主菜单进去的子页面,都需要保持主菜单选择状态 例如 主菜单是 课程, 下面展现的章节和视频页面时候, 课程这个主菜单在展现这个菜单下 ...

  5. Git: 本地创建版本库用于多处同步

    问题背景 目前有一个 Android 和 一个 iOS 项目,两个项目底层使用相同的 C++ 代码.由于在开发迭代中代码时常更新,而且往往是今天 Android 部分修改一小部分,明天 iOS 部分修 ...

  6. Linux指令--/etc/group文件

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...

  7. linkin大话面向对象--属性详解

    成员变量和局部变量 成员变量: 1.在一个类中,任何方法之外定义的变量:     2.从面向对象的思想来说我们又把实例变量看成一个类的属性.     3.实例变量在没有符初值时系统会自动帮我们做初始化 ...

  8. Win2003 设置远程连接限制数

    在开发过程中,很多同事需要连接到一台Win2003服务器,但是连接人数超过了10个,就连接不上了.想设置一下连接限制数,可以如下操作: 1:在运行里面输入gpedit.msc后,弹出"本地计 ...

  9. php中curl模拟post提交多维数组(转载)

    原文地址:http://www.cnblogs.com/mingaixin/archive/2012/11/09/2763265.html 今天需要用curl模拟post提交参数,请求同事提供的一个接 ...

  10. MySQL相关文档索引

    MySQL的新功能5.7 https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html MySQL5.7安装 http://note.youd ...