首页 > 其他分享 >UOJ #710. 【北大集训2021】魔塔 OL

UOJ #710. 【北大集训2021】魔塔 OL

时间:2024-04-06 20:56:11浏览次数:25  
标签:std OL int 魔塔 kMaxN 710 leq 怪物

Description

[北大集训 2021] 魔塔 OL

题目背景

CTT2021 D1T2

题目描述

比特游戏公司最近发布了一款新游戏《魔塔 Online》,玩家可以操控勇士在游戏世界中与怪物进行搏斗。在游戏发布之初,魔塔里没有任何怪物,接下来将依次发生 \(q\) 个事件,每个事件是以下三种之一:

  • + x y z a b:表示游戏发布了新版本,在游戏中新增了一只怪物。如果这是第一只新增的怪物,那么它的编号为 \(1\);否则它的编号为最后一只新增的怪物的编号 \(+1\)。这只怪物位于魔塔的第 \(x\) 层,它的等级为 \(y\) 级,它的难度为 \(z\)。如果玩家选择击杀这只怪物,那么需要消耗 \(a\) 点血量,在击杀成功后,玩家将得到一支可以恢复 \(b\) 点血量的药剂并立即使用。
  • - k:表示游戏发布了新版本,编号为 \(k\) 的怪物由于平衡性问题下架,它将不会出现在魔塔中。请注意:下架的怪物仍然保留它们的编号,未来新增的怪物不会复用被下架怪物的编号。
  • ? g l d:表示一个询问。某玩家希望击杀魔塔前 \(g\) 层中所有等级不超过 \(l\) 且难度不超过 \(d\) 的怪物。玩家可以按照任意顺序去击杀这些怪物,登上新的一层不需要杀光当前层的所有怪物,且作战过程中不会受到别的怪物的干扰。你的任务是帮助该玩家计算出征前勇士的血量最少是多少。如果某个时刻勇士的血量是负数,那么游戏结束,你一定要防止这种情况的发生。

请写一个程序,依次回答每个询问。注意:每个询问只是玩家的一个思考,不会真正击杀任何一只怪物。

输入数据保证 \(1\leq q\leq 150\,000\),怪物总数不超过 \(50\,000\),询问数量不超过 \(50\,000\)。

对于新增怪物操作,保证 \(1\leq x,y,z\leq 10\,000\),且 \(0\leq a,b\leq 10^9\)。

对于下架怪物操作,保证操作合法,且每只怪物不会被重复下架。

对于询问,保证 \(1\leq g,l,d\leq 10\,000\)。

Solution

考虑怎么单次 \(O(n)\) 做这个事情。

容易发现打完怪物后能回血的一定要放前面,且回血的怪物内部一定是按照 \(a\) 从小到大排序,不回血的怪物按照 \(b\) 从大到小排序,答案就是前缀最小值的相反数。

显然这个东西加上动态三维偏序用 polylog 算法一定过不了,于是考虑优化 \(O(n^2)\)。

先把所有的怪物拿出来排好序,设有 \(n\) 个,询问次数为 \(m\),则可以用一个 bitset 维护每一维前缀的怪物编号,把三维的前缀与起来就可以得到三维偏序的怪物。

但是这样显然过不了,因为每次更新要改变每维的一个后缀。

考虑分块,设每个块的大小为 \(B\),每次对于一个 \(B\) 去做上面那个暴力,计算这个块对答案的贡献。

则单次复杂度为 \(O\left(2^B(n+m+V)\right)\),总复杂度为 \(O\left(\frac{n}{B}\cdot 2^B(n+m+V)\right)\),当 \(B=\log n\) 时取到最小值 \(O\left(\frac{n(n+m+V)}{\log n}\right)\)。

因此时间复杂度:\(O\left(\frac{n(n+m+V)}{\log n}\right)\)。

Code

#include <bits/stdc++.h>

// #define int int64_t

const int kMaxN = 5e4 + 5, kMaxV = 1e4 + 5, kMaxQ = 1.5e5 + 5;

struct Node {
  int x, y, z, a, b, l, r;
} a[kMaxN];

int n, m, q, b;
int x[kMaxN], y[kMaxN], z[kMaxN], t[kMaxN];
int64_t sum[kMaxN], ans[kMaxN];

bool cmp(Node a, Node b) {
  bool fl1 = (a.a > a.b), fl2 = (b.a > b.b);
  if (fl1 != fl2) return fl1 < fl2;
  else if (fl1 == 0) return a.a < b.a;
  else return a.b > b.b;
}

