2021.8.9 提高B组模拟赛

2023-10-12 05:50
文章标签 模拟 提高 2021.8

本文主要是介绍2021.8.9 提高B组模拟赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2021.8.9 2021.8.9 2021.8.9 模拟赛
目录:

T1.最长公共回文子序列
T2.QYQ在艾泽拉斯
T3.平均数
T4.着色

T 1 : T1: T1最长公共回文子序列

在这里插入图片描述

分析:

B B B串里枚举回文子串 然后看这个子串在 A A A串有没有即可

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+5;
char a[N],b[25],s[25];
int n,m,ans,vis[N],tot;
void dfs(int x)
{if(x>m){tot=0;for(int i=1;i<=m;i++)if(vis[i]) s[++tot]=b[i];for(int i=1;i<=(tot>>1);i++)if(s[i]!=s[tot-i+1]) return;int j=1;for(int i=1;i<=n;i++){if(a[i]==s[j]) j++;if(j>tot) break;}if(j<=tot) return;ans=max(ans,tot);return;}vis[x]=1; dfs(x+1);vis[x]=0; dfs(x+1);
}
int main(){freopen("lcps.in","r",stdin);freopen("lcps.out","w",stdout);scanf("%s%s",a+1,b+1);n=strlen(a+1);m=strlen(b+1);dfs(1);printf("%d",ans);return 0;
}

T 2 : Q Y Q T2:QYQ T2QYQ在艾泽拉斯

在这里插入图片描述

分析:

t a r j a n tarjan tarjan把所有岛屿都先处理出
然后在拓扑序里 把每个连通块最大路径值求出 这个用并查集和拓扑序 d p dp dp
答案就是前 k k k个之和

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int n,m,k,tot,head[N],x[N],y[N];
int low[N],dfn[N],con[N],Index,size;
int fa[N],in[N],num,head2[N],tot2;
ll f[N],Ans,ans[N],w[N],val[N],sum[N];
queue<int> q; 
stack<int> st;
struct node{int to,next;
}a[N],a2[N];
void add(int x,int y)
{a[++tot]=(node){y,head[x]};head[x]=tot;
}
void add2(int x,int y)
{a2[++tot2]=(node){y,head2[x]};head2[x]=tot2;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void tarjan(int x)
{st.push(x);dfn[x]=low[x]=++Index;for(int i=head[x];i;i=a[i].next){int qwq=a[i].to;if(!dfn[qwq]){tarjan(qwq);low[x]=min(low[x],low[qwq]);}else if(!con[qwq])low[x]=min(low[x],dfn[qwq]);}if(dfn[x]==low[x]){con[x]=++size;sum[size]=w[x];while(st.top()^x){con[st.top()]=size;sum[size]+=w[st.top()];st.pop();}st.pop();}
}
void TpSort()
{while(!q.empty()){int x=q.front();q.pop();for(int i=head2[x];i;i=a2[i].next){int qwq=a2[i].to;if(val[x]+sum[qwq]>val[qwq]){val[qwq]=val[x]+sum[qwq];int now=find(qwq);f[now]=max(f[now],val[qwq]);}in[qwq]--;if(in[qwq]==0) q.push(qwq);}}
}
void merge(int x,int y){(x<y)?fa[y]=x:fa[x]=y;}
int main(){freopen("azeroth.in","r",stdin);freopen("azeroth.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&x[i],&y[i]);add(x[i],y[i]);}for(int i=1;i<=n;i++)scanf("%lld",&w[i]);scanf("%d",&k);for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);for(int i=1;i<=size;i++)fa[i]=i;for(int i=1;i<=m;i++){int a=x[i],b=y[i];if(con[a]^con[b]){int fx=find(con[a]),fy=find(con[b]);merge(fx,fy);in[con[b]]++;add2(con[a],con[b]);}}for(int i=1;i<=size;i++)if(in[i]==0){q.push(i); val[i]=sum[i];int now=find(i);f[now]=max(f[now],val[i]);}TpSort();for(int i=1;i<=size;i++)if(f[i]) ans[++num]=f[i];sort(ans+1,ans+num+1);for(int i=num;i>=max(1,num-k);i--)Ans+=ans[i];printf("%lld",Ans);return 0;
}

T 3 : T3: T3平均数

在这里插入图片描述
L u o g u Luogu Luogu l i n k link link & \& & 双倍经验

分析:

二分
如果一个序列的平均值 > x >x >x 那每个数 − x > 0 -x>0 x>0 所以二分这个 x x x
枚举前缀和 若当前前缀和 减 最小前缀和 > 0 >0 >0 x x x即合法

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3e5+5; 
int n,k,a[N];
double ans,eps=1e-7,sum[N],l=0,r;
bool check(double x)
{for(int i=1;i<=n;i++)sum[i]=sum[i-1]+(double)(a[i]-x);double tmp=0;for(int i=1;i<=n;i++)if(i-k>=0){tmp=min(tmp,sum[i-k]);if(sum[i]-tmp>=0) return 1;}return 0;
}
int main(){freopen("average.in","r",stdin);freopen("average.out","w",stdout);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);r+=a[i];}while(r-l>eps){double mid=(l+r)/2.0;if(check(mid)) l=mid,ans=l;else r=mid;}printf("%.6lf",ans);return 0;
}

T 4 : T4: T4着色

在这里插入图片描述
L u o g u Luogu Luogu l i n k link link

分析:

k = 2 k=2 k=2时 答案都为 2 2 2
如果图能用两色或三色涂 a n s = ans= ans=两色答案 × C k 2 + ( \times C_k^2+( ×Ck2+(三色答案 − 6 ) × C k 3 -6)\times C_k^3 6)×Ck3
如果只能用三色涂 a n s = ( ans=( ans=(三色答案 − 6 ) × C k 3 -6)\times C_k^3 6)×Ck3
− 6 -6 6是从三色中减去两色的方案数
三色时的答案可以手算 可以从样例里找 也可以 d f s dfs dfs

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,k;
int main(){freopen("color.in","r",stdin);freopen("color.out","w",stdout);scanf("%lld%lld",&n,&k);long long C_2=k*(k-1)/2,C_3=k*(k-1)*(k-2)/6;if(n==1) printf("%lld",2*C_2+1572858*C_3); else if(n==2) printf("%lld",96*C_3);else if(n==3) printf("%lld",2*C_2+18*C_3);else if(n==4) printf("%lld",2*C_2+24570*C_3);else if(n==5) printf("%lld",12*C_3);else if(n==6) printf("%lld",6*C_3);else if(n==7) printf("%lld",96*C_3);else if(n==8) printf("%lld",2*C_2+((1<<30)+2ll-6ll)*C_3);return 0;
}

这篇关于2021.8.9 提高B组模拟赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/dgssl_xhy/article/details/119546779
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/193704

相关文章

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [