博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
阅读量:5782 次
发布时间:2019-06-18

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

题意

一个长为 n 的序列 a。
有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。
注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,
比如三个区间是 [1,2,2,3,3,3,3] ,  [1,2,2,3,3,3,3] 与  [1,1,2,3,3],就一起扔掉了 1 个 1,1 个 2,2 个 3。

Sol

设$cnt[i]$表示第$i$个数在询问区间中的出现次数

那么第$i$个询问的答案为$r1 - l1 + r2 - l2 + r3 - l3 + 3 - min(cnt1[x], cnt2[x], cnt3[x])$

后面的那一坨可以用莫队处理

具体做法是对于每个询问维护一个bitset

将所有数离散化之后维护出每个数的出现次数即可

但是这样显然是会超空间的,于是我们把每25000个询问一起做就可以了

#include
#include
#include
#include
#include
#include
#define LL long long// #define int long long using namespace std;const int MAXN = 1e5 + 10, B = 25000;inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f;}int N, M;int a[MAXN], date[MAXN], L[MAXN][5], R[MAXN][5], belong[MAXN], base, cnt = 0, flag[MAXN], tim[MAXN], ans[MAXN];struct Query { int l, r, opt, id; bool operator < (const Query &rhs) const { return belong[l] == belong[rhs.l] ? belong[r] < belong[rhs.r] : belong[l] < belong[rhs.l]; }}Q[MAXN * 3 + 1];bitset
bit[B + 50], now;void Add(int x) { tim[a[x]]++; now.set(a[x] + tim[a[x]] - 1);}void Delet(int x) { now.reset(a[x] + tim[a[x]] - 1); tim[a[x]]--;}void solve(int ll, int rr) { memset(flag, 0, sizeof(flag)); memset(tim, 0, sizeof(tim)); memset(ans, 0, sizeof(ans)); now.reset(); for(int i = 0; i <= B; i++) bit[i].reset(); cnt = 0; for(int ti = ll; ti <= rr; ti++) { for(int i = 1; i <= 3; i++) Q[++cnt] = (Query){L[ti][i], R[ti][i], i, ti - ll + 1}, ans[ti - ll + 1] += (R[ti][i] - L[ti][i] + 1); } sort(Q + 1, Q + cnt + 1); int l = 1, r = 0; for(int i = 1; i <= cnt; i++) { while(l > Q[i].l) Add(--l); while(r < Q[i].r) Add(++r); while(l < Q[i].l) Delet(l++); while(r > Q[i].r) Delet(r--); if(!flag[Q[i].id]) bit[Q[i].id] = now, flag[Q[i].id] = 1; else bit[Q[i].id] &= now; } // sort(Q + 1, Q + cnt + 1, comp); for(int i = ll; i <= rr; i++) printf("%d\n", ans[i - ll + 1] - bit[i - ll + 1].count() * 3);}main() {/// freopen("xp1.in", "r", stdin);// freopen("ans.out", "w", stdout); N = read(); M = read(); base = sqrt(N); for(int i = 1; i <= N; i++) a[i] = read(), date[i] = a[i], belong[i] = (i - 1) / base + 1; sort(date + 1, date + N + 1); for(int i = 1; i <= N; i++) a[i] = lower_bound(date + 1, date + N + 1, a[i]) - date; for(int i = 1; i <= M; i++) { //L1[i] = read(); R1[i] = read(); L2[i] = read(); R2[i] = read(); L3[i] = read(); R3[i] = read(); for(int j = 1; j <= 3; j++) L[i][j] = read(), R[i][j] = read(); } for(int i = 1; i <= N; i += B + 1) solve(i, min(i + B, M)); return 0;}/**/

转载地址:http://oqcyx.baihongyu.com/

你可能感兴趣的文章
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
linux-友好显示文件大小
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
【转】二叉树的非递归遍历
查看>>