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. 再叙ASM

    上一篇文章,我们已体验到ASM的威力,那么结合上面的代码解释ASM是怎么执行的. ClassWriter clazzWriter = new ClassWriter(0); 首先看下官方文档对Clas ...

  2. arcgis server 中Web墨卡托投影与WGS-84坐标的转换

    arcgis server 中Web墨卡托投影坐标与WGS-84坐标的转换 //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={x:0, ...

  3. python 函数返回多个参数的赋值方法

    #定义函数 def Get_Counter_AllMeasureValue(self, inst_dg_address): """ get all measure val ...

  4. Log4j扩展使用--自定义输出

    写在前面的话 log4j支持自定义的输出.所有的输出都实现了自Appender接口.一般来说,自定义输出值需要继承AppenderSkeleton类,并实现几个方法就可以了. 写这篇博客,我主要也是想 ...

  5. 通过脚本生成poco实体

    今天在做开发时,需要把表映射成实体,又没有EF这种工具,就从网上下了一个工具,但使用时觉得太重了,所以就自己写了一个,基于mysql的. 功能:输入表名,得到这个表的poco实体 SELECT COL ...

  6. C# MongoDB

    一.搭建Mongodb 副本集 副本集中有三个角色: 主节点:所有副节点的数据均来自于主节点,并且只能对主节点进行读写操作.副节点:数据来自于主节点,可以进行读取操作,但是不能进行写操作.仲裁者:不含 ...

  7. Android ui 透明度设置

    格式如#00FFFFFF,前两位代表不透明度的十六进制.00表示完全透明,FF就是全不透明.依次递增. <?xml version="1.0" encoding=" ...

  8. awk 指定{}内x的替换

    替换{}中的x为;   原字符串 oxo{axbxc}oxo{dxexf}oxo 结果 oxo{a;b;c}oxo{d;e;f}oxo     awk '{for(i=1;i<=NF;i++){ ...

  9. 面试中的Https

    在Http协议中有可能存在信息窃听或身份伪装的安全问题.使用HTTPS通信机制可以有效地防止这些问题. Https Http的缺点 通信使用明文(不加密),内容可能会被窃听. 不验证通信方的身份,因此 ...

  10. 一个 div 手写红绿灯- 分别用css3 和 js 实现

    [要求] 一个div,配合 css3 或者 js 实现红绿灯切换的效果. [思路] 使用 css3,要实现红绿灯颜色的变换必然要用到 animation 动画,通过 keyframes 控制颜色的渐变 ...