首页 > 其他分享 >Atcoder nomura2020F Sorting Game

Atcoder nomura2020F Sorting Game

时间:2024-08-13 20:40:31浏览次数:6  
标签:Atcoder Sorting limits int sum 合并 一位 Game 考虑

首先考虑如果固定了 \(a\),如何判定这个 \(a\) 是否能被排序。
如果存在 \(a_i > a_j(i < j)\),那么 \(a_i\) 肯定要交换到 \(a_j\) 后面,那么就肯定会交换 \(a_i, a_j\)。

于是合法条件就是如果存在 \(a_i > a_j(i < j)\),那么 \(a_i, a_j\) 只相差一个二进制位。
那就还能知道此时一定 \(a_i\) 这一位为 \(1\),\(a_j\) 这一位为 \(0\),其余位都相同。

于是可以考虑从高位开始往低位比较两个数字。
如果满足 \(a_i, a_j(i < j)\) 前面已经遍历的位都相同,这一位不同且 \(a_i\) 这一位为 \(1\),\(a_j\) 为 \(0\),就要求剩下的位 \(a_i, a_j\) 相同。

于是可以考虑 DP。
考虑到如果有了上面提到的情况,那么此时 \(a_i, a_j\) 在低位就应该当作一个数了,相当于合并操作,同时还有提到从高位往低位去比较。 就可以设状态 \(f_{n, m}\) 为最高位为 \(n\),当前有 \(m\) 个数的方案数。

接下来考虑转移,分为两种情况考虑:

  1. 不存在合并操作。
    那么这个时候对于 \(n\) 这一位,就应该满足前面一部分为 \(0\),后面这部分为 \(1\),一共会有 \(m + 1\) 种可能的 \(01\) 分界线。

    同时考虑到此时先手可以操作使得这一位全变为 \(0\),那么比较还得继续到下一位。

    有转移 \(f_{n, m} = (m + 1)f_{n - 1, m}\)。

  2. 存在合并操作,即存在 \(i < j\),\(a_i\) 第 \(n\) 位为 \(1\),\(a_j\) 第 \(n\) 位为 \(0\)。

    考虑找到最靠前的为 \(1\) 的位置 \(l\),最靠后的为 \(0\) 的位置 \(r\),此时肯定满足 \(l < r\)。
    那么可以知道的是,不论 \(l < i < r\) 里的 \(i\) 第 \(i\) 位是什么,肯定都会和 \(l\) 合并或者和 \(r\) 合并。
    于是可以知道,\(l\le i\le r\) 的 \(a_i\) 都会合并,还剩下 \(m - (r - l)\) 个数。

    同时如果先手也选择了把这一位设成 \(0\),还需要轮到下一轮比较。

    此时的方案数为中间 \(r - l - 1\) 个数这一位任选的 \(2^{r - l - 1}\)。

    进一步的,考虑到对于同样的 \(r - l\),不管 \(l, r\) 是多少,本质都是相同的,此时对应的有 \(m - (r - l)\) 种方案。

    于是考虑枚举 \(m - (r - l)\),有转移 \(f_{n, m} = \sum\limits_{i = 1}^{m - 1} i2^{m - i - 1} f_{n - 1, i}\)。

综上,有转移 \(f_{n, m} = (m + 1)f_{n - 1, m} + \sum\limits_{i = 1}^{m - 1} i2^{m - i - 1} f_{n - 1, i}\)。

对于转移的优化,考虑拎出后面求和的部分,令 \(g_{n, m} = \sum\limits_{i = 1}^{m - 1} i2^{m - i - 1} f_{n - 1, i}\)。
那么有 \(g_{n, m + 1} = \sum\limits_{i = 1}^m i 2^{m - i} f_{n - 1, i}\)。
可以发现有 \(g_{n, m + 1} = 2g_{n, m} + mf_{n - 1, m}\),可以递推求出。

时间复杂度 \(\mathcal{O}(nm)\)。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 1e9 + 7;
const int maxn = 5e3 + 10;
ll f[maxn], g[maxn];
int main() {
   int n, m; scanf("%d%d", &n, &m);
   std::fill(f + 1, f + m + 1, 1);
   while (n--) {
      std::copy(f + 1, f + m + 1, g + 1);
      for (int i = 1; i <= m; i++)
         f[i] = (f[i - 1] * 2 + g[i - 1] * (i - 1)) % mod;
      for (int i = 1; i <= m; i++)
         (f[i] += g[i] * (i + 1)) %= mod;
   }
   printf("%lld\n", f[m]);
   return 0;
}

