当前位置: 首页 > news >正文

[题解] Educational Codeforces Round 168 (Rated for Div. 2) E - level up

链接

思路 1

注意到在 k ∈ [ 1 , n ] k \in [1,n] k[1,n] 可以得到的最高等级分别为: n , n 2 , n 3 . . . . . n n n,\frac{n}{2},\frac{n}{3}.....\frac{n}{n} n,2n,3n.....nn, 总的个数是一个调和级数, s u m = n ∗ ln ⁡ n sum=n*\ln n sum=nlnn, 完全可以处理出每个 k 下, 每一个等级时玩家对应的在哪一段.

vector<vector<pair<int, int>>>f(n + 1); //f[k,{i,j}] 对于 k,升到 i level 需要的最少长度 j.

用树状数组实时维护出当前队列内大于等于当前玩家等级的怪物的区间数量( 同权值线段树的用法 ), 注意 check 时要减去在当前位置前的等级高于等于玩家的怪物(now = -ask(l);):

int tr[200010];
void upd(int x, int val) {
    for (; x <= n; x += x & -x)tr[x] += val;
}
int ask(int x) {
    int ans = 0;
    for (; x; x -= x & -x)ans += tr[x];
    return ans;
}
int select(int l, int k, int &now) {
    now = -ask(l);
    int x = 0;
    for (int i = 1 << (int)log2(n); i; i /= 2) {
        if (x + i <= n && now + tr[x + i] <= k) {
            x += i;
            now += tr[x];
        }
    }
    return x;
}
  cin >> n >> q;
  vector<int>a(n + 1);
  vector<vector<int>>pos(200010); // i 的位置
  for (int i = 1; i <= n; ++i) {
      cin >> a[i];
      upd(i, 1);
      pos[a[i]].emplace_back(i);
  }

  vector<vector<pair<int, int>>>f(n + 1); //f[k,{i,j}] 对于 k,升到 i level 需要的最少长度 j.
  for (int i = 1; i <= n; ++i) {
      f[i].emplace_back(1, 0);
  }

  for (int level = 2; level <= n; ++level) {
      for (int k = 1; k * (level - 1) <= n; ++k) {
          int now = 0;
          int p = select(f[k].back().second, k, now);
          if (now < k)p++;
          f[k].emplace_back(level, p);
      }
      for (auto c : pos[level - 1]) {
          upd(c, -1);
      }
  }

处理出来 f[] 后, 对于每个输入, 只需要二分对应的 f[a[i]], 找到玩家达到 a [ i ] + 1 a[i]+1 a[i]+1 等级的最早位置, 小于 i i i 的话, 玩家到达 i i i 时等级就已经大于 a [ i ] a[i] a[i] 了, 这个怪就会逃跑.

 while (q--) {
     int i, x;
     cin >> i >> x;
     auto p = upper_bound(f[x].begin(), f[x].end(), pair(a[i], LLONG_MAX));
     string ans;
     if (p == f[x].end())ans = "Yes";
     else {
         if (p->second >= i)ans = "Yes";
         else ans = "No";
     }
     cout << ans << endl;
 }

思路 2

考虑根号分治.

待补充…

相关文章:

  • pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9
  • 【Linux篇】深入理解文件系统:从基础概念到 ext2 文件系统的应用与解析
  • 深度学习(第一集)
  • 5.1、深度剖析 docker run 命令:原理阐释与数据持久化实践探究
  • vp 2023 icpc 合肥 解题补题记录 [F E J G]
  • 什么是 React Router?如何使用?
  • 7.渐入佳境 -- 优雅的断开套接字连接
  • [Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL
  • 具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航
  • vue3 ts 自定义指令 app.directive
  • 5G网络下客户端数据业务掉线频繁
  • git工具
  • Mysql为什么有时候会选错索引
  • IE之路专题10.OSFP专题
  • python操作mongodb
  • 论文阅读:Invertible Grayscale
  • 【maxENT】最大熵模型(Maximum Entropy Model)介绍与使用(maxENT软件)
  • Python基础语法速通(自用笔记)
  • 01新手村
  • QML布局关于【Row】和【RowLayout】有何异同
  • 重庆荣昌出圈背后:把网络流量变成经济发展的增量
  • 中俄就应对美加征所谓“对等关税”等问题进行深入交流
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • 股价两天涨超30%,中航成飞:不存在应披露而未披露的重大事项
  • 东莞“超级”音乐节五一出圈背后:文旅热力何以澎湃经济脉动
  • 小米回应SU7Ultra排位模式限制车辆动力:暂停推送更新