首页 > 其他分享 >【倍增】Rigged Games

【倍增】Rigged Games

时间:2024-08-12 20:05:19浏览次数:13  
标签:int sum ++ jump sc Games Rigged 比分 倍增

题意

两队打比赛,大比分 2b − 1 赢,小比分 2a − 1 赢。
给定的长度为 n 的串,两队比赛的每个小分结果是这个串的循环重复。
问从该串的每个位置开始,最终谁会赢得整个比赛。

思路

倍增。

首先对于每个位置,计算出它 \(2a-1\) 局后的比分的比分终点的位置。

然后采用倍增,即假设我们要从 \(j\) 跳 \(2^i\) 步,可以先从 \(j\) 跳 \(2^{i-1}\) 步,然后从跳 \(2^{i-1}\) 的终点也就是 \(jump_{2^{i-1},j}\) 再跳 \(2^{i-1}\) 步,即 \(jump_{i,j} = jump_{i-1,jump_{i-1},j}\) 。

同理,从 \(j\) 跳 \(2^i\) 步的得分我们也要累计起来,但这个时候要统计两部分的 a 小局比分,即 \(j\sim j+2^{i-1}\) 和 \(j+2^{i-1}\sim j+2^i\) 的。

最终判断的时候每次从 \(2^{17}\) 往后跳到凑出 \(2b-1\) 的比分即可。(\(2^{17}>1e5\))

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
   ios::sync_with_stdio(false);
   cin.tie(nullptr);

   int n, a, b;
   cin >> n >> a >> b;

   vector jump(18, vector<int>(n));
   vector sum(18, vector<int>(n));

   string s;
   cin >> s;

   int sc[2] {}, r = 0;
   for (int i = 0; i < n; i ++) {
      while (sc[1] < a && sc[0] < a) {
         sc[s[r] - '0']++;
         r = (r + 1) % n;
      }
      jump[0][i] = r;
      sum[0][i] = sc[1] > sc[0];
      sc[s[i] - '0']--;
   }

   for (int i = 1; i < 18; i ++) {
      for (int j = 0; j < n; j ++) {
         jump[i][j] = jump[i - 1][jump[i - 1][j]];
         sum[i][j] = sum[i - 1][j] + sum[i - 1][jump[i - 1][j]];
      }
   }

   int pos, res, ans;
   for (int i = 0; i < n; i ++) {
      pos = i, res = 0, ans = 0;
      for (int j = 17; j >= 0; j --) {
         if (res + (1 << j) <= 2 * b - 1) {
            res += 1 << j;
            ans += sum[j][pos];
            pos = jump[j][pos];
         }
      }
      cout << (ans >= b);
   }

   return 0;
}

标签:int,sum,++,jump,sc,Games,Rigged,比分,倍增
From: https://www.cnblogs.com/Kescholar/p/18355646

相关文章

  • 【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain
    【单调栈+倍增】[P7167[eJOI2020Day1]Fountain思路用单调栈处理每个圆盘溢出后流到的第一个位置,然后倍增优化。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]
    跑路:绝佳倍增好题,思路是化\(2^k\)为\(1\),倍增起预处理作用。最近不知道是撞了什么运,前一脚看的是绿题,写完之后交一发,发现直接被lxl升蓝了,血赚。思路:Floyd首先观察到每次走\(2^k\)的代价为\(1\),我们可以预处理出每次走\(2^i\)能到哪些点。但为了让这题的代码更好实......
  • 倍增之ST表
    ST表是什么ST表其实不叫ST表,因为ST中的T已经是table表的意思了ST表适合用来处理RMQ,LCA等经典问题st[i][j]代表区间[i,i+2^j-1]st[i][0]=a[i](初始化)模板题1每天,你们学校有N(1<=N<=50,000)个人按同一序列排队做操.有一天,老师让你找一队连续序列的人来进行比赛......
  • 连接池:Memcached的效率倍增器
    连接池:Memcached的效率倍增器在现代应用架构中,Memcached作为一项关键的缓存技术,其性能直接关系到整个系统的响应速度和扩展能力。Memcached的连接池机制是优化资源使用、提升并发访问效率的重要手段。本文将深入探讨Memcached连接池的工作原理,并展示如何通过代码实现和管理......
  • 【学习笔记】倍增
    【学习笔记】倍增倍增法,顾名思义就是翻倍。它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度。ST表RMQ是RangeMaximum/MinimumQuery的缩写,表示区间最大(最小)值。而ST表是用于解决可重复贡献问题的数据结构。记\(f(l,r)\)为\([l,r]\)这个区间的答案,可重......
  • 2024牛客多校3J Rigged Games
    欢迎来我的博客看这篇题解!Problem在两人竞技比赛中,对于任何正整数\(a\),我们定义\(BO(2a-1)\)如下:两名玩家继续竞争,直到其中一人获胜\(a\)次,那么他赢得整个比赛。\(BO(2a-1)\)最多包含\(2a-1\)小局游戏,最少包含\(a\)小局游戏。现在两个人进行一场DotA2比赛,使用的......
  • 《Epic Games》启动显示找不到xinput1_3.dll怎么处理,Epic游戏平台提示缺失xinput1_3.d
    在通过EpicGames平台尽情畅玩各类精彩游戏的过程中,有部分玩家或许会不幸遭遇“找不到xinput1_3.dll”或者“xinput1_3.dll缺失”这样的错误提示。由此导致游戏无法顺利启动。这类问题的根源在于系统中缺少了一个被称作“xinput1_3.dll”的关键重要动态链接库文件,直接对游戏的......
  • Day 2 - 分治与倍增
    分治的延伸应用应用场景优化合并假设将两个规模\(\frac{n}{2}\)的信息合并为\(n\)的时间复杂度为\(f(n)\),用主定理分析时间复杂度\(T(n)=2\timesT(\frac{n}{2})+f(n)\)。能直观的看出优化程度还是很大的。归并排序中\(f(n)=O(n)\),则\(T(n)=O(n\logn)\)。......
  • 工作效率倍增:最常用的电脑快捷键大全
    文章目录1.Ctrl+A(全选)2.Ctrl+C(复制)3.Ctrl+X(剪切)4.Ctrl+V(粘贴)5.Ctrl+Z(撤销)6.Ctrl+Y(恢复)7.Ctrl+1,2,3...(切换浏览器标签)8.Ctrl+D(添加收藏)9.Ctrl+E(搜索)10.Ctrl+F(查找)11.Ctrl+H(替换、打开“历史”记录)12.Ctrl+G(定位)13.Ctrl+L(定位到地址栏)14.Ctrl+N(新建空白窗口......
  • CF519E A and B and Lecture Rooms(树上倍增 + 分类讨论)
    link一眼看上去没什么思路,手摸一下样例,发现有不同性质的点对求解想法很不一样,考虑先分类讨论看看。从简单的约束到强的约束分类讨论,这样更可做,也更好讨论,比如首先我就想到两点是否重合,然后所求点一定要到两点的距离相等,我就想到路径长度的奇偶性,接着就考虑复杂的深度关系...........