[BZOJ 2120][数颜色][带修改的莫队]
来源:互联网 发布:full node bitcoin 编辑:程序博客网 时间:2024/05/15 12:10
[BZOJ 2120][数颜色][带修改的莫队]
安利大法好,有关莫队算法可以关注这篇文章:
https://zhuanlan.zhihu.com/p/25017840
题目大意:
处理两种询问,第一种是统计区间
询问数和区间长度都<=10000,暴力完全可过……
思路:
和普通莫队同理,分块后用
同时为了保证复杂度,采取的策略是对于每个询问按
代码:
#include <bits/stdc++.h>const int Maxn = 1010000;using namespace std;inline char get(void) { static char buf[1000000], *p1 = buf, *p2 = buf; if (p1 == p2) { p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin); if (p1 == p2) return EOF; } return *p1++;}inline void read(int &x) { x = 0; static char c; bool minus = false; for (; !(c >= '0' && c <= '9'); c = get()) if (c == '-') minus = true; for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = get()); if (minus) x = -x;}inline void read(char &x) { x = get(); while (!(x >= 'A' && x <= 'Z')) x = get();}struct Modify { int x, y, last;} mo[Maxn];int block[Maxn], a[Maxn], last[Maxn];struct Ask { int l, r, id, apart; friend bool operator < (const Ask &a, const Ask &b) { if (block[a.l] == block[b.l]) { if (block[a.r] == block[b.r]) return a.apart < b.apart; else return block[a.r] < block[b.r]; } else return block[a.l] < block[b.l]; }} ask[Maxn];int n, m, B, tot1, tot2, Ans[Maxn], ans, L, R, head, cnt[Maxn];inline void change(int x, int y) { if (x >= L && x <= R) { cnt[a[x]]--; if (!cnt[a[x]]) ans--; a[x] = y; cnt[a[x]]++; if (cnt[a[x]] == 1) ans++; } else a[x] = y;}inline void update(int pos, int type) { int his = cnt[a[pos]]; cnt[a[pos]] += type; if (!his && cnt[a[pos]] == 1) ans++; if (his == 1 && !cnt[a[pos]]) ans--;}int main(void) { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); read(n), read(m); B = sqrt(n); for (int i = 1; i <= n; i++) read(a[i]), last[i] = a[i]; for (int i = 1; i <= n; i++) block[i] = (i - 1) / B + 1; for (int i = 1; i <= m; i++) { char op; read(op); if (op == 'R') { read(mo[++tot1].x); read(mo[tot1].y); mo[tot1].last = last[mo[tot1].x]; last[mo[tot1].x] = mo[tot1].y; } else { read(ask[++tot2].l); read(ask[tot2].r); ask[tot2].id = tot2; ask[tot2].apart = tot1; } } sort(ask + 1, ask + 1 + tot2); L = 1, R = 0; for (int i = 1; i <= tot2; i++) { while (head > ask[i].apart) { change(mo[head].x, mo[head].last); head--; } while (head < ask[i].apart) { ++head; change(mo[head].x, mo[head].y); } while (L < ask[i].l) update(L, -1), L++; while (R > ask[i].r) update(R, -1), R--; while (L > ask[i].l) L--, update(L, 1); while (R < ask[i].r) R++, update(R, 1); Ans[ask[i].id] = ans; } for (int i = 1; i <= tot2; i++) printf("%d\n", Ans[i]); return 0;}
完。
By g1n0st
1 0
- [BZOJ 2120][数颜色][带修改的莫队]
- BZOJ 2120: 数颜色 带修改的莫对算法
- bzoj 2120: 数颜色 带修改莫队算法
- [BZOJ 2120]数颜色:带修改莫队
- bzoj 2120 数颜色 带修改莫队
- bzoj 2120 数颜色 【带修改莫队模板】
- [BZOJ]2120 数颜色 带修改莫队
- bzoj 2120: 数颜色(带修改的莫队算法)
- BZOJ 2120 数颜色——带修改的莫队算法
- BZOJ 2120: 数颜色/BZOJ 2453: 维护队列 带修改莫队
- bzoj 2120 数颜色 待修改的莫队
- 【带修改莫队】BZOJ2120 数颜色
- [BZOJ2120]数颜色{带修改莫队}
- 【bzoj2120: 数颜色】带修改莫队
- BZOJ2120 数颜色 【带修改莫队】
- BSOJ4559:数颜色 带修改莫队算法
- [BZOJ2120][带修改莫队算法]数颜色
- [BZOJ2120]数颜色(带修改莫队)
- [C++] 编程实践之1: Google的C++代码风格1:头文件
- 当你准备自定义view的时候
- c++如何转换将csd::string 转换成浮点数 float
- 【opencv】邻域模版匹配
- 简单的node 服务端 响应get,返回json数据;
- [BZOJ 2120][数颜色][带修改的莫队]
- SwaggerUI ASP.Net WebAPI2
- plsql连接远程oracle(简易客户端)
- [转]咦?真机调试的这款手机竟然不打印 Log 日志!
- JMM浅析
- fatal: Could not read from remote repository.的解决办法
- 多线程编程2/互斥锁
- PAT排名汇总
- swift 3.0 字典与JSON互转