$n \leq 10000$的数列,$m \leq 10000$个操作,一:单点修改;二:查区间不同数字个数。修改数$\leq 1000$,数字$\leq 1000000$。

我不会告诉您这是三种写法的双倍经验题!!

一般可以把查区间不同个数改成:$pre_i$表示$i$之前的一个与她相同的数在哪,然后变成查某个区间$pre_i$在某个范围内的数量。可以主席树,也可分块。修改暴力重构。

方法三:带修莫队。按L块为第一关键字、R块为第二关键字、时间为第三关键字对询问排序,这样时间指针的移动复杂度是块数量的平方乘修改数。

理论上块大小取$n^{\frac{2}{3}}$是最好的,但是注意一下修改数只有1000。。于是求个导画个图象(用电脑)可得块大小280左右时最优。加了个离散化跑得飞起。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<queue>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; int n,m,lq,lc,tot;
#define maxn 10011
#define maxm 288
int a[maxn],bel[maxn];
struct Ques{int l,r,t,id;}q[maxn];
bool cmp(const Ques a,const Ques b) {return bel[a.l]==bel[b.l]?(bel[a.r]==bel[b.r]?a.t<b.t:a.r<b.r):a.l<b.l;}
struct Modi{int x,a,b;}mo[maxn]; int lisa[maxn<<],li;
int ss; int cnt[maxn<<],ans[maxn];
void modify(int p,int type) {cnt[a[p]]+=type; if (type>) ss+=cnt[a[p]]==; else ss-=cnt[a[p]]==;}
void timemodify(int L,int R,int p,int v) {if (L<=p && p<=R) modify(p,-); a[p]=v; if (L<=p && p<=R) modify(p,);} int main()
{
scanf("%d%d",&n,&lq); m=;
for (int i=;i<=n;i++) bel[i]=(i-)/m+; tot=bel[n];
for (int i=;i<=n;i++) scanf("%d",&a[i]),lisa[++li]=a[i];
char c; lc=;
for (int i=,j=;i<=lq;i++)
{
while ((c=getchar())!='R' && c!='Q');
if (c=='Q')
{
j++; scanf("%d%d",&q[j].l,&q[j].r);
q[j].id=j; q[j].t=lc;
}
else
{
lc++; scanf("%d%d",&mo[lc].x,&mo[lc].b);
mo[lc].a=a[mo[lc].x]; a[mo[lc].x]=mo[lc].b; lisa[++li]=mo[lc].b;
}
}
lq-=lc;
sort(lisa+,lisa++li); li=unique(lisa+,lisa++li)-lisa-;
for (int i=;i<=n;i++) a[i]=lower_bound(lisa+,lisa++li,a[i])-lisa;
for (int i=;i<=lc;i++) mo[i].a=lower_bound(lisa+,lisa++li,mo[i].a)-lisa,
mo[i].b=lower_bound(lisa+,lisa++li,mo[i].b)-lisa; sort(q+,q++lq,cmp);
int L=,R=,T=lc; ss=;
for (int i=;i<=lq;i++)
{
while (T>q[i].t) timemodify(L,R,mo[T].x,mo[T].a),T--;
while (T<q[i].t) T++,timemodify(L,R,mo[T].x,mo[T].b);
while (L<q[i].l) modify(L,-),L++;
while (L>q[i].l) modify(L-,),L--;
while (R<q[i].r) modify(R+,),R++;
while (R>q[i].r) modify(R,-),R--;
ans[q[i].id]=ss;
}
for (int i=;i<=lq;i++) printf("%d\n",ans[i]);
return ;
}

会修修的莫队--BZOJ2120: 数颜色的更多相关文章

  1. AC日记——【模板】分块/带修改莫队(数颜色) 洛谷 P1903

    [模板]分块/带修改莫队(数颜色) 思路: 带修改莫队: (伏地膜xxy): 代码: #include <bits/stdc++.h> using namespace std; #defi ...

  2. 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)

    莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...

  3. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

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

  4. 洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)

    试题来源 2011中国国家集训队命题答辩 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  5. P1903 【模板】分块/带修改莫队(数颜色)

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

  6. luogu1903 【模板】分块/带修改莫队(数颜色)

    莫队算法模板 推荐阅读这篇博客 #include <algorithm> #include <iostream> #include <cstdio> #includ ...

  7. BZOJ2120 数颜色 【带修莫队】

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

  8. bzoj2120 数颜色 莫队 带修改

    [bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  9. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

随机推荐

  1. ssl证书过期问题解决

    1,ssl证书失效现象 小程序debug有如下证书无效信息: 浏览器访问https://ic-park.net:30001/indoornav/callFunction1.php 提示证书风险. 2, ...

  2. PHP Deprecated: Function split() is deprecated in /var/www/html/cacti/cmd.php on line 61

    [root@localhost cacti]# php cmd.php PHP Deprecated: Function split() is deprecated in /var/www/html/ ...

  3. umask命令

    umask——显示.设置文件的缺省权限 the user file-creation mask 命令所在路径:Shell内置命令 示例1:显示缺省权限 # umask -S 参数S的作用是以rwx形式 ...

  4. String系列之replaceAll方法替换.

    直接使用String类的replaceall方法的第一个参数并不是简单的字符串,而是一个正则表达式.在正则表达式中,英文点号(.)表示任意字符,所以你原先的写法会把所有字符都替换成空白. 转义使用所以 ...

  5. docker环境安装

    centos7安装docker环境 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 ...

  6. java程序在一个电脑上只启动一次,只开一个进程

    方案1: 单进程程序可以用端口绑定.程序启动的时候可以尝试看该端口是否已经被占用,如果占用则程序已经启动. 方案2:你可以在java程序中创建一个隐藏文件,程序退出的时候删除这个文件.这样在程序启动的 ...

  7. Caused by: java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.bj186.crm.pojo.User

    原因分析: myBatis在写delete语句的时候,多写了一个属性 错误的代码: <delete id="deleteUser" parameterType="I ...

  8. JS第三方中间件的延伸

    js中间件 当我们在编写业务代码时候,我们无法避免有些业务逻辑复杂而导致业务代码写得又长又乱,如果再加上时间紧凑情况下写出来的代码估计会更让人抓狂.以至于我们一直在寻求更好的架构设计和更好的代码设计, ...

  9. java session cookie的使用

    Cookie; Session; URL重写; cookie在J2EE项目中的使用,Java中把Cookie封装成了java.servlet.http.Cookie类.每个Cookie都是该Cooki ...

  10. ios 自定义delegate(一)

    在自定义协议的头文件 .h中 @protocol NSDelegate <NSObject>@optional  //可选 - (void)OnOption:(NSString *)pSt ...