魔塔 OL

题目链接:UOJ 710

题目大意

有一个三维的网格,点有权值 a,b,维护三个操作:
加入一个点,删除一个点, 把某一个 (1,x)(1,y)(1,y) 立方体里面的点拿出来,做一次操作的最小初始值。
操作是你按某个顺序删点,先把你的值减 a,再加上 b,要保证你的数不会小于 0 的最小初始值。

思路

首先考虑给出点集怎么做。
那你不难得到一个贪心:
首先选会让总值增加的 a⩽ba\leqslant ba⩽b,那这其中我们肯定是要求从低到高,所以这些按 aaa 从小到大排。
那接着是 a>ba>ba>b,那减的总数已经确定,那我们肯定是尽可能的维持数大(在过程中),那你选某个数的时候,它的 aaa 是必减的,所以我们可以按 bbb 从大到小排。

那然后贪心看就行,接着看怎么快一点。
我们把所有点重新按这个贪心排序,然后我们考虑四毛子分块。


四毛子分块的想法是,我们选取一个很小的块,然后块内暴力处理出每一种情况的答案,然后跟之前的联系起来。


这里的话,我们就是 2B2^B2B 算出里面每个点在或者不在,对块内做贪心的结果(要记录最后的和以及答案)
然后我们在求出每一维你 1∼x1\sim x1∼x 包含了那些点,那三维的话就是三个点集的交。

但是会有一个小问题没有处理,就是它每个点有一个出现的区间(会删去)
那这个你拿左右两个指针扫,维护这个区间中的点集,然后再跟前面的取并即可。
然后就合并入之前的答案。

BBB 大概取 log⁡\loglog 的位置,用 141414。

然后每次的时间就是 O(n2+nqlog⁡n)O(\dfrac{n^2+nq}{\log n})O(lognn2+nq​)

代码

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define ll long longusing namespace std;const int N = 5e4 + 100;
const int V = 1e4 + 100;
const int B = 14;
struct Monster {int l, r, x, y, z;int a, b;
}a[N];
struct Quest {int x, y, z, tim;
}qs[N];
int n, tot, q, lsts[1 << B], tim;
int xs[N], ys[N], zs[N];
ll sum[1 << B], maxn[1 << B], sums[N], ans[N];
vector <pair <int, int> > Ls, Rs;bool cmp(Monster x, Monster y) {if ((x.a <= x.b) ^ (y.a <= y.b)) return x.a <= x.b;if (x.a <= x.b) return x.a < y.a;else return x.b > y.b;
}void work(int l, int r) {int len = r - l + 1;memset(xs, 0, sizeof(xs)); memset(ys, 0, sizeof(ys)); memset(zs, 0, sizeof(zs));for (int i = l; i <= r; i++) {xs[a[i].x] |= (1 << (i - l));ys[a[i].y] |= (1 << (i - l));zs[a[i].z] |= (1 << (i - l));}for (int i = 1; i < N; i++) xs[i] |= xs[i - 1], ys[i] |= ys[i - 1], zs[i] |= zs[i - 1];for (int i = 1; i < (1 << len); i++) {int id = lsts[i], fr = i ^ (1 << id); id += l;maxn[i] = max(maxn[fr], sum[fr] + a[id].a);sum[i] = sum[fr] + a[id].a - a[id].b;}Ls.clear(); Rs.clear();for (int i = l; i <= r; i++) Ls.push_back(make_pair(a[i].l, i - l)), Rs.push_back(make_pair(a[i].r, i - l));sort(Ls.begin(), Ls.end()); sort(Rs.begin(), Rs.end());int lnum = 0, rnum = 0, suml = 0, sumr = 0;for (int i = 1; i <= q; i++) {while (lnum < len && Ls[lnum].first <= qs[i].tim) {suml |= (1 << Ls[lnum].second); lnum++;}while (rnum < len && Rs[rnum].first <= qs[i].tim) {sumr |= (1 << Rs[rnum].second); rnum++;}int S = xs[qs[i].x] & ys[qs[i].y] & zs[qs[i].z] & (suml ^ sumr);ans[i] = max(ans[i], sums[i] + maxn[S]);sums[i] += sum[S];}
}int main() {for (int i = 1; i < (1 << B); i++) {for (int j = 0; j < B; j++)if ((i >> j) & 1) lsts[i] = j;}scanf("%d", &n);for (int i = 1; i <= n; i++) {char op = getchar(); while (op != '+' && op != '-' && op != '?') op = getchar();if (op == '+') {int x, y, z, A, b; scanf("%d %d %d %d %d", &x, &y, &z, &A, &b);a[++tot] = (Monster){++tim, n, x, y, z, A, b};}if (op == '-') {int k; scanf("%d", &k);a[k].r = ++tim;}if (op == '?') {int x, y, z; scanf("%d %d %d", &x, &y, &z);qs[++q] = (Quest){x, y, z, tim};}}sort(a + 1, a + tot + 1, cmp);for (int i = 1; i <= tot; i += B) {int j = min(tot, i + B - 1);work(i, j);}for (int i = 1; i <= q; i++) printf("%lld\n", ans[i]);return 0;
}

