Promblem A 小G的字符串

  给定$n,k$,构造一个长度为$n$,只能使用$k$种小写字母的字符串。

  要求相邻字符不能相同且$k$种字母都要出现

  输出字典序最小的字符串,无解输出$-1$。

  对于$100\%$的数据满足$\leq n \leq 10^5$

  Solution :

    我们考虑构造,显然是形如$a,b,a,b,...,c,d...$的字符串。

    即从$[1,n-k+2]$交替填$a,b$,然后$[n-k+3,n]$依次填$c,d,e ... $

    这样构造的时间复杂度是$O(n)$

# pragma GCC optimize()
# include <bits/stdc++.h>
using namespace std;
const int N=1e5+;
char ans[N];
int n,k;
int main() {
freopen("str.in","r",stdin);
freopen("str.out","w",stdout);
scanf("%d%d",&n,&k);
if (k == && n == ) {
puts("a"); return ;
}
if (k > n || k ==) {
puts("-1"); return ;
}
char now='c';
for (int i=n-k+;i<=n;i++) ans[i]=now++;
int op = ;
for (int i=;i<n-k+;i++,op=-op) ans[i]='a'+op;
for (int i=;i<=n;i++) putchar(ans[i]);
puts("");
return ;
}

str.cpp

Promblem B 小G的城堡

  给定$n,k$,构造一幅有向图,每个点出度为$1$。

  使$[1,k]$的点都能走到$1$,$[k+1,n]$的点都不能走到$1$

  输出方案数对$10^9 + 7$取模后的值。

  对于$100\%$的数据满足$n\leq 10^{18} , k \leq \min\{n,8\}$

  Solution :

    我们将点分为$[1,k]$和$[k+1,n]$两部分来考虑。

    第$1$部分的点进行连边,使得所有点都能走到$1$,对于上述数据范围直接$dfs$即可(事实上答案为$k^{k-1}$)。

    第$2$部分的点随意连边即可,显然方案数$(n-k) ^ {n-k}$ 。

    所以最后的答案就是$k^{k-1} (n-k)^{n-k}$。

    时间复杂度就是$O(log_2 n )$。

# pragma GCC optimize()
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int mo=1e9+;
const int d[] = {,,,,,,,,};
int Pow(int x,int n) {
int ans=;
while (n) {
if(n&) ans=ans*x%mo;
x=x*x%mo;
n>>=;
}
return ans%mo;
}
signed main()
{
freopen("castle.in","r",stdin);
freopen("castle.out","w",stdout);
int n,k; cin >> n >> k;
int ans = Pow((n-k)%mo,n-k) * d[k] % mo;
cout<<ans<<'\n';
return ;
}

castle.cpp

Promblem C 小G坐电梯

  在长度为$n$的数轴上起点为$A$,限制点为$B$(限制点不能被经过)

  你可以走$k$步,每次从$x$点走到$y(x \neq y)$点需要满足$x$到$y$的距离小于$x$到$B$的距离。

  输出方案数对$10^9 + 7$取模后的值。

  对于$100\%$的数据满足$n ,k \leq 5000 $

  Solution :

    可以考虑一个$O(n^2k)$的暴力dp,设$f[i][j]$表示当前第$i$次走动后处在第$j$个位置,方案数。

    考虑刷表,$f[i][j]$能转移到$f[i+1][k]$的条件是$k\neq j$且$|j-k|<|j-B|$,有转移$f[i+1][k]+=f[i][j]$

    本题的状态数$O(n^2)$,考虑优化转移.

    容易发现,每一次的刷表转移是一个区间加的过程,需要在最后维护每个单点的值。

    也就说,当前状态为$(i,j)$, 对于 $k \in [\max\{j-|j-B|+1,1\} , \min\{n,j+|j-B|-1\}] , k \neq j$ 的 $f[i+1][k]$ 都可以被转移到,即区间加$f[i][j]$。

    直接差分就好了。

    于是转移就变成均摊$O(1)$的。

    总时间复杂度为$O(nk)$

