AtCoder Regular Contest 068 F - Solitaire

【问题描述】
现在有一个1-n的序列,我们将它依次加入一个双端的序列,加完之后我们再每一次选择双端序列中的左端点/右端点,选择一个将对应的数删除并加入一个删除序列中,问最后有多少个合法的删除序列满足第k个是1(取模1e9+7)
【输入格式】
从文件forget.in中读入数据。
一行,n和k。
【输出格式】
输出到文件forget.out中。
一行一个整数。
【样例输入】
[1]17 2
[2]9 1
[3]5 3
[4]2000 1000
【样例输出】
[1]262144
[2]128
[3]18
[4]674286644
【数据范围】
所有的数字都表示小于等于。
编号 n k
1 5 5
2-3 2000 1
4-6 2000 2
7-15 300 300
16-20 2000 2000
【样例解释】
对于9 1:
我们只能在第一次删除掉数字1,所以1必须在双端队列的左端,或者右端。
那么序列内的元素就必须是[1,2,3,4,5,6,7,8,9]或者[9,8,7,6,5,4,3,2,1]
那么,删除掉1之后,剩下的元素,每次要么出左边,要么出右边,最后剩一个的时候没的选。
所以一共27=128种情况。
·
·
·
·
注意原题题意为加入队列时从1加到n,每次可以在队列左或右加,删除队列相同。有一个知道题意可以看出的规律即开始时的队列数值为V型,那么最后满足条件的队列中1之前一定是一个或两个递减的交叉着的序列。

处理情况数,使用dp。考虑dp状态,因为是到第k位,所以dp[i]从dp[i-1]转移。那么之后应该再加上什么状态呢,因为递减的特性,dp[i][j]第二维表示前i位中的最小数字。不去考虑原数列的具体情况,每次新加的数一定能跟前面的一个序列接上,举例当前的删除序列为:9,8,5,3。添加1或2都可以满足要求,所以dp[i][j]要加上dp[i-1][j+1],dp[i-1][j+2]...相当于反着看;若要与另一个当前最低位比3大的序列接,即填大于3的数,填的数就为未在此删除序列中出现的最大数,可以知道这个数一定小于当前删除序列中的最大数,不需要知道具体数字,那么直接加上dp[i-1][j]就可以了qwq。

N三次方超时因为有连续的一段转移可以前缀和优化,初始化dp[0][n+1]为1啥都没选方法为1;因为dp值表示的是区间内的最小值情况,答案应为dp[k][1]-dp[k-1][1]。注意一下dp赋值时j大小的边界,然后数字1后面的位置随便选乘法原理ans直接乘2的n-k+1次方。

注意膜爆。

屑选手Setaria Italica又在粘std。

#include <bits/stdc++.h>
using namespace std;
int n,f[2005][2005],s[2005],k,P=1e9+7,a;
int main()
{
    for(int i=1;i<=20;i++)
    {
        memset(f,0,sizeof(f));
        memset(s,0,sizeof(s));a=0;
        scanf("%d%d",&n,&k);
        f[0][n+1]=1;
        for(int i=1;i<=k;i++)
        for(int j=n+1;j;j--)
        s[j]=(s[j+1]+f[i-1][j])%P,f[i][j]=(j<=n-i+1?s[j]:0);
        a=(f[k][1]-f[k-1][1]+P)%P;
        for(int i=1;i<=n-k-1;i++) a=(a+a)%P;
        printf("%d\n",a);
    }
}

原文地址:https://www.cnblogs.com/cubeconcept/p/11392149.html

时间: 2024-11-06 09:29:34

AtCoder Regular Contest 068 F - Solitaire的相关文章

AtCoder Regular Contest 101 F

题目链接:atcoder 考虑所有的洞将数轴划分成了若干个区间,则对每个机器人无论他怎么移动都不可能出这个区间,所以每个机器人至多只可能掉入两个洞中 对于最左边和最右边没有洞的机器人,显然他们的掉洞方案唯一,于是我们不去考虑它,对于剩下的机器人,我们用一个二元组\((l_i,r_i)\)表示它到离它最近的左/右边的洞的距离,很明显一个机器人掉入哪个洞只与操作序列达到的最左边/右边的位置有关. 将所有的二元组放在一个平面上,用它们来标记一些点,操作序列的历史达到的最左边/右边的位置可以用一条只会向

