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. 解析MYsql explain执行计划extra列输出

    EXPLAIN Extra 列信息: explain Extra列输出包含了关于mysql如何解决query的额外信息,特别是出现Using filesort 和 using temporary时,应 ...

  2. MYSQL优化派生表(子查询)在From语句中的

    Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能 ...

  3. JavaScript return 最简单解释

    一.return 返回值 1)函数名字 +括号 :fun() ==> retrun 后面的值 2)所以函数的模范返回值是为未定义 3)return; 后面的任何代码都不会执行了 二.arguem ...

  4. 2017-06-20 (pwd ls cd)

    pwd pwd   显示当前所在的位置 pwd -P  如果是链接文件,显示链接文件所指的位置 ls ls 查询目录中的内容 ls  -a 显示所有的文件,包含隐藏的文件   -l 显示详细的信息   ...

  5. linux_samba服务安装

    什么是samba服务? 用于Windows和linux系统之间实现共享文件的目的服务 如何配置其服务? Linux端: 搭建服务 1. 安装samba yum install -y samba 2. ...

  6. CSS深入理解学习笔记之float

    1.float的历史 float设计的初衷仅仅是为了文字环绕效果. 示例代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  7. org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor

    这几天来公司,公司的SVN坏掉了,然后项目还比较大,是一个分布式的,然后同事就把项目发我了.我在myeclipse里面导入项目了,把相应的jar包也建了个人的library导入了项目,现在项目不报错了 ...

  8. PHP date函数详解

    在页面的最前页加上date_default_timezone_set(PRC);   /*把时间调到北京时间,php5默认为格林威治标准时间*/date ()a:   "am"或是 ...

  9. js设置滚动条位置

    JS控制滚动条的位置: window.scrollTo(x,y); 竖向滚动条置顶(window.scrollTo(0,0); 竖向滚动条置底 window.scrollTo(0,document.b ...

  10. 一个最简单的cell按钮点击回调

    在cell.h定义 @property(nonatomic,strong)void(^pushType)(NSInteger); 在cell.m按钮点击时  _pushType(1):(举例)     ...