首页 > 其他分享 >【LGR-125】洛谷 11 月月赛 I & JROI-7 & JRKSJ-5

【LGR-125】洛谷 11 月月赛 I & JROI-7 & JRKSJ-5

时间:2022-11-16 16:36:47浏览次数:58  
标签:11 洛谷 int neg JROI pos leq fact mod

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;
}

标签:11,洛谷,int,neg,JROI,pos,leq,fact,mod
From: https://www.cnblogs.com/zheyuanxie/p/lgr125.html

相关文章

  • 双 11 狂欢背后,火山引擎数智平台为品牌做了这件事
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 29万个品牌超2100件商品参与天猫双11,整体交易规模与去年持平;京东科技......
  • 数据库的数据类型-2022-11-16
    数据库的数据类型1、数值tinyint十分小的数据1个字节smallint    小     2个字节Mediumint  中     3个字节int      ......
  • Oracle11g RAC集群启动流程
    一、集群与资源启动顺序启动流程步骤层次梳理第一层:OHASD启动:cssdagent-负责启动CSSD的Agent。orarootagent-负责启动所有root用户下的ohasd资源的A......
  • TRINAMIC的六轴步进电机控制模块TMCM-6110使用简介及使用场景
      TMCM-6110是一个用于无传感器负载相关电流控制的六轴步进电机控制器/驱动器模块。该设备有Trinamic  StallGuard2™(无传感器失速检测和机械负载测量)、CoolStep......
  • 操作数据库-2022-11-16
    1、操作数据库-》2、操作数据库中的表-》3、操作数据库表中的字段MYSQL的关键字不分大小写1、操作数据库(了解)创建数据库,createdatabase[ifnotexist]west02;......
  • 2022-11-16 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • mysql笔记-2022-11-16
    1、Mysql安装,参照学习视频一步步展开即可。   https://www.bilibili.com/video/BV1NJ411J79W?p=6&spm_id_from=pageDriver&vd_source=83cfcaf83fbcf6f545d917d051b89......
  • win11总是自动重启收集错误解决办法
    更新完win11被当成小白鼠了,总是重启收集错误,给我气死,干活干到一半直接关机,人都气傻了,有些文档还不会自动保存。点击 win---设置   点击系统信息--高级系统设置......
  • 【2022.11.15】pytorch的使用相关(四)
    参考资料ShusenTang/Dive-into-DL-PyTorch:本项目将《动手学深度学习》(DiveintoDeepLearning)原书中的MXNet实现改为PyTorch实现。(github.com)python数组冒号取值......
  • 11.16.2
    #include<stdio.h>#include<string.h>intmain(){inti,j,len,count=0; chara[100]; intc[100]; gets(a); len=strlen(a); for(i=len-1,j=0;i>=0;i-=2,j++) {if(......