2023牛客暑期多校训练营4

 Bobo String Construction 结论,字符串哈希

Election of the King 二分查找

Merge the squares! 递归模拟,辗转相除法

Qu'est-ce Que C'est? DP,前缀和优化

We are the Lights 思维,倒推

猜测是,把n个字符全填0或者1是最优的。所以只需要字符串哈希检查是否两个串里面含有给定串即可。 

 

#include <bits/stdc++.h>using namespace std;
typedef long long int ll;
# define p1 13331
# define p2 1331
# define mod1 998244353
# define mod2 1000000007
ll base1[5000+10],base2[5000+10],sum1[5000+10],sum2[5000+10],ans1,ans2;
int n,m;
ll getsum1(int l,int r)
{ll ans=((sum1[r]-(sum1[l-1]*base1[r-l+1]%mod1)%mod1)%mod1+mod1)%mod1;return ans;
}
ll getsum2(int l,int r)
{ll ans=((sum2[r]-(sum2[l-1]*base2[r-l+1]%mod2)%mod2)%mod2+mod2)%mod2;return ans;
}
int main()
{int t;cin>>t;base1[0]=base2[0]=1;for(int i=1; i<=5000; i++){base1[i]=p1*base1[i-1]%mod1;base2[i]=p2*base2[i-1]%mod2;}while(t--){cin>>n;string s;cin>>s;string pres=s;m=s.length();s=" "+s;ans1=0,ans2=0;for(int i=1; i<=m; i++){ans1=(ans1*p1%mod1+(int)(s[i]-'0'))%mod1;ans2=(ans2*p2%mod2+(int)(s[i]-'0'))%mod2;}string temp1=s;for(int i=1; i<=n; i++){temp1+='1';}temp1+=pres;string temp2=s;for(int i=1; i<=n; i++){temp2+='0';}temp2+=pres;int len1=pres.length()*2+n,len2=len1;for(int i=1; i<=len1; i++){sum1[i]=(sum1[i-1]*p1%mod1+(int)(temp1[i]-'0'))%mod1;sum2[i]=(sum2[i-1]*p2%mod2+(int)(temp1[i]-'0'))%mod2;}int flag=0;for(int i=2; i+m-1<len1; i++){ll now1=getsum1(i,i+m-1);ll now2=getsum2(i,i+m-1);if(now1==ans1&&now2==ans2){flag=1;break;}}if(flag==0){for(int i=1; i<=n; i++){cout<<1;}cout<<'\n';continue;}temp1=temp2;for(int i=1; i<=len1; i++){sum1[i]=(sum1[i-1]*p1%mod1+(int)(temp1[i]-'0'))%mod1;sum2[i]=(sum2[i-1]*p2%mod2+(int)(temp1[i]-'0'))%mod2;}flag=0;for(int i=2; i+m-1<len1; i++){ll now1=getsum1(i,i+m-1);ll now2=getsum2(i,i+m-1);if(now1==ans1&&now2==ans2){flag=1;break;}}if(flag==0){for(int i=1; i<=n; i++){cout<<0;}cout<<'\n';continue;}cout<<-1<<'\n';}return 0;
}

 

首先,对数组进行排序。以1 2 3 4 5为例,>=3的全部都投向5,否则都投给1。我们只需要获得当前[L,R]区间的(A[L]+A[R]) /2,如果(A[L]+A[R])恰好整除2,则全部大于等于这个值的都投给右侧,如果不能整除2,即为某.5,同样全部大于这个值的都投给右侧,故采用upper_bound,再pos--,即获得投给左侧的全部。

# include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct node
{int id,val;friend bool operator<(node x, node y){return x.val<y.val;}
};
struct node s[1000000+10];bool cmp(struct node x, struct node y)
{return x.val<y.val;
}
int main ()
{int n;cin>>n;for(int i=1;i<=n;i++){scanf("%d",&s[i].val);s[i].id=i;}sort(s+1,s+1+n,cmp);int l=1,r=n;for(int i=1;i<=n-1;i++){int now=(s[l].val+s[r].val)/2;struct node temp;temp.id=0;temp.val=now;int mid=upper_bound(s+l,s+1+r,temp)-s;mid--;int flag=0;if(s[mid].val==now)flag++;if(mid-l+1>=r-mid){r--;}else{l++;}}cout<<s[l].id;return 0;
}

 

 首先,当n包含某个因子的时候,如果这一因子小于等于7,大于1,就可以合并每个因子*因子的正方形。但当n为质数的时候,这一方法失效。故考虑构造正方形n*n为四部分,

