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. ASP.NET导出word实例

    ASP.NET导出word实例 最近遇到一个题目就是如何在asp.net中将数据导出到word中,由于数据是动态的,所以需要在后台拼出想要的的格式,翻遍了网页找出了一个比较满意的代码,感谢那位高手.代 ...

  2. BSA Network Shell系列-nexec | runcmd | runscript | scriptutil的异同

    说明下nexec.runcmd.runscript.scriptutil的异同 相同点: 四者都可以在远程机器执行命令.或者调用脚本. 不同点: nexec支持NSH命令,可以执行远程机的本地命令(非 ...

  3. PHP如何读取json数据

    1的 <?php $json = '{"a":1,"b":2,"c":3,"d":4,"e": ...

  4. 在nagios中使用nrpe自定义脚本

    nrpe的安装    tar xvfz nrpe-2.13.tar.gz cd nrpe-2.13 ./configure make all make install-plugin make inst ...

  5. 02-创建 TLS CA证书及密钥

    创建 TLS CA证书及密钥 kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate ...

  6. jQuery动画详解

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. jQuery 动画 jQuery提供的一组网页中常见的动画效果,这些动画 ...

  7. WEB渗透测试之漏扫神器

    AppScan 对现代 Web 应用程序和服务执行自动化的动态应用程序安全测试(DAST) 和交互式应用程序安全测试 (IAST).支持 Web 2.0. JavaScript 和 AJAX 框架的全 ...

  8. js调DLL类库中的方法实现(非com组件形式)

    1.首先,创建一个Web空项目 2.添加一个html或aspx页面 3.页面代码如所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  9. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  10. LINUX改变文件大小

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