2022 年第四届河南省 CCPC 大学生程序设计竞赛vp补题

news2024/11/19 1:35:45

Dashboard - 2022 CCPC Henan Provincial Collegiate Programming Contest - Codeforces

Problem B. Hash

思路:

  1. 发现31的次幂取模的答案,所以如果一段太长肯定不如拆成2段。
  2. 首先如果一段长度为7,那么无论他的开头是a,eh,n的谁,都有val>=31^6=887503681>P/2
  3. 所以我一定可以把长度大于等于14的拆成2段,使得val(7)+val(7)>P>val(14)
  4. 明确每一段长度才这么一点,我们可以暴力枚举dp,求dp[i],我们每次求出以i结尾的各种长度len(1~13)的val,那么max(dp[i])=max(dp[i-len]+val(len))。因为是环,所以我们需要枚举第一段的可能的13个开头(一段最长为13)
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
const int mod=998244353;
const int N=2e5+50;
ll a[N],d[30],dp[N],pre[20];
void mysolve()
{
	string s;
	cin>>s;
	int n=s.size();
	for(int i=0; i<n; ++i)
		{
			if(s[i]=='a')a[i]=1;
			else if(s[i]=='e')a[i]=2;
			else if(s[i]=='h')a[i]=3;
			else a[i]=4;
		}
	ll ans=0;
	pre[0]=1;
	for(int i=1; i<=13; ++i)pre[i]=pre[i-1]*31%mod;
	for(int k=0; k<13; ++k)//枚举开头
		{
			vector<ll>dp(n+15);
			int l=k,r=n+l-1;
			a[r+1]=a[l];//因为开头移动,所以尾部也移动了
			for(int i=l; i<=r; ++i)//遍历dp[i]
				{
					ll tmp=0;
					for(int j=0; j<14&&i-j>=l; ++j)//枚举以i结尾的最优长度获取dp[i]
						{
							tmp=(tmp+a[i-j]*pre[j])%mod;
							if(i-j)dp[i]=max(dp[i],dp[i-j-1]+tmp);
						}
				}
			ans=max(ans,dp[r]);
		}
	cout<<ans<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	mysolve();
	return 0;
}

Problem C. Serval 的试卷答案

思路:

  1. 对于s[i]>s[i+1]的,显然我们必须把他们隔开。
  2. 而我们需要获取k段,显然需要插k-1个隔板,如果我们把必须隔开的隔开后,剩下可以插空的位置就是可以容易插。所以对于一段[l,r]划分k段,要求必须划分的有cnt段。答案就是组合数\binom{r-l-cnt}{k-1-cnt},显然我们线段树维护好cnt即可
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
const int N = 1e5 + 20;
const int mod=998244353;
int a[N];
int n,q;
#define ls p<<1
#define rs p<<1|1
#define mid (t[p].l+((t[p].r-t[p].l)>>1))
ll pre[N],dev[N],tmp[4][4];
struct tree
{
	int l,r;
	int ld,rd;
	int add,cnt;
	int sum[4][4];
} t[N<<2];

inline ll fastmi(ll base,ll power)
{
	ll ans=1;
	while(power)
		{
			if(power&1)ans=ans*base%mod;
			base=base*base%mod;
			power>>=1;
		}
	return ans;
}

inline void pushup(int p)
{
	for(int i=0; i<4; ++i)for(int j=0; j<4; ++j)t[p].sum[i][j]=t[ls].sum[i][j]+t[rs].sum[i][j];
	t[p].sum[t[ls].rd][t[rs].ld]++;
	t[p].ld=t[ls].ld,t[p].rd=t[rs].rd;
	t[p].cnt=t[ls].cnt+t[rs].cnt;
	if(t[ls].rd>=t[rs].ld)t[p].cnt++;
}

void build(int l,int r,int p)
{
	t[p].l=l,t[p].r=r;
	if(t[p].l==t[p].r)
		{
			t[p].ld=t[p].rd=a[l];
			return;
		}
	build(l,mid,ls),build(mid+1,r,rs);
	pushup(p);
}

inline void change(int p,int w)
{
	for(int i=0; i<4; ++i)for(int j=0; j<4; ++j)tmp[i][j]=t[p].sum[i][j];
	for(int i=0; i<4; ++i)for(int j=0; j<4; ++j)t[p].sum[(i+w)%4][(j+w)%4]=tmp[i][j];
	t[p].ld=(t[p].ld+w)%4,t[p].rd=(t[p].rd+w)%4;
	t[p].cnt=0;
	for(int i=0; i<4; ++i)for(int j=i; ~j; --j)t[p].cnt+=t[p].sum[i][j];
	t[p].add+=w;
}

inline void lazy(int p)
{
	if(t[p].l==t[p].r)t[p].add=0;
	if(t[p].add)
		{
			change(ls,t[p].add),change(rs,t[p].add);
			t[p].add=0;
		}
}