# pragma GCC optimize()
# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=5e3+;
const int mo=1e9+;
int n,A,B,k;
int f[N],c[N];
signed main()
{
freopen("lift.in","r",stdin);
freopen("lift.out","w",stdout);
cin >> n >> A >> B >> k; f[A]=;
for (int i=;i<k;i++) {
for (int j=;j<=n;j++) c[j]=;
for (int j=;j<=n;j++) {
int ret = abs(j-B);
int l = max(j-ret+,1ll),r = min(n,j+ret-);
(c[l]+=f[j])%=mo; (c[r+]+=mo-f[j])%=mo;
if (j>=l&&j<=r) (c[j]+=mo-f[j])%=mo,(c[j+]+=f[j])%=mo;
}
for (int j=;j<=n;j++) (c[j]+=c[j-])%=mo,f[j]=c[j];
}
int ans=;
for (int i=;i<=n;i++) (ans+=f[i])%=mo;
cout<< ans << '\n';
return ;
}

lift.cpp

HGOI 20191029am 题解的更多相关文章

  1. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  2. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  3. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  4. HGOI 20180224 题解

    /* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...

  5. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

  6. HGOI 20190217 题解

    /* for me,开训第一天 /beacuse 文化课太差被抓去补文化课了... 看一眼题 : AK局? 但是,Wa on test #10 in problem C 290! (就差那么一咪咪) ...

  7. HGOI 20181103 题解

    problem:把一个可重集分成两个互异的不为空集合,两个集合里面的数相乘的gcd为1(将集合中所有元素的质因数没有交集) solution:显然本题并不是那么容易啊!考场上想了好久.. 其实转化为上 ...

  8. HGOI 20181101题解

    /* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...

  9. HGOI 20191108 题解

    Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...

随机推荐

  1. T100——r类 凭证报表 打印

    报表开发流程:1.建立入口程序 如r类的作业:cxmr500步骤: azzi900中建立程序代号 azzi910中建立作业代号 设计器--规格--签出 设计器--程序--签出 adzp168(r.a) ...

  2. thymeleaf 模板使用 之 前台界面获取后台属性值

    使用Thymeleaf模板时,如果需要在js中获取后台传值,那么需要用内联JS写法获取 [姿势很重要] 一.后台通过Model的addAttribute方法向前台传值 1.js获取后台属性值(--内联 ...

  3. Hibernate 数据库方言

    1.所有关系型数据库都支持使用标准SQL语句 2.但数据库在语法细节上存在一些差异 3.Hibernate可根据方言自动应付底层数据库访问所存在的细节差异,将HQL有针对的转化为某一数据库所支持的SQ ...

  4. PMP - 风险识别之风险登记册

    目录 PMP - 风险识别之风险登记册 1. 风险登记册 1.1 已识别风险的清单 1.2 潜在风险责任人 1.3 潜在风险应对措施清单 2. 相关习题 2.1 风险发生的时候,要实施 风险登记册 上 ...

  5. React高阶组件学习笔记

    高阶函数的基本概念: 函数可以作为参数被传递,函数可以作为函数值输出. 高阶组件基本概念: 高阶组件就说接受一个组件作为参数,并返回一个新组件的函数. 为什么需要高阶组件 多个组件都需要某个相同的功能 ...

  6. luogu题解 P2860[USACO冗余路径Redundant Paths] 缩点+桥

    题目链接 https://www.luogu.org/problemnew/show/P2860 https://www.lydsy.com/JudgeOnline/problem.php?id=17 ...

  7. 分库分布的几件小事(五)MYSQL读写分离

    1.为什么进行读写分离 这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少.所以针对这个情况,就是写一个主库,但是主库挂多个 ...

  8. javascript的特点这些

    javascript的特点(1)用于解释性执行的脚本语言.与其他脚本语言一样,JavaScript也是一种解释性语言,它提供了非常方便的开发过程.JavaScript的基本语法结构与C.C++.Jav ...

  9. kbmMW 5.09测试报告(1)-Scheduler

    这个版本除了增加新的SmartBinding功能,同时提供了大量的功能更新以及bug修正.其中,SmartBinding的介绍,xalion已经第一时间写了初识kbmmw 中的smartbind功能, ...

  10. JDBC及PreparedStatement防SQL注入

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...