洛谷1903 带修莫队
/*洛谷1903*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
const int ding=5e5+5;
int mp[ding],block[ding],l=1,r=0,vis[1000005],ans,sum[ding],no[ding];
struct Alter{int id,num,old,nnew;
}alte[ding];
struct Query{int id,notime,L,R;
}que[ding];
bool cmp(Query a,Query b){if(block[a.L]==block[b.L]){if(block[a.R]==block[b.R]){return a.notime<b.notime;}return a.R<b.R;}return a.L<b.L;
}
bool cmp2(Query a,Query b){return a.id<b.id;
}
void revise(int x,int cnt){if(cnt==1){if(vis[x]==0){ans++;}vis[x]++;}else {if(vis[x]==1){ans--;}vis[x]--;}
}
void doit(int x,int y){if(l<=x&&x<=r){revise(mp[x],-1);revise(y,1);}mp[x]=y;
}int main()
{std::ios::sync_with_stdio(false);int n,m;scanf("%d %d",&n,&m);memset(vis,0,sizeof(vis)); int i,t=1,tt=1,L,R,T=1;char cc[3];const int blo=floor(pow(n,0.666666));//玄学优化 for(i=1;i<=n;i++){scanf("%d",&mp[i]); no[i]=mp[i];block[i]=(i-1)/blo+1;}
// cout<<"mp "<<mp[61]<<" "<<mp[62]<<" "<<mp[63]<<endl; for(i=1;i<=m;i++){scanf("%s %d %d",cc,&L,&R);if(cc[0]=='R') {alte[t++]=(Alter){t-1,L,no[L],R};no[L]=R;//这里要注意一下,每次都要记住 }else{que[tt++]=(Query){tt-1,t,L,R};}}sort(que+1,que+tt,cmp);for(i=1;i<tt;i++){//看下当前的时间线是否已经全部修改了//然后进行相应的往后往前修改 while(T<que[i].notime){doit(alte[T].num,alte[T].nnew);T++;}while(T>que[i].notime){T--;doit(alte[T].num,alte[T].old);}while(l<que[i].L)revise(mp[l++],-1);while(l>que[i].L)revise(mp[--l],1);while(r<que[i].R)revise(mp[++r],1);while(r>que[i].R)revise(mp[r--],-1);sum[que[i].id]=ans;}sort(que+1,que+tt,cmp2);for(i=1;i<tt;i++){printf("%d\n",sum[i]);}return 0;
}
洛谷1903 带修莫队相关推荐
- 莫队和带修莫队 学习笔记
哎,很纠结,我刚学这个东西,感觉好像本身自己理解得就不深刻,所以好像不知道该怎么写这个学习笔记了,估计是我思路最凌乱,语言最没逻辑的一篇学习笔记吧.(如果看到这儿觉得作者会坑就关掉吧..) 好,我来尝 ...
- 牛客练习赛85 数学家的迷题 (带修莫队/线段树)
题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...
- [国家集训队]数颜色 / 维护队列 (带修莫队模板题)
题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...
- 莫队+带修莫队模板与总结
以下总结参考了许多大佬们的博客,开篇先(大佬)% 莫队的入门题目主要为莫队和带修莫队在,这里就先在这里总结一下这两类题目的一些属性. 我认为莫队本质是一种比较优化的暴力查找法.在通过分块操作后把复杂度 ...
- HDU - 6610 Game(带修莫队)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a,sum 为数列 a 的前缀异或和,再给出 m 次操作,每次操作分为两种类型: 1 l r:询问 sum 在区间 [ l , r ] 内有多 ...
- LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)
LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...
- 牛客挑战赛48E-速度即转发【带修莫队,分块】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列,mmm个操作. 给出l,r,kl,r,kl,r,k,求一个 ...
- 分治 —— 莫队算法 —— 带修莫队
[概述] 普通莫队由于强制离线是不能修改的,但对于强制在线的题,可以在普通莫队的基础上强行加上一维时间轴 time,表示这次操作的时间,即在每个询问前已经完成了多少次修改. 简单来说,就是将询问 [l ...
- 【BZOJ4129】Haruna’s Breakfast,树上带修莫队+权值分块求mex
Time:2016.09.08 Author:xiaoyimi 转载注明出处谢谢 思路: 这道题相当于把昨天学的树上莫队和带修莫队融合了一下,顺便加了一个mex(未出现的最小自然数) 那么主要问题就是 ...
最新文章
- Java中HashMap和TreeMap的区别深入理解
- webpack笔记_(1)_webpack 安装
- 大数据商业智能的十大戒律
- python多线程实现同时下载_Python实现多线程下载
- Cisco Packet Tracer思科模拟器中OSPF动态路由配置
- Linux中tar压缩命令详解
- 简要介绍弱监督学习(by 周志华)
- 常用编码说明-GB2312
- SDUT 1160 某年某月的天数
- 怎么查看自己电脑的iP地址,3个方法推荐
- 迅雷欲缔造互联网“视频梦工厂”
- 解剖caffe mode:Blobs, Layers和Nets
- 测试你适合的发型软件叫什么,有没有测试发型的app 测试自己适合什么发型
- 2021斯坦福大学计算机系完整课程列表
- DebianLinux下如何安装软件(转)
- 计算机网络——域名系统DNS
- AI的下一主战场 —— 手机与物联网终端
- Axure RP 9.0.0.3719 更新日志 授权码
- 接受dtmb地面波数字信号,免费看电视
- Java8 lambda表达式