首页 > 其他分享 >「解题报告」AGC012F Prefix Median

「解题报告」AGC012F Prefix Median

时间:2023-05-19 20:44:53浏览次数:35  
标签:AGC012F int Median 删数 Prefix MAXN 空隙 考虑 移动

好可怕。

AtCoder 的一贯风格,先找合法序列的充要条件,然后 DP 计数。

首先把数组排序,这个显然。

先找显然的必要条件。首先 \(b_i \in [i,2n - i]\),这个比较显然。

然后发现加数很不好考虑,我们考虑倒过来删数。每次删两个数,不难发现中位数只会不变或向左 / 向右移动一位。于是,我们有另外一个必要条件,就是前面的 \(b_i\) 不能在后面的某两个相邻的 \(b_j, b_{j + 1}\) 之间,因为每次只能移动一位,说明之间的数一定已经被删除了,那么前面的数就不能在这个区间里了。

然后我们就可以证明这个东西是充分条件了。具体证明考虑归纳。还是每次删数,考虑第 \(i + 1\) 个中位数向左移动、向右移动还是不移动。如果是 \(i + 1\) 向左移动到 \(i\),那么我们一定可以在 \([i + 1, 2i + 1]\) 之间找到两个数满足没有在 \(b_1, b_2, \cdots, b_{i - 1}\) 中出现。同时为了满足 \(b_{i - 1}\) 与 \(b_i\) 相差之多一格,我们一定优先把中间的至多两个空隙删除。由于第二个必要条件,中间的空隙一定没有出现过数,所以一定合法。向右移动同理。而不变的情况一定能在 \([1, i]\) 与 \([i + 2, 2i + 1]\) 分别找到一个没出现过的数。同样的,为了满足相差最多一格,优先删空隙,空隙至多也只有一格。于是这样就证明了充分性。

然后考虑设计个 DP 统计这样的序列数。我们还是考虑删数的过程,考虑当前的这个数可以向左走到某个点,或向右走到某个点,走到这个点之后会将中间的所有点全部删除。那么我们记 \(f_{i, l, r}\) 表示考虑到第 \(i\) 个数,左边有 \(l\) 个点可以走,右边有 \(r\) 个点可以走的方案数,转移考虑不动,向左走若干步或向右走若干步,复杂度 \(O(n^4)\)。注意可能有重复的数,为了防止方案算重,同一个数我们只考虑一次出现,钦定其它位置的出现一定不选。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105, P = 1000000007;
int n, a[MAXN];
int f[MAXN][MAXN][MAXN];
void add(int &a, int b) {
    a += b;
    if (a >= P) a -= P;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= 2 * n - 1; i++) {
        scanf("%d", &a[i]);
    }
    sort(a + 1, a + 1 + 2 * n - 1);
    f[n][0][0] = 1;
    for (int i = n; i > 1; i--) {
        int dx = a[i] != a[i - 1], dy = a[2 * n - i] != a[2 * n - i + 1];
        for (int x = 0; x <= 2 * n - 1; x++) {
            for (int y = 0; y <= 2 * n - 1; y++) if (f[i][x][y]) {
                add(f[i - 1][x + dx][y + dy], f[i][x][y]);
                for (int k = 1; k <= x + dx; k++) 
                    add(f[i - 1][x + dx - k][y + dy + 1], f[i][x][y]);
                for (int k = 1; k <= y + dy; k++)
                    add(f[i - 1][x + dx + 1][y + dy - k], f[i][x][y]);
            }
        }
    }
    int ans = 0;
    for (int x = 0; x <= 2 * n - 1; x++) {
        for (int y = 0; y <= 2 * n - 1; y++) {
            add(ans, f[1][x][y]);
        }
    }
    printf("%d\n", ans);
    return 0;
}

标签:AGC012F,int,Median,删数,Prefix,MAXN,空隙,考虑,移动
From: https://www.cnblogs.com/apjifengc/p/17416237.html

相关文章

  • AtCoder Regular Contest 133 E Cyclic Medians
    洛谷传送门AtCoder传送门其实是套路题,但是为什么做不出来啊第一步就是经典套路。枚举\(k\),统计中位数\(>k\)的方案数,加起来就是中位数的总和。那么现在\(x_{1\simn},y_{1\simm}\)就变成了\(0/1\)序列,考虑一次操作,如果\((x,y)=(0,0)\),那么\(a\)会变成\(0\)......
  • 新项目删除SceneDelegate以及创建PrefixHeader文件
    1.新项目删除SceneDelegate删除SceneDelegate文件info.plist文件中删除ApplicationSceneManifest中的item删除SceneDelegate在AppDelegate中的代理在AppDelegate.h添加window小问题:2.新项目plist文件的移动buildSeting里搜索info.plistFile设置路径3.......
  • 你也可以动手参数有效微调:LoRA、Prefix Tuning、P-Tuning、Prompt Tuning
    Part1前言随着大语言模型的流行,如何让大模型在消费级GPU上进行微调训练成为了热点。掌握参数有效微调成为每个自然语言处理工程师必不可少的技能,正好huggingface开源了一个PEFT库,让我们也能够自己动手去了解参数有效微调。接下来以中文情感分析(二分类)去了解下参数有效微调。使......
  • filter-policy、route-policy和ip-prefix默认处理方式
    1、route-policy    默认情况下是拒绝所有路由的,如果没有按照特定条件对路由进行匹配和允许,那么所有的路由都将被拒绝。因此,在配置route-policy时,需要明确地指定允许的路由条目。   也可以在最后加个空node,[Huawei]route-policynamepermit node102、ip-prefix......
  • Codeforces 1810G - The Maximum Prefix(DP)
    挺小清新的一道计数题。首先先分析下这个“最大前缀和”,按照最朴素的思路就是扫一遍每个前缀,然后记录一下当前的\(sum\)与前面的\(mx\),但是如果你一直陷在这个思路上你就似了,因为按照这个思路做,你DP状态里需要记录\(sum\)和\(mx\)两个维度,算上下标一维总共是\(n^3\),并......
  • POJ 2001 Shortest Prefixes(字典树)
    题目地址:POJ2001考察的字典树,利用的是建树时将每一个点只要走过就累加。最后从根节点开始遍历,当遍历到只有1次走过的时候,就说明这个地方是最短的独立前缀。然后记录下长度,输出即可。代码如下:#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#inc......
  • 解决"No toolchains found in the NDK toolchains folder for ABI with prefix: mips6
    版权声明:本文为博主原创文章,遵循 CC4.0BY-SA 版权协议,转载请附上原文出处链接和本声明。今天安装了AndroidStudio3.2,打开一个旧工程,编译提示"NotoolchainsfoundintheNDKtoolchainsfolderforABIwithprefix:mips64el-linux-android"网上也有解决办法,就是下载旧版......
  • Prefix must be in canonical form
    日志通过@ConfigurationProperties进行初始化赋值,如上图所示,idea报红线,提示前缀必须采用规范形式。这是因为prefix属性值不支持驼峰命名!!!解决方式一:prefix属性值都小写......
  • ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp
    目录ElasticSearch实现分词全文检索-概述ElasticSearch实现分词全文检索-ES、Kibana、IK安装ElasticSearch实现分词全文检索-Restful基本操作ElasticSearch......
  • 38. CF-Orac and Medians
    链接官方题解有严谨的证明。这里只写个思路。显然\(k\)必须存在于原数组中只要有连续两个\(k\),就可以完成任务小的数容易同化大的数考虑相对于\(k\)的大小关系......