正解:带修莫队

解题报告:

可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛

但是肯定既然这样的话,按照原来的sort的话时间参数就会改啊改改啊改依然很慢,可以到O(n2)了,还不如暴力呢

考虑怎么修改sort

可以修改成,首先依然是按照l分块,然后每个块的内部,以r所在的块为第一关键字time为第二关键字再排序

然后这个时候依然不够优秀,考虑通过修改分块的大小使其更加优秀

因为不会求时间复杂度我就放弃挣扎了QAQ

反正就通过一下很牛逼的分类讨论巴拉巴拉的可以得到当分块的大小是n2/3时时间复杂度最优秀,可以做到O(n5/3)

(不过我看了下其他大佬的博客,,,发现,,,直接用logn也可以水过去欸,,,

然后大概就没辣!

其实感觉还是没有特别难的?虽然我没看清题目范围RE了两次哭唧唧

要分析的前面都分析了唯一的问题就是关于时间复杂度的这个我也没有办法,,,等以后会计算时间复杂度了再来港趴qwq

就酱,放下代码就走了qwq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=+,LQ=+;
ll n,m,c[LQ],cc[LQ],len,cjkl,cjkr,cjkans,num[LQ],ans[N],bl[N],now,tot;
struct qest{ll l,r,id,tim;}q[N];
struct chan{ll p,nc,oc;}cg[N]; inline ll read()
{
char ch=getchar();ll x=;bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline bool readch()
{
char ch=getchar();
while(ch!='Q' && ch!='R')ch=getchar();
return ch=='Q';
}
inline bool cmp(qest gold,qest genius)
{return bl[gold.l]==bl[genius.l]?bl[gold.r]==bl[genius.r]?gold.tim<genius.tim:bl[gold.r]<bl[genius.r]:bl[gold.l]<bl[genius.l];}
inline ll update(ll col,ll data){num[col]+=data;if(data> && num[col]==)++cjkans;if(data< && num[col]==)--cjkans;}
inline void change(ll x,ll y){if(x>=cjkl && x<=cjkr)update(c[x],-),update(y,);c[x]=y;} int main()
{
n=read();m=read();len=pow(n,0.66666);rp(i,,n)bl[i]=((i+)/len)+;
rp(i,,n)c[i]=read(),cc[i]=c[i];
rp(i,,m)
{
bool op=readch();
if(op)q[i-tot].l=read(),q[i-tot].r=read(),q[i-tot].id=i-tot,q[i-tot].tim=tot;
else cg[++tot].p=read(),cg[tot].nc=read(),cg[tot].oc=cc[cg[tot].p],cc[cg[tot].p]=cg[tot].nc;
}
sort(q+,q++m-tot,cmp);cjkl=cjkr=q[].l;num[c[q[].l]]=;cjkans=;
rp(i,,m-tot)
{
// printf("i=%lld QAQ id=%lld tim=%lld now=%lld\n",i,q[i].id,q[i].tim,now);
while(now<q[i].tim)change(cg[now+].p,cg[now+].nc),++now;
while(now>q[i].tim)change(cg[now].p,cg[now].oc),--now;
// rp(i,1,n)printf("%lld ",c[i]);printf("\n");
while(cjkl<q[i].l)update(c[cjkl],-),++cjkl;
while(cjkl>q[i].l)update(c[cjkl-],),--cjkl;
while(cjkr<q[i].r)update(c[cjkr+],),++cjkr;
while(cjkr>q[i].r)update(c[cjkr],-),--cjkr;
ans[q[i].id]=cjkans;
}
rp(i,,m-tot)printf("%lld\n",ans[i]);
return ;
}

洛谷P1903 数颜色 [国家集训队] 莫队的更多相关文章

  1. 题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】

    对于不会树套树.主席树的本蒟蒻,还是老老实实的用莫队做吧.... 其实这题跟普通莫队差不了多远,无非就是有了一个时间,当我们按正常流程排完序后,按照基本的莫队来,做莫队时每次循环对于这一次操作,我们在 ...

  2. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  3. [bzoj2120] [洛谷P1903] 数颜色

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

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

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

  5. COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)

    题目链接 COGS BZOJ2120 洛谷P1903 /* Add和Subd函数中的vis不能直接设为=1或=0 比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1 ...

  6. P1903 [国家集训队]数颜色 (带修改莫队)

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

  7. P1903 [国家集训队]数颜色 带修改莫队板子

    大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...

  8. 【洛谷】1494:[国家集训队]小Z的袜子【莫队】

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

  9. 【BZOJ 2120】【国家集训队 2011】【数颜色】(莫队)

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

随机推荐

  1. 据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  2. N76E003之IAP

    修改FLASH数据通常需要很长时间,不像RAM那样可以实时操作.而且擦除.编程或读取FLASH数据需要遵循相当复杂的时序步骤.N76E003提供方便FALSH编程方式,可以帮助用户通过IAP方式,重新 ...

  3. QT显示中文 连接上文

    1.首先是建立Linux开发环境1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-227 ...

  4. Android学习之Handler消息

    Android系统规定,一些耗时的操作不能放在UI线程中去执行,这样会报一个ANR错误.所以为了避免该问题,我们需要开启一个新的线程去执行一些耗时操作:开启新的线程,将耗时的操作在新线程里面去执行, ...

  5. Excel 2010 得到当天的日期/得到一年中的第几周/得到当前一周中的星期几

    =TODAY() ="第"&WEEKNUM(TODAY())&"周" =TEXT(TODAY(),"aaaa") Ctrl ...

  6. ESlint全局变量报错

    场景: 在main.js下申明了全局变量: /* eslint no-undef: "error" */ window.vm = new Vue({ el: '#app', rou ...

  7. 题目1008:最短路径问题(最短路径问题dijkstra算法)

    题目链接:http://ac.jobdu.com/problem.php?pid=1008 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  8. sencha touch list 批量选择扩展(2013-7-29)

    扩展js代码 /* *list多选扩展 */ Ext.define('ux.SimpleList', { alternateClassName: 'simpleList', extend: 'Ext. ...

  9. 3944: Sum[杜教筛]

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3471  Solved: 946[Submit][Status][Discuss] ...

  10. 跟bWAPP学WEB安全(PHP代码)--OS命令注入

    背景 这是温故知新的一个系列,也是重新拾起WEB安全的一个系列,同时希望能稍微有点对初学者的帮助.第一篇先来讲讲OS命令注入 bWAPP里面有两个页面也就是两个漏洞,来验证OS命令注入.一个是有回显的 ...