void update(int l,int r,int p)
{
	if(l<=t[p].l&&t[p].r<=r)
		{
			change(p,1);
			return;
		}
	lazy(p);
	if(mid>=l)update(l,r,ls);
	if(mid<r)update(l,r,rs);
	pushup(p);
}

int ask(int l,int r,int p)
{
	if(l<=t[p].l&&t[p].r<=r)return t[p].cnt;
	int ans=0;
	lazy(p);
	if(mid>=l)ans+=ask(l,r,ls);
	if(mid<r)ans+=ask(l,r,rs);
	if(l<=mid&&mid<r)ans+=(t[ls].rd>=t[rs].ld);
	return ans;
}

inline ll C(int n,int m)
{
	if(m>n||m<0||n<0)return 0;
	return 1ll*pre[n]*dev[m]%mod*dev[n-m]%mod;
}

void mysolve()
{
	cin>>n>>q;
	string s;
	cin>>s;
	for(int i=0; i<n; ++i)a[i+1]=s[i]-'A';
	build(1,n,1);
	int l,r,k,op;
	while(q--)
		{
			cin>>op>>l>>r;
			if(op==1)update(l,r,1);
			else
				{
					cin>>k;
					int cnt=ask(l,r,1);
					cout<<C(r-l-cnt,k-1-cnt)<<endl;
				}
		}
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	pre[0]=1;
	int nx=1e5;
	for(int i=1; i<=nx; ++i)pre[i]=pre[i-1]*i%mod;
	dev[nx]=fastmi(pre[nx],mod-2)%mod;
	for(int i=nx-1; ~i; --i)dev[i]=dev[i+1]*(i+1)%mod;
	mysolve();
	system("pause");
	return 0;
}

Problem J. Mex Tree

