博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 1903 数颜色 | 分块
阅读量:5299 次
发布时间:2019-06-14

本文共 1966 字,大约阅读时间需要 6 分钟。

数颜色 | 分块

莫队不会啊……

这道题直接分块也能卡过!

这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]。

这样在查询一个区间[l, r]的时候,对于每个区间内的元素,如果pre[i] < l则这个颜色是第一次出现,ans++。

可以分块后把每一块内部的pre[i]都排好序,这样只要二分查找lower_bound(l)就可以知道块内有多少pre[i] < l的元素。

剩下不完整的块只需单独处理。

问题是修改的时候没法修改了,只能暴力把整个数组重构一遍,好在题目中有修改操作较少这条约束,可以卡过。

分块时一定要注意最后一块不完整,需要特判……

跑得贼慢的代码↓

#include 
#include
#include
#include
#include
#define INF 0x3f3f3f3f#define space putchar(' ')#define enter putchar('\n')using namespace std;typedef long long ll;template
bool read(T &x){ char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; else if(c == EOF) return 0; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x; return 1;}template
void write(T x){ if(x < 0) putchar('-'), x = -x; if(x >= 10) write(x / 10); putchar('0' + x % 10);}#define blk(x) ((x - 1) / B + 1)#define st(x) ((x - 1) * B + 1)#define ed(x) (x == blk(n) ? n : (x * B + 1))const int N = 10005, M = 1000005, B = 100;int n, m, a[N], pre[N], spre[N], lst[M], x, y;char op;int query(int x, int y){ int res = 0; if(blk(x) == blk(y)){ for(int i = x; i <= y; i++) if(pre[i] < x) res++; return res; } for(int i = x; i == x || i % B != 1; i++) if(pre[i] < x) res++; for(int i = y; i == y || i % B != 0; i--) if(pre[i] < x) res++; for(int i = blk(x) + 1; i < blk(y); i++) res += lower_bound(spre + st(i), spre + ed(i), x) - (spre + st(i)); return res;}void build(){ memset(lst, 0, sizeof(lst)); for(int i = 1; i <= n; i++) spre[i] = pre[i] = lst[a[i]], lst[a[i]] = i; for(int i = 1; i <= blk(n); i++) sort(spre + st(i), spre + ed(i));}int main(){ read(n), read(m); for(int i = 1; i <= n; i++) read(a[i]); build(); while(m--){ while(op = getchar(), op != 'Q' && op != 'R'); read(x), read(y); if(op == 'Q') write(query(x, y)), enter; else a[x] = y, build(); } return 0;}

转载于:https://www.cnblogs.com/RabbitHu/p/Luogu1903.html

你可能感兴趣的文章
2017系列(序):一系列佳作,喜迎2017
查看>>
Android开发——高斯模糊效果的简单实现
查看>>
今天再次认真整理了浏览器收藏夹
查看>>
Codeforces Round #215 (Div. 2) D题(离散化+hash)
查看>>
C# DES进行加解密
查看>>
sql里面的分页
查看>>
作业10-异常
查看>>
apache伪静态规则及常见规则用法实例
查看>>
移动端(1)
查看>>
json-lib 的maven dependency ( 摘 )
查看>>
POJ2431-Expedition【优先队列+贪心】
查看>>
服务链(Service Chaining,or Service Function Chaining,SFC,功能服务链)
查看>>
php框架
查看>>
winform自动更新程序实现
查看>>
ASP.NET补充
查看>>
虚拟机搭建redis单机版及redis-cluster,使用redis desktop manager和java(eclipse)连接redis过程遇到问题汇总...
查看>>
codevs1174 靶形数独(DLX)
查看>>
ImageView类简介
查看>>
Gridview 重建表头/单击单元格弹出对话框/改变单元格背景色
查看>>
C++下混合编译c语言方法总结
查看>>