P8846 『JROI-7』PMK 配匹串符字

简要题意

给出一正整数 \(n(1 \leq n \leq 10^5)\),求出一个由小写英文字母组成的字符串 \(S\),使得 \(|S|=n\) 且 \(\sum_{i=1}^{n}{\operatorname{Next}_i}\) 最小。(如果有多组解,输出任意一组解即可)

注:\(\operatorname{Next}\) 为 \(S\) 的失配数组。

思路

首先失配数组和最小的话当然是 \(0\),那怎么是 \(0\) 呢?考虑失配数组的定义。\(\operatorname{Next}_i\) 为 \(S[1:i]\) 中最长的前缀使其等于后缀的长度。如果 \(\operatorname{Next}_i=0\) 那么不存在前缀=后缀。怎样不存在?直接构造一个 \(\texttt{abbbbbb...}\) 即可。

时间复杂度 \(O(n)\)。

代码

#include <bits/stdc++.h>
using namespace std; signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(i==1)putchar('a');else putchar('b');
}
return 0;
}

P8847 [JRKSJ R5] 1-1 A

简要题意

给你一个由 \(1,-1\) 组成的长度为 \(n(1 \leq n \leq 10^6)\) 的序列 \(a\),你需要将其重排,使得最大子段和最小。输出重排后的序列。(如果有多组解,输出任意一组解即可)

思路

首先,直觉告诉我们,一定要 \(\texttt{1 -1 1 -1 ...}\) 这样交错输出。

如果 \(1\) 的数量不等于 \(2\) 的数量呢?我一开始的思路是从中间二分插入,但是这样子是错误的。

事实上,如果 \(-1\) 的数量大于 \(1\) 的数量,我们直接将 \(-1\) 拼到后面去,这样子可以做到最大子段和为 \(1\)。

如果 \(1\) 的数量大于 \(-1\) 的数量呢?我们同样拼到后面去,这样子可以做到最大子段和为 \(\textbf{1 的数量}-\textbf{-1 的数量}\)。

可证明这已经是最优的。

时间复杂度 \(O(n)\)。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int n;
int pos,neg; signed main(){
ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
cin>>n;
for(int i=1,v;i<=n;i++){
cin>>v;
if(v==1)pos++;
else neg++;
}
int init=1;
for(int i=1;i<=n&&pos&&neg;i++){
cout<<init<<' ';
if(init==1)pos--;
else neg--;
init=(-init);
}
if(pos>0){
while(pos--)cout<<1<<' ';
}
if(neg>0){
while(neg--)cout<<-1<<' ';
}
return 0;
}

P8848 [JRKSJ R5] 1-1 B

简要题意

给你一个由 \(1,-1\) 组成的长度为 \(n(1 \leq n \leq 10^4)\) 的序列 \(a\),询问有多少个将 \(a\) 重排后的序列使得该序列的最大子段和最小化。答案对 \(998244353\) 取模。

思路

首先由上题得在 \(1\) 的个数(下设为 \(p\))大于 \(-1\) 的个数)(下设为 \(e\))时,最大子段和的最小值 \(L=\sum a\),在 \(p<e\) 时 \(L=1\),在 \(p=e\) 时 \(L=0\)。

  • 当 \(p\leq e\) 时,与 \(-1\) 和 \(1\) 的位置无关,我们可以直接将 \(-1\) 固定,到里面插入 \(1\)。因此此时答案为 \(\binom{p}{e+1}\)。
  • 当 \(p>e\) 时,与位置有关,我们考虑 DP,设 \(f_{i,j}\) 为前 \(i\) 个数凑出和为 \(j\) 的方案数,则动态转移方程:
\[f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1}\ \ \ \ \ f_{0,0}=1\ \ \ \ \ f_{i,0}=f_{i-1,1}
\]

推导过程 \(f_{i,j}\) 可以从从 \(f_{i-1,j-1}\) 中加上 \(1\) 得来,也可以从 \(f_{i-1,j+1}\) 中减去 \(1\) 得来。\(f_{i,0}\) 只能从 \(f_{i-1,1}\) 中减去 \(1\) 得来。

但是对于 \(1 \leq n \leq 10^4\) 时 \(f\) 空间开不下,需要进行滚动数组优化。