标签:Atcoder,Sorting,limits,int,sum,合并,一位,Game,考虑
From: https://www.cnblogs.com/rizynvu/p/18357643

相关文章

  • GameSalad-IOS-游戏开发学习手册-全-
    GameSaladIOS游戏开发学习手册(全)原文:LearnGameSaladforiOSGameDevelopmentforiPhone,iPad,andHTML5协议:CCBY-NC-SA4.0零、简介2007年,苹果推出了iPhone,彻底改变了我们的生活方式,但最重要的是iOS的诞生。今天,iOS被用于iPhone、iPad和iPodTouch。通过A......
  • CF1615H-Reindeer Games【保序回归,整体二分,网络流】
    正题题目链接:https://www.luogu.com.cn/problem/CF1615H题目大意有\(n\)个点,每个点有个初始权值\(a_i\),你每次可以让一个点权值\(+1\)或者\(-1\)。有\(m\)个限制要求某个点最终权值小于等于另一个点。求最少的操作次数使得满足所有限制。\(2\leqn,m\leq1000,1......
  • AtCoder Regular Contest 041 D 辺彩色
    洛谷传送门AtCoder传送门比较有意思的小清新题。第一步是时光倒流,看成是每次经过一条未被访问过的边才染色。奇偶相关容易想到二分图。发现若有一个黑白交替的奇环(即从一个点开始遍历完整个环得到的颜色序列是黑白交替地),那我们可以先染完这个环。又因为它是奇环,所以我们遍历......
  • 【倍增】Rigged Games
    题意两队打比赛,大比分2b−1赢,小比分2a−1赢。给定的长度为n的串,两队比赛的每个小分结果是这个串的循环重复。问从该串的每个位置开始,最终谁会赢得整个比赛。思路倍增。首先对于每个位置,计算出它\(2a-1\)局后的比分的比分终点的位置。然后采用倍增,即假设我们要......
  • AtCoder ABC 366题解
    前言本文部分思路来自于网络,仅供参考。A-Election2题目大意给定两个市长候选人的票数,求结果是否已经确定。解题思路如果剩下的人全部投票给票少的人票少的人也不能赢,则结果就已经确定了。code#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,t,......
  • Interactive Game with Coloring
    看这篇题解解释一下,如果存在一个点通向父亲的边和某一条通向儿子的边的颜色相同,那么一开始如果起点就在这个点的话,是没有办法向上走的,所以任意一个点通向父亲的边和某一条通向儿子的边的颜色不同对于非特殊点,我们只要一直走没有重复出现的那个颜色就好了如果某一时刻走到了特殊......
  • 论文笔记:GeoShapley: A Game Theory Approach toMeasuring Spatial Effects in Machin
    (GeoShapley:机器学习模型中测量空间效应的博弈论方法)话题点:geoshapley、XAI、空间效应、非线性一、引言机器学习和人工智能(AI)越来越多地用于模拟地理空间现象,在各个领域都有很好的表现。可解释人工智能(XAI)领域的最新进展为解释黑箱机器学习提供了一种解决方案。排列特征......
  • AtCoder Beginner Contest 366
    A-Election2(abc366A)题目大意\(n\)张票,目前投了\(t\)给高桥,\(a\)给青木。问剩余票随便分配,是否都是一个结局。解题思路考虑最好情况,即剩下票全部投给当前票少的,看看能不能超过对方,会则结局会变,否则不会变。神奇的代码#include<bits/stdc++.h>usingnamespaces......
  • AtCoder Beginner Contest 366 C,D题解
    C-BallsandBagQuery题解题意没什么好说的,给出q次查询,进行求解思路很简单的一道题,但这篇题解的作用是引出unordered_set,这个东西的作用类似set,但没有排序,相当于哈希。unordered_set有几种操作,接下来介绍三种insert,没什么可说的,普通的插入erase,进行弹出size,返回大......
  • G - AtCoder Office
    G-AtCoderOfficeProblemStatement$N$peopleworkattheAtCoderoffice.Theofficekeepsrecordsofentriesandexits,andtherehavebeen$M$entriesandexitssincetherecordsbegan.The$i$-th$(1\leqi\leqM)$recordisrepresentedbyapairof......