首页 > 其他分享 >Solution - Luogu P11393 [JOI Open 2019] 送金

Solution - Luogu P11393 [JOI Open 2019] 送金

时间:2024-12-20 20:42:41浏览次数:4  
标签:le int Luogu bmod Solution 送金 那么 增量 操作

下标默认是在 \(\bmod\ n\) 意义下的。

考虑到如果 \(a_i > b_i\) 那么不可能只操作 \(a_{i - 1}\) 使得 \(a_i\) 合法,因为这只增不减。
于是这说明当 \(a_i > b_i\) 时一定会操作 \(a_i\) 使得 \(a_i\le b_i\)。

但是同时如果 \(b_i - a_i\) 太大了,\(a_{i - 1}\) 就不一定能操作完了。
于是贪心的,当 \(a_i > b_i\) 时,让调整后的 \(b_i - a_i\) 尽量小,就能给后面的步骤留出更多的调整空间。
所以若 \(a_i\bmod 2 = b_i\bmod 2\),则操作 \(a_i\) 使得 \(a_i\leftarrow b_i\);否则操作 \(a_i\) 使得 \(a_i\leftarrow b_i - 1 + 2[b_i = 0]\)(当 \(b_i = 0\) 时,因为需要满足时刻 \(a_i\ge 0\),只能使 \(a_i = 1\))。

根据这个贪心的思想,每一步都在使得 \(a_i\) 能够更接近 \(b_i\)。
所以一直这样操作下去直到无法操作,如果满足 \(\forall i\in [1, n], a_i = b_i\) 则合法,否则不合法。
(可以手玩一下不合法的局面,能发现此时操作任意一个 \(a_i\) 后 \(a_i\) 至少也会 \(-1\),只会变小,之后就肯定不可能变大成 \(b_i\) 了。)

那么接下来考虑快速模拟这个过程了。
首先可以先模拟一圈(\(1\sim n\) 做一次贪心),那么能发现此时的 \(a_i\) 是比较有性质的。

具体来说,\(\forall i\in [2, n]\),要么 \(a_i = 1\) 且 \(b_i = 0\),要么 \(a_i\le b_i\)。
这是因为 \(2\sim n\) 按顺序调整后 \(i - 1\) 没有再次进行操作,所以依然保持原样。
且此时 \(a_1\le 2V\),舍弃掉 \(\bmod\ 2\) 后的余数的损失,考虑距离 \(1\) 为 \(d\) 那么给到 \(a_1\) 的贡献至多为 \(\frac{V}{2^d}\),那么有 \(\sum\limits_{i = 0}^{n - 1} \frac{V}{2^i}\le 2V\)。

那么操作 \(1\) 后 \(a_2\) 至多得到 \(\lfloor\frac{a_1}{2}\rfloor = V\) 的增量。
再往后,令当前在位置 \(i\),\(i - 1\) 给 \(a_i\) 的增量为 \(x\),考虑此时满足要么 \(a_i = 1\) 且 \(b_i = 0\),要么 \(a_i\le b_i\),所以 \(i\) 给到 \(i + 1\) 的增量肯定不会超过 \(\lfloor\frac{x + 1}{2}\rfloor\)。

那么可以知道的是,在 \(\mathcal{O}(\log V)\)(精确值应当是 \(31\))轮后,增量 \(x\) 就会变为 \(1\)。

发现若增量为 \(1\) 时满足 \(a_i = 1, b_i = 0\),或者 \(a_i = b_i\not = 0\),那么带给 \(i + 1\) 的增量依然为 \(1\),所以要特殊分析一下。
首先考虑 \(a_i = 1, b_i = 0\) 这种情况,那么在得到增量并进行操作后,\(a_i = b_i = 0\),等再转过来时因为 $i - 1 $ 带来的增量 \(\le 1\),那么这个位置已经产生不了增量了,于是最多转 \(n\) 次就会结束。
然后考虑 \(a_i = b_i\not = 0\) 这种情况,那么在得到增量并进行操作后,\(a_i = b_i - 1\),一样的等再转过来时这个位置一定产生不了增量,于是最多转 \(n\) 次就会结束。

综上,能够知道的是在增量 \(x = 1\) 后最多转一圈,也就是继续往后模拟 \(n\) 次后一定会终止。

于是可以知道,最多 \(2n + \mathcal{O}(\log V)\) 次模拟后就不会产生增量,\(a_i\) 就不会发生改变了。

直接模拟即可,时间复杂度 \(\mathcal{O}(n + \log V)\)。

