【bzoj 2120】维护队列【bzoj 2453】数颜色 双倍经验!!!
2016-10-30 00:00
423 查看
bzoj难得的双倍经验
QAQ
卡了我好久……
233333
分块
对于每个元素,我记录pre[i] = 上个颜色与i相同的位置
然后就和教主的魔法那题一样了23333333
如果
嗯还算好理解
QAQ一眼正解调一天系列23333333
因为询问很少
所以我可以暴力修改……
太暴力了……
23333333
自己看喽~
QAQ
卡了我好久……
233333
分块
对于每个元素,我记录pre[i] = 上个颜色与i相同的位置
然后就和教主的魔法那题一样了23333333
如果
pre[i] < l则ans++
嗯还算好理解
QAQ一眼正解调一天系列23333333
因为询问很少
所以我可以暴力修改……
太暴力了……
23333333
自己看喽~
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <cctype> #define KILL puts("haha"); using namespace std; const int MAXN = 10000 + 5; const int MAXC = 1e6 + 5; int n,m,M; int col[MAXN],so[MAXN]; int pre[MAXN],last[MAXC]; void reset(int x) { int l = min(n,x * M),r = min(n,x * M + M); for(int i = l;i < r;i ++) so[i] = pre[i]; sort(so + l,so + r); return; } void make_pre() { for(int i = 0;i < n;i ++) last[col[i]] = -1; for(int i = 0;i < n;i ++) { so[i] = pre[i] = last[col[i]]; last[col[i]] = i; } for(int i = 0;i <= M;i ++) sort(so + min(n,i * M),so + min(n,i * M + M)); return; } void init() { M = sqrt(n) + 1; make_pre(); return; } int ask(int x,int y) { int l = x,r = y; int ans = 0; while(l % M && l < r) ans += (pre[l] < x),l ++; while(r % M && r > l) ans += (pre[r] < x),r --; ans += (pre[r] < x); while(l < r) { ans += lower_bound(so + l,so + min(n,l + M),x) - (so + l); l += M; } return ans; } void change(int x,int y) { col[x] = y; for(int i = 0;i < n;i ++) last[col[i]] = -1; for(int i = 0;i < n;i ++) { int t = pre[i]; pre[i] = last[col[i]]; if(t != pre[i]) reset(i / M); last[col[i]] = i; } return; } void scanf(char &c) { c = getchar(); while(!isalpha(c)) c = getchar(); return; } char q; int l,r; int main() { scanf("%d %d",&n,&m); for(int i = 0;i < n;i ++) scanf("%d",&col[i]); init(); for(int i = 1;i <= m;i ++) { scanf(q); switch(q) { case 'Q':scanf("%d %d",&l,&r);printf("%d\n",ask(l - 1,r - 1));break; case 'R':scanf("%d %d",&l,&r);change(l - 1,r);break; } } return 0; }
相关文章推荐
- BZOJ 2120: 数颜色&&2453: 维护队列【双倍经验】
- 【bzoj 2120】维护队列【bzoj 2453】数颜色 双倍经验!!!
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
- bzoj2453 维护队列 & bzoj2120 数颜色 (带修改莫队)
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
- 【BZOJ】2453: 维护队列【BZOJ】2120: 数颜色 二分+分块(暴力能A)
- BZOJ 2120: 数颜色 && 2453: 维护队列 【带修莫队版题【也可以学黄学长分块
- BZOJ2453: 维护队列&2120: 数颜色
- [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)
- 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
- BZOJ 2120: 数颜色/BZOJ 2453: 维护队列 带修改莫队
- 【BZOJ】【2120】数颜色 & 【2453】维护队列
- BZOJ 2453: 维护队列&&BZOJ 2120 数颜色 分块
- [树状数组套权值线段树 || 分块] BZOJ 2120 数颜色 & BZOJ 2453 维护队列
- BZOJ[2120]数颜色/BZOJ[2453]维护队列 分块
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
- 2120: 数颜色/2453: 维护队列
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
- BZOJ2453维护队列&&BZOJ2120数颜色