思路:

  1. 如果mex=n,显然答案为n
  2. 我们以val[i]=0的i设为根rt
  3. 显然mex=0时答案就是根节点的最大子树
  4. 其他情况,mex=k,显然val[i]=k的点不能包含,又必须包含小于k的所有点,显然我们答案就是取除k的子树之外的所有点(因为0点为根节点,k子树内的点与0相连必须经过k),如果k子树内存在点小于k,那么答案为0,如果都大于k,那么答案为n-sz[k](k子树大小)
  5. 因此,我们需要维护每个点的子树的包含的最小值
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
typedef pair<int, int> pii;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const double eps=1e-9;
const int N = 1e6 + 10;
int a[N],sz[N],mn[N],mx[N],b[N];
vector<int>edge[N];
void dfs(int u,int f)
{
	sz[u]=1,mn[u]=a[u];
	mx[u]=0;
	for(auto v:edge[u])if(v!=f)
			{
				dfs(v,u);
				mx[u]=max(mx[u],sz[v]);
				sz[u]+=sz[v];
				mn[u]=min(mn[u],mn[v]);
			}
}
void mysolve()
{
	int n;
	cin>>n;
	int rt;
	for(int i=1; i<=n; ++i)
		{
			cin>>a[i];
			b[a[i]]=i;
			if(a[i]==0)rt=i;
		}
	int x;
	for(int i=2; i<=n; ++i)cin>>x,edge[x].push_back(i),edge[i].push_back(x);
	dfs(rt,-1);
	cout<<mx[rt]<<" ";
	for(int i=1; i<n; ++i)
		{
			if(mn[b[i]]>=i)cout<<n-sz[b[i]]<<" ";
			else cout<<"0 ";
		}
	cout<<n<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t=1;
	//cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0基础学习VR全景平台篇第29章:场景功能-音乐解说

本期为大家带来蛙色VR平台&#xff0c;场景管理模块-音乐功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 优秀VR全景作品不仅注重视觉的体验&#xff0c;接入契合场景的背景音乐与解说&#xff1b; 可将音乐与解说进行全局播放或进行分场景播放&#xff0…

前端学习--Vue(4) 生命周期

一、组件的生命周期 一个组件从创建-运行-销毁的真个阶段&#xff0c;强调的是一个时间段 1.1 生命周期函数 1.1.1 创建 &#xff08;只执行一次&#xff09; created() 阶段任务&#xff1a;最早可以使用methods中的方法发起ajax请求获取数据&#xff0c;并将数据挂载到d…

论文阅读笔记(三)——有监督解耦+信息瓶颈

论文信息 《Disentangled Information Bottleneck》 论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/17120 代码地址&#xff1a;GitHub - PanZiqiAI/disentangled-information-bottleneck inproceedings{pan2021disentangled, title{Disentangled in…

vue3与vue2共存环境搭建

1、全局安装vue2 npm install vue-cli -g2、自行在任意位置创建一个文件夹&#xff0c;局部安装vue3 npm初始化 npm initnpm初始化 提示&#xff1a; 初始化后 出现文件package.json 如果没有初始化 会报错&#xff0c;且文件夹中不会新增内容 3、局部安装vue3 npm install …

一名优秀的黑客,具备的有哪些特质

想要成为网络hacker黑客&#xff1f;十个必会的特质 一、基本的计算机知识 把它列为第一条&#xff0c;相信很多人肯定会觉得不以为然&#xff0c;其实掌握必要的计算机知识对黑客入门非常重要。这些包括&#xff1a;计算机硬件的组成、操作系统的安装、Windows批处理命令、命…

LeetCode_DFS_困难_1377.T 秒后青蛙的位置

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个未访问过的顶点&#xff08;如果它…

apt remove purge的区别 删除包的同时删除配置文件

1、apt remove purge的区别 查看 man apt apt remove&#xff1a;删除软件包&#xff0c;不删除配置文件。这么做的目的是将来再次安装这个包时 原来的配置文件会自动加载供使用。也可以避免误删除包&#xff0c;配置文件还在的话&#xff0c;重新安装一次软件包就可以恢复到…

亚马逊云科技出海日6月9日盛夏盛启

向全球价值链上游奋进 中国企业增强国际竞争力的关键&#xff0c;是努力朝全球价值链上游奋进&#xff0c;发力技术出海。中国的出海新机遇&#xff0c;背后曾是疫情在全球按下数字互联和数字化升级的快进键&#xff0c;跨境电商、在线社交、移动支付、数字服务等数字经济迎来…

Spring 学习总结(37)—— 了解什么是单体的模块化,Spring Modulith 入门实践

1、介绍 模块化单体是一种架构风格,代码是根据模块的概念构成的。 对于许多组织而言,模块化单体可能是一个很好的选择。 它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spring Modulith 是 Spring 的一个实验项目,可用于构建模块化单体应用…

《消息队列高手课》课程笔记(一)

消息生态系统全景图 为什么需要消息队列&#xff1f; 异步处理 大多数程序员在面试中&#xff0c;应该都问过或被问过一个经典却没有标准答案的问题&#xff1a;如何设计一个秒杀系统&#xff1f; 这个问题可以有一百个版本的合理答案&#xff0c;但大多数答案中都离不开消息…

马蹄集oj赛(第五次)

目录 围栏木桩 某农场有一个由按编号排列的根木桩构成的首尾不相连的围栏。现要在这个围栏中选取一些木桩&#xff0c;按照原有的编号次序排列之后&#xff0c;这些木桩高度成一个升序序列。 大厨小码哥 附庸的附庸 最长子段和 旅费 纸带 暧昧团 上楼梯 上楼梯2 采蜜 围栏…

Spring 学习总结(36)—— Spring 状态机优雅实践

1、什么是状态机 1.1 什么是状态 先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed 。 状…

Mybatisplus真实高效批量插入附容错机制

文章目录 概要优化技术细节小结 概要 提示&#xff1a;mybatisplus自带真实批量插入 在mybatisplus已知常用批量插入为继承Iservice里的saveBatch方法和saveOrUpdateBatch方法&#xff0c; 进入源码可知&#xff0c;此两种方法的插入均为单条插入,如图: 其中可看出&#xff0…

果汁脱色树脂,制糖行业脱色,医药行业脱色

具有控制孔径的大孔强碱性Ⅰ型阴特种脱色用离子交换树脂 Tulsimer A-722是一款具有便于颜色和有机物去除的控制孔径的&#xff0c;专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 &#xff08;氯型&#xff09;专门应用于糖浆脱色。 Tulsimer A-722由于其本身…

字节真的是宇宙尽头吗?

身边在字节的朋友很多人抱怨很卷&#xff0c;但卷到何种程度?很多人没有直观感受。某乎上一个问题(在字节跳动工作是怎样的?)点赞排名第一的回答生动的解释了字节的卷。 租房的舍友在字节工作。 舍友主卧&#xff0c;我次卧。 合租两个月了&#xff0c;我没见过舍友长什么样。…

Python实现ACO蚁群优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Bark(Suno AI) 搭建及使用

前言 Bark 是由Suno AI创建的基于转换器的文本到音频模型。Bark 可以生成高度逼真的多语言语音以及其他音频 - 包括音乐、背景噪音和简单的音效。该模型还可以产生非语言交流&#xff0c;如大笑、叹息和哭泣。 1: 环境 win10 rtx 3060TI bark 下载地址 https://github.com/sun…

Jenkins配置Powershell脚本,通过脚本控制开发/测试服务器

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !序言 因为需要在Windows上编译和部署程序,因此需要借助PowerShell的脚本力量完成这些事情。 目标…

3年工作经验裸辞,有点后悔了

2019年毕业&#xff0c;现在有3年的软件测试工作经验&#xff0c;刚毕业前半年在一家知名上市公司&#xff0c;后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因&#xff0c;上上周辞职了&#xff0c;目前交接中&#xff0c;下个月中旬就得离开了&a…

Call for Papers丨第十七届全国知识图谱与语义计算大会,AI Open联合征稿

第十七届全国知识图谱与语义计算大会&#xff08;CCKS 2023&#xff09;征稿中&#xff0c;并与《AI Open》开展联合征稿&#xff0c;征稿截止日期为2023年6月2日。 全国知识图谱与语义计算大会&#xff08;China Conference on Knowledge Graph and Semantic Computing&#x…