#include<bits/stdc++.h>
constexpr int maxn = 1e6 + 10;
int a[maxn], b[maxn];
int main() {
   int n;
   scanf("%d", &n);
   for (int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]);
   for (int T = 0; T < n + 33 + n; T++) {
      int i = T % n, j = (i + 1) % n;
      if (a[i] < b[i]) continue;
      if (! b[i]) {
         a[j] += a[i] / 2, a[i] %= 2;
      } else {
         int d = (a[i] - b[i] + 1) / 2;
         a[j] += d, a[i] -= d * 2;
      }
   }
   for (int i = 0; i < n; i++) {
      if (a[i] != b[i]) {
         return puts("No"), 0;
      }
   }
   return puts("Yes"), 0;
}

标签:le,int,Luogu,bmod,Solution,送金,那么,增量,操作
From: https://www.cnblogs.com/rizynvu/p/18619899

相关文章

  • Solution - Atcoder ARC189E Straight Path
    首先发现的是\(n=2,3\)必定无解。接下来考虑\(n\ge4\)的情况。首先手玩一下小数据\(n=4\)。因为此时对应的图为一个带对角线的正方形,于是可以从对称的角度入手,得到\(\max=3\)的解:\(\begin{matrix}1&{\color{red}{-}}&2\\{\color{blue}{|}}&{\color{gree......
  • Luogu P10838 『FLA - I』庭中有奇树 题解 [ 绿 ] [ 二分 ] [ 双指针 ] [ 树 ]
    庭中有奇树:很多算法揉在一起的好题。转化题意因为要封锁\(m\)条路径,根据贪心思想,他一定会封锁最短的\(m\)条路径。所以我们能走的最短传送路径就是最短的第\(m+1\)条路径。这应该是本题最关键的一步转化了,几个月前降智了根本没想到这个。做法求第\(m+1\)短的路径,这个......
  • Document Solutions for Word CRACK
    DocumentSolutionsforWordCRACKDocumentSolutionsforWordv8addsenhancedfieldsupportforautomation,cross-referencing,formatting,andcreatingtablesofcontents.DocumentSolutionsforWord(DsWord)byMESCIUSisapowerful.NETlibr......
  • LUOGU_P1045(高精度+快速幂取模)
    高精度乘法+快速幂取模直接搞定,不多赘述,详见注释! #include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;inta[501],p,k[501],c[501],d;//底数a[],指数p,模10^500,余k[]voidtimes(intx){//高精度乘法 memset(c,0,sizeof(c));......
  • Document Solutions for Excel crack
    DocumentSolutionsforExcelcrackDocumentSolutionsforExcelv8.0.0introducesprogrammaticsupportforwhat-ifanalysiswithscenarios,elevatingdecision-makinginExcel.DocumentSolutionsforExcelbyMESCIUSisacomprehensivetooldesi......
  • AtCoder Beginner Contest 384 Solution
    A-aaaadaa(abc384A)题目大意给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。解题思路一个循环判断一下就行了。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;chara,b;cin>>n>>a>>b;st......
  • [luoguP10217/联合省选 2024] 季风
    题意给定\(n,k,x,y\)和\(2n\)个整数\(x_0,y_0,x_1,y_1,\dots,x_{n-1},y_{n-1}\)。找到最小的非负整数\(m\),使得存在\(2m\)个实数\(x_0',y_0',x_1',y_1',\dots,x_{m-1}',y_{m-1}'\)满足以下条件,或报告不存在这样的\(m\):\(\sum\limits_{i=0}^{m-1}......
  • luogu P10062 [SNOI2024] 拉丁方
    首先需要一些前置知识:每个点都恰好有\(k\)个度数的二分图称为\(k\)正则二分图,\(k\)正则二分图一定有完美匹配。Proof考虑Hall定理,不存在完美匹配当且仅当存在一个左部点的集合$S$使得$|tr(S)|<|S|$,这意味着$tr(S)$的度数之和要大于等于$|S|$的度数之和,但是......
  • Luogu P9606 CERC2019 ABB 题解 [ 绿 ] [ KMP ] [ 字符串哈希 ]
    ABB:KMP的做法非常巧妙。哈希思路显然正着做一遍哈希,倒着做一遍哈希,然后枚举回文中心即可。时间复杂度\(O(n)\)。代码#include<bits/stdc++.h>#definefifirst#definesesecond#definelc(p<<1)#definerc((p<<1)|1)usingnamespacestd;typedeflonglongll;......
  • Advent of Code 2022 solution [Mathematica/Scala/MATLAB/Julia/JavaScript]
    目录简介试题地址Day1Part1andPart2Day2Part1andPart2Day3Part1andPart2Day4Part1andPart2Day5Part1andPart2Day6Part1andPart2Day7Part1andPart2Day8Part1andPart2Day9Part1andPart2Day10Part1andPart2Day11Part1andPart......