Atcoder Regular Contest 076 F - Exhausted?题解

题目链接:F - Exhausted? 题目大意:有m个椅子在数轴上排列,第i张椅子(1≤i≤m)的坐标为i. 高桥君和他的朋友一共有n个人.高桥君他们因为玩了太久的游戏,大家的腰和背都很痛,所以他们很有必要坐在椅子上休息一下.高桥君他们每个人坐的椅子的坐标都很讲究,第i个人想坐在坐标在li以下(包括li)的椅子上,或者坐在坐标在ri以上(包括ri)的椅子上.当然,一个的椅子只能坐一个人. 可这样计算下去,可能会让他们不能都坐在椅子上休息.青木君关心高桥君他们的健康,尽可能多地增加椅子,让高桥君

Atcoder Regular Contest 060 F题第一问答案证明

一切的开始 令 \(x\) 为字符串,\(p\) 为正整数.如果对于满足 \(0\le i<|x|?p\) 的任何整数 \(i\) 满足 \(x[i]=x[i+p]\),则 \(p\) 称为 \(x\) 的周期.\(x\) 的最小周期表示为 \(per(x)\).例如,\(per(abcabcabcab)=3\). 令 \(N\) 为输入字符串 \(w\) 的长度. 情况划分如下: (a)如果 \(w\) 是一个好的字符串(例如 \(w=ababa\)) (b)当 \(per(w)=1\) 时(

AtCoder Regular Contest 098

AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定一个位置,使位置左边的字符都变成E,右边都变成W所需要的最小花费. 分析 这题纯粹是签到题,做两个前缀和然后直接加就可以了. #include <iostream> #include <cmath> #include <cstring> #include <cstdi

AtCoder Regular Contest 095

AtCoder Regular Contest 095 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个A和Y个B最小花费使多少. 分析: 明显的发现肯定买性价比更高的方案,分情况讨论一下,如果\(a+b<=2*c\),那么明显的先买足c到A,B中较小的一个,然后再比较一下剩下的那个的单价和\(2*c\)的大小. A[ans=] -->|a+b<=2*c| B(A*a+B*b) A -->

AtCoder Regular Contest 094

AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几次操作将三个数变为相同的数. 分析: 可以发现如果三个数的奇偶性相同直接加就可以了,对于奇偶性不同的,先把奇偶性相同的两个数都+1,然后按照相同的处理就可以了.可以证明没有更好的方案. #include <bits/stdc++.h> using namespace std; int a,b,c,

AtCoder Regular Contest 103

AtCoder Regular Contest 103 一些吐槽 参加的第一场\(ARC\):一个模拟 + 三个构造 没见过比这更令人感动的题型设置了(简直就是针对我(TAT)) . 感觉全场就我一个人\(E\)题WA了四遍才过....... C-//// 题目大意: 网址 给定一个串\(S\),要求修改一些字符,使得串满足以下条件: \(S_i = S_{i+2}\) \(S_1 \neq S_2\) . 问最少需要修改多少个字符. 题解: 无脑统计一下奇数和偶数格的每种种类. 然后在最大值和

AtCoder Beginner Contest 152 - F - Tree and Constraints (容斥定理+树上路径的性质)

AtCoder Beginner Contest 152 - F - Tree and Constraints (容斥定理+树上路径的性质) We have a tree with NN vertices numbered 11 to NN. The ii-th edge in this tree connects Vertex aiai and Vertex bibi. Consider painting each of these edges white or black. There ar

AtCoder Regular Contest 075 E - Meaningful Mean 树状数组求顺序对, 前缀和

题目链接: http://arc075.contest.atcoder.jp/tasks/arc075_c 题意: 给你一个序列和一个数k,求有多少对l,r,使得a[l]+a[l+1]+...+a[r]的算术平均数大于等于k 1≤N≤2×10^5 1≤K≤10^9 1≤ai≤10^9 思路: 首先对于所有数减去k,这样就不用除(r-l+1), 然后我们发现所求的就是有多少对l,r,使得sum[r]-sum[l-1] >= 0, sum是减去k之后的序列的前缀和 用树状数组对sum求有多少个顺序对