【UOJ 710】魔塔 OL(贪心)(四毛子分块)相关推荐

  1. 【YBT2023寒假Day4 C】樱桃莓莓(交互)(四毛子分块)(线段树)

    樱桃莓莓 题目链接:YBT2023寒假Day4 C 题目大意 有一个黑盒操作满足交换律和结合律,有 n 个数,q 次询问,每次选 m 个下标,你要计算所有不包含那 m 个下标的数进行黑盒操作之后的结果 ...

  2. 斐讯K2刷breed加刷老毛子华硕系统,救砖以及修复弱信号故障

    前言: 斐讯K2(注意不是K2P别混淆)这款路由器,之前因为0元购,应该还有很多人没下车,放在家里吃灰.由于软刷路径已经关闭,本教程将给出方案,为其刷入breed控制台,加刷老毛子华硕系统. 参考此教 ...

  3. openwrt折腾记5 广告屏蔽大师adbyby深度调优(借用老毛子完美数据文件)

    广告屏蔽大师adbyby 深度调优 本文的精进 起始和结局 一.探索试融合试用adbyby规则文件 二.对luci-app-adbyby-plus更新lazy.txt,video.txt文件脚本adb ...

  4. 老毛子固件插件_原地升值?newifi 3 路由器刷入高恪固件教程

    newifi 作为矿机翻车后,价格是一落千丈,但是 newifi 3 的可玩性较强,所以即便挖矿没落了,也还能在个人用户上火起来. 上次有介绍过 newifi 3 怎么进行刷机,刷入不死 breed ...

  5. 华硕老毛子(Padavan)——Ngrok内网穿透解决方案

    基本概念 Ngrok:ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.Ngrok是外国发布的一个开源项目,也有一个公开的运行服务,但被国内墙掉了.国内一 ...

  6. 华硕老毛子(Padavan)——L2TP连接自动重连解决方案

    问题描述 Sep 5 14:31:55 root NetworkManager[932]: xl2tpd[26104]: Maximum retries exceeded for tunnel 339 ...

  7. 华硕老毛子(Padavan)——校园网电信宽带闪讯(NetKeeper)L2TP学校认证解决方案

    基本概念 华硕老毛子:老毛子,顾名思义,这个固件就是俄罗斯人开发的.是华硕衍生出来的系统,做的华硕n56u的固件,然后别人根据源码改出其他mtk7620的固件. 闪讯(NetKeeper) :电信校园 ...

  8. y7000怎么刷电池固件_redmi(红米)AC2100,刷老毛子固件

    根据恩山的大佬教程,一步一步的刷成功了,不得不说比斐讯系的确实麻烦点,先是刷了openwrt,但是发现不好用,又用官方恢复工具还原了,接着刷了老毛子,重启后,哇,还是熟悉的味道,开启160hz,信到固 ...

  9. 老毛子的二级路由,通过无线中继方式设置与主路由在同一网段

    以极路由作为示例root过程各有不同step3开始其他路由器也适用 **Step1: **路由器复位,有线/无线连接路由器进入后台(192.168.199.1/hiwifi.com),设置WiFi联网 ...

  10. 魅族路由器(极速版)刷老毛子(padavad)固件-全网最详细教程

    写在前面: 魅族路由器极速版,想必有一些网友买过,本人也买过,但是因为魅族官方对路由器已经不维护了,固件万年不更新,插件也用不了了,所以我打着尝试得态度查找了相关刷路由器系统得教程,于是还真让我找到了 ...

最新文章

  1. Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)
  2. c++异常Try catch
  3. tomcat6.0+mysql5.0+jdk5.0+myeclipse6.0打造JSP开发平台
  4. java usb 无驱打印_Windows Usb 无驱动打印
  5. Java 程序员必须掌握的 Linux 命令
  6. was supplied but isn‘t a known config
  7. 帆软填报JS不刷新页面排序表格
  8. 大学java web教材_Java工程师必备干货教材 《Java Web开发实战》
  9. Multisim14.0的安装步骤
  10. 实训笔记20190807--数据分析
  11. 计算机组成原理选择题题库
  12. hihocoder 1538
  13. 圣诞之歌:クリスマス タイム和My Baby Grand~ぬくもりが欲しくて~ ZARD
  14. 需求评审会议如何召开
  15. android直播流渲染,Android手机直播之处理技术分析
  16. 中国无线电发射器市场趋势报告、技术动态创新及市场预测
  17. 通过按键精灵实现mc自动钓鱼
  18. 解决Openresty + lua:lua tcp socket read timed out
  19. 最新2015浦东新区初中排名 分为四个档次
  20. HbuilderX恢复文件的方式

热门文章

  1. 六级考研单词之路-三十八
  2. Windows“控制面板”在哪?win10怎么打开控制面板(快捷方法)打开控制面板的多种方法都在这里
  3. DongDong认亲戚
  4. html 旋转木马 轮播,JS实现旋转木马轮播图
  5. Nebula Graph 系列(1) —— 初识 Nebula
  6. linux如何安装qq输入法
  7. html5 监控,基于 HTML5 的 WebGL 3D 智能楼宇监控系统
  8. 支付宝登录java_支付宝开发平台之第三方授权登录与获取用户信息
  9. 刘宇凡:坚持就是写文章的最大技巧
  10. 100句激励自己的英文名言