void solve(int l, int r) {
  static int s[kMaxV][3];
  static int64_t sm[kMaxN], mi[kMaxN];
  memset(s, 0, sizeof(s));
  std::vector<std::pair<int, int>> vec;
  for (int i = l; i <= r; ++i) {
    vec.emplace_back(a[i].l, (1 << (i - l)));
    vec.emplace_back(a[i].r, (1 << (i - l)));
    s[a[i].x][0] |= (1 << (i - l));
    s[a[i].y][1] |= (1 << (i - l));
    s[a[i].z][2] |= (1 << (i - l));
  }
  for (int s = 1; s < (1 << (r - l + 1)); ++s) {
    int i = 31 - __builtin_clz(s) + l, t = s ^ (1 << (i - l));
    mi[s] = std::min(mi[t], sm[t] - a[i].a);
    sm[s] = sm[t] - a[i].a + a[i].b;
  }
  for (int i = 1; i < kMaxV; ++i) {
    s[i][0] |= s[i - 1][0];
    s[i][1] |= s[i - 1][1];
    s[i][2] |= s[i - 1][2];
  }
  std::sort(vec.begin(), vec.end());
  int p = 0, now = 0;
  for (int i = 1; i <= m; ++i) {
    for (; p < vec.size() && vec[p].first <= t[i]; ++p)
      now ^= vec[p].second;
    int msk = now & s[x[i]][0] & s[y[i]][1] & s[z[i]][2];
    ans[i] = std::min(ans[i], sum[i] + mi[msk]);
    sum[i] += sm[msk];
  }
}

void dickdreamer() {
  std::cin >> q;
  for (int i = 1; i <= q; ++i) {
    std::string op;
    std::cin >> op;
    if (op[0] == '+') {
      ++n;
      std::cin >> a[n].x >> a[n].y >> a[n].z >> a[n].a >> a[n].b;
      a[n].l = i, a[n].r = q + 1;
    } else if (op[0] == '-') {
      int k;
      std::cin >> k;
      a[k].r = i;
    } else {
      ++m;
      std::cin >> x[m] >> y[m] >> z[m];
      t[m] = i;
    }
  }
  std::sort(a + 1, a + 1 + n, cmp);
  b = std::max(1, std::__lg(n));
  for (int i = 1; i <= n; i += b) solve(i, std::min(i + b - 1, n));    
  for (int i = 1; i <= m; ++i) std::cout << -ans[i] << '\n';
}

int32_t main() {
#ifdef ORZXKR
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
  int T = 1;
  // std::cin >> T;
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:std,OL,int,魔塔,kMaxN,710,leq,怪物
From: https://www.cnblogs.com/Scarab/p/18117911

相关文章

  • 基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查
    摘要        本文基于Python技术,搭建了YOLOv5s深度学习模型,并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下:    (1)调研了移动端垃圾分类应用软件动态,并分析其优劣势;分析了深度学习在垃圾分类领域的相关应用,着重研究了YOLO系列的工作原......
  • 【漏洞复现】畅捷通T+ KeyInfoList.aspx SQL注入漏洞
                         免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使......
  • P10245 Swimming Pool题解
    P10245SwimmingPool题意给你四条边\(abcd\),求这四条边是否可以组成梯形。思路这显然是一道简单的普通数学题。判断是否能构成梯形只需看四条边是否能满足,上底减下底的绝对值小于两腰之和且大于两腰之差。证明过程如图,\(AB=a\),\(BC=b\),\(CD=c\),\(AD=d\)。过点\(D\)......
  • P6680 [CCO2019] Marshmallow Molecules 题解
    P6680题意一个\(n\)点\(m\)边的图,图无重边,无自环。满足这样一条性质:如果三边互不相等,则三边可以构成三角形。思路思路简单,用集合的思想来做。引用一下K0stlin大佬的性质:题目中的操作等价于将一个点大于某个儿子的儿子们赋给这个儿子(这里的儿子表示这个点有出边连向的......
  • Volatile
    目录介绍Volatile保证可见性的原理可见性问题原理Volatile保证有序性的原理指令重排内存屏障如何解决volatile不保证原子性问题?由Volatile解决的单例模式中双重检索问题(DCL)介绍volatile是Java虚拟机提供的轻量级的同步机制(三大特性)保证可见性保证有序性......
  • YOLOv8 深度解析!一文看懂,快速上手实操(附实践代码)
    https://zhuanlan.zhihu.com/p/679179913 计算机视觉研究院主要涉及AI研究和落地实践,主要致力于目标检测、目标跟踪、图像分割、OCR、模型量化、模型部署等研究方向。研究院每日分享最新的论文算法新框架,提供论文一键下载,并分享实战项目。研究院主要着重”技术研究“和“实践落......
  • yolov8系列[四]-yolov8模型部署
    https://blog.csdn.net/qq122716072/article/details/130930158?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-130930158-blog-130902253.235%5Ev43%5Epc_blog_bottom_relevance_base7&......
  • YOLOv8原理深度解读,超级详细【未完待续】
    https://blog.csdn.net/Albert233333/article/details/130044349?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-130044349-blog-130930158.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.2&ut......
  • YOLOv8 深度详解!一文看懂,快速上手
    https://zhuanlan.zhihu.com/p/598566644?utm_id=0&wd=&eqid=a1d56281000fe8920000000464910f3a YOLOv8是ultralytics公司在2023年1月10号开源的YOLOv5的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。考虑到......
  • Deepstream6.3部署YOLOv8
    https://blog.csdn.net/weixin_51230935/article/details/133296929?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-133296929-blog-135528185.235%5Ev43%5Epc_blog_bottom_relevance_base7&......