时间复杂度 \(O(n^2)\)(\(p>e\))或 \(O(n\log n)\)(\(p\leq e\))。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std; int f[10005],fold[100005];
int fact[10005];
const int mod = 998244353;
int n,pos,neg,sum; int pow(int a,int b,int mod) {
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod) {
if(b&1) {
ans=1ll*ans*a%mod;
}
}
return ans;
} int inv(int x){
return pow(x,mod-2,mod);
} int c(int m,int n){
return (fact[n]*inv(fact[m])%mod)*inv(fact[n-m])%mod;
} signed main(){
cin>>n;
for(int i=1,v;i<=n;i++){
cin>>v;
if(v==1)pos++;
else neg++;
sum+=v;
}
if(neg>=pos){
fact[0]=fact[1]=1;
for(int i=2;i<=(n+1);i++){
fact[i]=fact[i-1]*i%mod;
}
cout<<c(pos,neg+1)<<'\n';
return 0;
}
f[0]=fold[0]=1;
for(int i=1;i<=n;i++){
f[0]=fold[1];
for(int j=1;j<=sum;j++){
f[j]=(fold[j-1]+fold[j+1])%mod;
}
memcpy(fold,f,sizeof(f));
}
cout<<f[sum]<<'\n';
return 0;
}

【LGR-125】洛谷 11 月月赛 I & JROI-7 & JRKSJ-5的更多相关文章

  1. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  2. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  3. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  4. 洛谷11月月赛(284pts rank85)

    https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...

  5. 洛谷11月月赛round.1

    太感动了#2 thwfhk 240 (801ms) 100 100 40   又一张明信片,话说10月的怎么还没收到   P2246 SAC#1 - Hello World(升级版) 题目背景 一天, ...

  6. 洛谷11月月赛round.2

    P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...

  7. 洛谷11月月赛题解(A-C)

    心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...

  8. 【LGR-065】洛谷11月月赛 III Div.2

    临近$CSP$...... 下午打了一发月赛,感觉很爽. 非常菜的我只做了前两题......然而听说前两题人均过...... 写法不优秀被卡到$#1067$...... T1:基础字符串练习题: 前缀 ...

  9. NOIP模拟赛(洛谷11月月赛)

    T1  终于结束的起点 题解:枚举啊... 斐波那契数 第46个爆int,第92个爆long long.... 发现结果一般是m的几倍左右....不用担心T. #include<iostream ...

  10. 【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)

    题目描述# 给你一个长度为\(n\)的字符串\(S\). 有\(m\)个操作,保证\(m≤n\). 你还有一个字符串\(T\),刚开始为空. 共有两种操作. 第一种操作: 在字符串\(T\)的末尾加上 ...

随机推荐

  1. JavaScript基础&实战(2)js中的强制类型转换、运算符、关系运算符、逻辑运算符、条件运算符

    文章目录 1.强制类型转换Number 1.1 代码 1.2 测试结果 2.进制表示 2.1 代码 2.2 测试结果 3.强制类型转换为Boolea 3.1 代码 3.2 测试结果 4.运算符 4.1 ...

  2. JavaScript基础&实战 JS中正则表达式的使用

    文章目录 1.正则表达式 1.1 代码 1.2 测试结果 2.splict | search 2.1 代码 2.2 测试结果 1.正则表达式 1.1 代码 <!DOCTYPE html> ...

  3. 齐博x1服务器性能太差,调整系统升级每次校验的文件数

    系统升级需要校验本地的文件是否被修改过,系统默认每次检验1千个文件,一般来说需要分四到五页来处理,如下图所示. 如果你的服务器性能太差的话,就需要手工把数值调小.把下面的代码复制出来.进入后台数据库管 ...

  4. 1.轮询、长轮询、websocket简介

    一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据   缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...

  5. linux清理内存缓存cache

    Linux服务器有自己先进的内存管理机制,有时候会发现我们系统的buff/cache内存占用会越来越高,操作系统也有卡顿的情况,遇到这种情况,不妨试试下面的方法. 1步骤一:我们先查看物理内存占用情况 ...

  6. ubuntu 安装anaconda3

    ubuntu 安装anaconda3 官网:https://www.anaconda.com/ 下载:https://www.anaconda.com/products/individual#Down ...

  7. Java8新特性—四大内置函数式接口

    Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...

  8. 如何通过Java代码给Word文档添加水印?

    Word中可以为文档添加的水印分为两种形式:文字水印和图片水印.水印是一种数字保护的手段,在文档上添加水印可以传达有用信息,或者在不影响正文文字显示效果的同时,为打印文档增添视觉趣味,能起到传递信息, ...

  9. 深度学习之tensorflow2实战:多输出模型

    欢迎来到CNN实战,尽管我们刚刚开始,但还是要往前看!让我们开始吧! 数据集 链接:https://pan.baidu.com/s/1zztS32iuNynepLq7jiF6RA 提取码:ilxh,请 ...

  10. Day21:方法重写以及注意细节

    目录 方法重写 什么是方法重写? 方法重写有什么用? 方法重写的注意细节 方法重写 什么是方法重写? 方法重写指的是当子类和父类出现了一摸一样的方法声明 方法重写有什么用? 当父类中有一个方法时,子类 ...