n*n=(a+b)*(a+b)。对于黄色长方形,按照辗转相处法构造,即每次以较短边为边长构造正方形。对于蓝色正方形,我们继续按照这一规则,递归构造。而当前n选择的a,b值,可以暴力枚举n的a值,检验这个a*b的长方形构造出的正方形个数是否满足2*cnt+2<=50.即我们假定蓝色已经递归构造成功。值得注意的是,因为任意正方形一定是n*n的平方数,故我们一定可以找到a,b。而对于是否有界,并不会做充分证明。

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int ans[1010],n;
bool check(int x,int y)
{if(y==0){return x<=7;}int cnt=0;int a=x,b=y,c;while(b){cnt+=a/b;c=a;a=b;b=c%b;}return cnt*2+2<=50;
}
struct node
{int x,y,len;
};
stack<node>temp;
void dfs(int,int,int);
void workC(int,int,int,int);
void workR(int x,int y,int row,int col) //行短
{if(row==1)return ;int cnt=col/row;for(int i=1;i<=cnt;i++){dfs(x,y+(i-1)*row,row);}int yu=col%row;if(yu){workC(x,y+(cnt)*row,row,yu);}
}
void workC(int x,int y,int row,int col)
{if(col==1)return ;int cnt=row/col;for(int i=1;i<=cnt;i++){dfs(x+(i-1)*col,y,col);}int yu=row%col;if(yu){workR(x+cnt*col,y,yu,col);}
}
void dfs(int x,int y,int len)
{if(len==1)return;struct node now;now.len=len;now.x=x;now.y=y;temp.push(now);if(ans[len]==0)return ;int a=len-ans[len],b=ans[len];workR(x+a,y,b,a);workC(x,y+a,a,b);dfs(x,y,a);dfs(x+a,y+a,b);return ;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){ans[i]=-1;for(int j=0;j<=i/2;j++){if(check(i-j,j)){ans[i]=j;// break;}}}dfs(1,1,n);cout<<temp.size()<<'\n';while(!temp.empty()){struct node now=temp.top();temp.pop();cout<<now.x<<" "<<now.y<<" "<<now.len<<'\n';}return 0;
}

 

首先如果仅看两两之和大于等于0是很难转移的。不妨强制两种块,一种是一个正数,一种是一个负数和一个正数。这样可以获得类似于 负正正正负正正 的局面。而至于为什么不是正负组合,主要是因为,负数在前面放置,可以满足前面块和负数之和不为负数,也方便存储。缺点是,不能包含最后一个是负数的情况,故需要特判,由dp[n-1][i]*i转移。

写出暴力n^3的DP后,可以发现是可以进行前缀和优化的,且需要两个前缀和。第二个前缀和的推导,可以借助暴力程序的画图,找出枚举规律。可见,特殊的dp枚举优化,可以通过画图直观解决。

# include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
# define mod 998244353
ll dp[5010][5010];
int sum[5010][5010];
ll sumji[5010][5010];
int main()
{int n;ll m;cin>>n>>m;if(n==1){cout<<m+m+1;return 0;}dp[0][0]=1;for(int i=0; i<=m; i++){sum[0][i]=1;}for(int i=0; i<=m; i++){dp[1][i]=1;sum[1][i]=i+1;if(i){sumji[1][i]=(dp[1][i]*(ll)i)%mod;sumji[1][i]=(sumji[1][i-1]+sumji[1][i])%mod;}}for(int i=0; i<=m; i++){for(int j=0; j<=m; j++){dp[2][i]=(dp[2][i]+dp[1][j])%mod;}for(int k=-m; k<=-1; k++){int zheng=i-k;if(zheng<=m&&zheng>=0){dp[2][i]=(dp[2][i]+1)%mod;}}sumji[2][i]=(dp[2][i]*(ll)i)%mod;sum[2][i]=dp[2][i];if(i){sum[2][i]+=sum[2][i-1];sum[2][i]%=mod;sumji[2][i]=(sumji[2][i]+sumji[2][i-1])%mod;}}for(int i=3; i<=n; i++){for(int j=0; j<=m; j++){dp[i][j]=(dp[i][j]+sum[i-1][m])%mod;ll temp=((sum[i-2][m]-sum[i-2][m-j])%mod+mod)%mod;dp[i][j]=(((dp[i][j]+sumji[i-2][m-j])%mod+(ll)(m-j)*temp%mod)%mod)%mod;sumji[i][j]=dp[i][j]*(ll)(j)%mod;sum[i][j]=dp[i][j];if(j){sumji[i][j]=(sumji[i][j]+sumji[i][j-1])%mod;sum[i][j]=(sum[i][j]+sum[i][j-1])%mod;}}}ll ans=0;ans+=sum[n][m];ans%=mod;ans+=sumji[n-1][m];ans%=mod;cout<<ans;return 0;
}

 

 倒着推,但凡倒着推先点亮的,必定点亮,反之已然。然后就可以画图解决去重问题,利用点亮行的数量,关闭行的数量,点亮和关闭列的数量即可。

# include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int bookhang[1000000+10],booklie[1000000+10],n,m;
struct node
{int flag,id,on;
};
struct node s[1000000+10];
int main()
{cin.tie(0);ios::sync_with_stdio(0);int n,m;cin>>n>>m;int t;cin>>t;for(int i=1;i<=n;i++){bookhang[i]=-1;}for(int i=1;i<=m;i++){booklie[i]=-1;}for(int i=1;i<=t;i++){string ch;cin>>ch;int id;string on;cin>>id>>on;if(ch[0]=='r'){s[i].flag=1;}else{s[i].flag=0;}s[i].id=id;if(on[1]=='n'){s[i].on=1;}else{s[i].on=0;}}ll ans=0;ll lianghang=0,guanhang=0,lianglie=0,guanlie=0;for(int i=t;i>=1;i--){if(s[i].flag==1){if(s[i].on==1){if(bookhang[s[i].id]==-1){ans+=(m-lianglie-guanlie);bookhang[s[i].id]=1;lianghang++;}}else{if(bookhang[s[i].id]==-1){bookhang[s[i].id]=1;guanhang++;}}}else{if(s[i].on==1){if(booklie[s[i].id]==-1){ans+=(n-lianghang-guanhang);booklie[s[i].id]=1;lianglie++;}}else{if(booklie[s[i].id]==-1){booklie[s[i].id]=1;guanlie++;}}}}cout<<ans;return 0;
}

 

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

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

相关文章

亿发江西中小型制造企业信息化建设解决方案,2023数字化转型升级

实体经济在经济中的重要性愈发凸显&#xff0c;江西省作为制造业强省&#xff0c;要实现制造业经济高质量发展&#xff0c;信息技术与制造业的深度汇合是不可或缺的关键路径。在这个制造业转型升级的浪潮中&#xff0c;中小企业成为了江西省制造业转型的焦点。让我们深入探讨一…

Redis 7.X Linux 环境安装

Redis 简介 作为一名开发人员&#xff0c;想必大家对Redis一定是耳熟能详&#xff0c;因此在此只做简单介绍。 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value内存数据库&#xff0c;它提…

分布式 - 服务器Nginx:一小时入门系列之HTTP反向代理

文章目录 1. 正向代理和反向代理2. 配置代理服务3. proxy_pass 命令解析4. 设置代理请求headers 1. 正向代理和反向代理 正向代理是客户端通过代理服务器访问互联网资源的方式。在这种情况下&#xff0c;客户端向代理服务器发送请求&#xff0c;代理服务器再向互联网上的服务器…

抖音seo矩阵系统源代码开发搭建技术分享

抖音SEO矩阵系统是一个较为复杂的系统&#xff0c;其开发和搭建需要掌握一定的技术。以下是一些技术分享&#xff1a; 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中&#xff0c;JAVA语言的应用较为广泛&#xff0c;因为JAVA语言有良好…

软件架构师思维塑造

一、软件系统设计的六项原则 1、单一职责原则&#xff08;Single Responsibility Principle&#xff09; 2、开闭原则&#xff08;Open Closed Principle&#xff09; 3、里氏替换原则&#xff08;Liskov Substitution Principle&#xff09; 4、迪米特法则&#xff08;Law of …

无涯教程-Lua - nested语句函数

Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…

IMV3.0

经历了两个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 一、代码组织结构 二、代码 2.…

下载网络文件到本地

文章目录 目录 前言 操作步骤 1.引入 2.读取出文件内容 3.筛选出URL 4.下载表情包 总结 前言 这里记录一次用代码下载网络文件的过程&#xff0c;以获取抖音表情包为例。 一、操作步骤 1.引入 首先抖音有网页版&#xff0c;用浏览器就可以观看&#xff0c;用户评论发布表情在…

Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】

文章目录 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】前言探究隐藏网络端口netstat分析隐藏网络端口的原理关键数据结构隐藏网络端口源码 效果演示 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】 前言 Rookit是个老生常谈的话…

大学python题库及答案解析,大学python程序设计题库

本篇文章给大家谈谈大学python题库及答案解析&#xff0c;以及python期末编程题及答案&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 发表时间&#xff1a;2020-07-07 一、填空题&#xff08;15分&#xff09; 使用print()函数将多个字符串’How’、’are ’…

关于ETL的两种架构(ETL架构和ELT架构) qt

&#xfeff;ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xf…

Qt+C++实现灯带动画运动位置变换移动跑马灯图片轮播

程序示例精选 QtC实现灯带动画运动位置变换移动跑马灯图片轮播 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC实现灯带动画运动位置变换移动跑马灯图片轮播>>编写代码&…

线段树模板12

线段树 洛谷上有两道线段树模板&#xff08;指模板1&#xff0c;模板2&#xff09;都是区间维护的&#xff0c;也就是说&#xff0c;都离不开lasytag的维护&#xff0c;为了提高效率&#xff0c;故使用了lasytag,这里看一下题 【模板】线段树 1 题目描述 如题&#xff0c;已…

uni-app:实现数字文本框,以及左右加减按钮

效果 代码 <template><view><view classline3><view classline3_position><view classleft>数量<text>*</text></view> <view class"right"><view class"quantity_btn"><view class"…

Mysql存储引擎InnoDB

一、存储引擎的简介 MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。 1、InnoDB存储引擎 从MySQL5.5版本之后&#xff0c;默认内置存储引擎是InnoDB&#xff0c;主要特点有&#xff1a; &#xff08;1&#xff09;灾难恢…

Docker入门——保姆级

Docker概述 ​ —— Notes from WAX through KuangShen 准确来说&#xff0c;这是一篇学习笔记&#xff01;&#xff01;&#xff01; Docker为什么出现 一款产品&#xff1a;开发—上线 两套环境&#xff01;应用环境如何铜鼓&#xff1f; 开发 – 运维。避免“在我的电脑…

【肺炎分类数据集】数据量非常充足的新冠肺炎分类数据共享

一、肺炎数据集介绍&#x1f349;&#xff1a; 1.1 格式&#x1f388; 按照标准的格式分为了①训练集train&#xff08;134138575198张&#xff09;&#xff0c;②验证集val&#xff08;8816张&#xff09;&#xff0c;③测试集test&#xff08;234390624张&#xff09;&#…

C++学习笔记总结练习:正则表达式

正则表达式 目录 regex正则表达式的定义regex_match/search/replace正则表达式的三个操作smatch、sregex_iterator正则表达式的结果对象以及与其配套的迭代器。 参考文献 正则表达式总结 1 正则表达式基础 不考虑子表达式的内容 头文件 #include<regex>库组件 库组件作…

React Dva项目 简单引入models中的所有JS文件

我们前面接触的 Dva项目 models目录下的文件还要一个一个引入 其实体验并不是很好 而且如果项目很大那就比较麻烦了 我们可以在 models 下创建一个 index.js 文件 编写代码如下 const context require.context("./", false, /\.js$/); export default context.key…