title : 2022 年辽宁省大学生程序设计竞赛
date : 2022-10-25
tags : ACM,练习记录
author : Linno
题目链接:https://ac.nowcoder.com/acm/contest/43937
进度:10/13
质量比较差的场,后三题是错的,D题spj也是错的,其他nt题也多。
文章目录
#include<bits/stdc++.h>
using namespace std;
signed main(){
int n;
cin>>n;
int ans=n-(2022-73);
cout<<ans<<"\n";
return 0;
}
枚举每个点作为起点向下统计就行了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1007;
int n,m,ans[5];
char mp[N][N];
int check(int x,int y,char ch){
int res=0;
if(y+4<=m&&mp[x][y+1]==ch&&mp[x][y+2]==ch&&mp[x][y+3]==ch&&mp[x][y+4]==ch) ++res;
if(x+4<=n&&mp[x+1][y]==ch&&mp[x+2][y]==ch&&mp[x+3][y]==ch&&mp[x+4][y]==ch) ++res;
if(x+4<=n&&y+4<=m&&mp[x+1][y+1]==ch&&mp[x+2][y+2]==ch&&mp[x+3][y+3]==ch&&mp[x+4][y+4]==ch) ++res;
if(x-4>=1&&y+4<=m&&mp[x-1][y+1]==ch&&mp[x-2][y+2]==ch&&mp[x-3][y+3]==ch&&mp[x-4][y+4]==ch) ++res;
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
ans[mp[i][j]-'0']+=check(i,j,mp[i][j]);
}
}
cout<<ans[1]<<" "<<ans[2]<<"\n";
return 0;
}
先默认1为根,处理树上的祖先、大小和深度信息,如何第二遍dfs统计答案,假设最开始不删边的答案是 a n s ans ans,在 x x x点与父亲之间删一条边,对答案减少的贡献是 f [ x ] f[x] f[x],那么答案就是 a n s − m a x ( f i ) ans-max(f_i) ans−max(fi),对于 f [ x ] f[x] f[x]可以考虑求向上 s i z e size size不超过 k k k的段,那么整一段切给 x x x显然是最优的,并且下面的答案也不会改变, f [ x ] f[x] f[x]就是这一段的深度差。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int n,k,mx=0,sz[N],dep[N],fa[N][25];
vector<int>G[N];
void dfs(int x,int f){ //处理树上每个结点的信息
sz[x]=1;dep[x]=dep[f]+1;
fa[x][0]=f;
for(int i=1;i<=20;++i) fa[x][i]=fa[fa[x][i-1]][i-1];
for(auto to:G[x]){
if(to==f) continue;
dfs(to,x);
sz[x]+=sz[to];
}
}
void dfs2(int x,int f){
if(sz[f]-1>=k){ //如果f的子树大小大于k
int p=x;
for(int i=20;i>=0;--i){ //从x出发向上找一段
if(fa[p][i]&&sz[fa[p][i]]-sz[x]<k+1) p=fa[p][i];
}
mx=max(mx,dep[x]-dep[p]); //以x为新根,这一段的结点对答案贡献删除
}
for(auto to:G[x]){
if(to==f) continue;
dfs2(to,x);
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1,u,v;i<n;++i){
cin>>u>>v;
G[u].emplace_back(v);
G[v].emplace_back(u);
}
dfs(1,0);
int ans=0;
for(int i=1;i<=n;++i){
if(sz[i]-1>=k) ++ans;
}
dfs2(1,0);
cout<<ans-mx<<"\n";
return 0;
}
假设有 n n n次抽卡机会和 m m m种卡
集齐 m m m张卡的期望抽取次数是 E ( m ) = ∑ i m m i E(m)=\sum_i^m{\frac{m}{i}} E(m)=∑imim,可以理解为 i m \frac{i}{m} mi的概率抽到第 i i i种,因此期望次数就是它的倒数。
抽 n n n次的期望种数是 F ( n ) = F ( n − 1 ) + m − F ( n − 1 ) m F(n)=F(n-1)+\frac{m-F(n-1)}{m} F(n)=F(n−1)+mm−F(n−1),可以理解为在 n − 1 n-1 n−1抽期望为 x x x种的基础上,抽到新的一种的概率为 m − x m \frac{m-x}{m} mm−x
#include<bits/stdc++.h>
using namespace std;
int n,m;
signed main(){
cin>>n>>m;
double ans1=0,ans2=0;
for(int i=1;i<=m;++i) ans1+=double(m)/i;
for(int i=1;i<=n;++i) ans2+=(m-ans2)/m;
printf("%.8lf %.8lf\n",ans1,ans2);
return 0;
}
直接暴力找交集就可以了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m,k,is[N],yes[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
cin>>k;for(int i=1,x;i<=k;++i) cin>>x,is[x]=1;
for(int i=2;i<=n;++i){
cin>>k;
for(int j=1,x;j<=k;++j){
cin>>x;
if(is[x]) yes[i]=1;
}
}
int ans=1;
for(int i=1;i<=n;++i) if(yes[i]) ++ans;
cout<<ans<<"\n";
return 0;
}
挺离谱的,一开始还以为随机乱搞,但是一个连续的范围怎么可能会有很多数跟一个 1 e 18 1e18 1e18的数互质,所以当然是直接找啦。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,T;
int read(){ int x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x;}
void write(int x){if(x>9) write(x/10);putchar(x%10+'0');}
inline int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void solve(){
n=read();
int L=(n+3)/4,R=n/2;
for(int i=L;i<=min(R,L+25ll);++i){
if(gcd(n,i)==1){
write(i);putchar('\n');
return;
}
}
puts("-1");
}
signed main(){
T=read();
while(T--){
solve();
}
return 0;
}
单点修改、单点查询、区间修改、区间查询,所以是线段树裸题。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
inline int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int n;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((l+r)>>1)
int tr[N<<2],tg[N<<2];
void pushdown(int p,int l,int r){
if(tg[p]){
tr[ls]=tr[rs]=tg[ls]=tg[rs]=tg[p];
tg[p]=0;
}
}
void update(int p,int l,int r,int pos,int v){
if(l==r){tr[p]=v;return;}
pushdown(p,l,r);
if(pos<=mid) update(ls,l,mid,pos,v);
else update(rs,mid+1,r,pos,v);
tr[p]=gcd(tr[ls],tr[rs]);
}
int query(int p,int l,int r,int pos){
if(l==r) return tr[p];
pushdown(p,l,r);
if(pos<=mid) return query(ls,l,mid,pos);
else return query(rs,mid+1,r,pos);
}
int query_gcd(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tr[p];
pushdown(p,l,r);
if(ql>mid) return query_gcd(rs,mid+1,r,ql,qr);
else if(qr<=mid) return query_gcd(ls,l,mid,ql,qr);
else return gcd(query_gcd(ls,l,mid,ql,qr),query_gcd(rs,mid+1,r,ql,qr));
}
void modify(int p,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){
tg[p]=tr[p]=v;
return;
}
pushdown(p,l,r);
if(ql<=mid) modify(ls,l,mid,ql,qr,v);
if(qr>mid) modify(rs,mid+1,r,ql,qr,v);
tr[p]=gcd(tr[ls],tr[rs]);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
int idx=0;
for(int i=1,op,x,k;i<=n;++i){
cin>>op;
if(op==1){
cin>>x;
++idx;
update(1,1,n,idx,x);
}else if(op==2){
update(1,1,n,idx,0);
--idx;
}else if(op==3){
cout<<query(1,1,n,idx)<<"\n";
}else{
cin>>k;
int md=query_gcd(1,1,n,idx-k+1,idx);
modify(1,1,n,idx-k+1,idx,md);
}
}
return 0;
}
读懂了就可以直观感受到他要求一个最小/大生成树,因为克鲁斯卡尔枚举边的过程时,最后一条边保证是把图分成两块并且边权最大值最小的,符合题目要求。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+7;
struct E{
int u,v,w,nxt;
friend bool operator <(E A,E B){
return A.w>B.w;
}
}e[N];
int cnt=0,head[N];
inline void addedge(int u,int v,int w){
e[++cnt]=(E){u,v,w,head[u]};head[u]=cnt;
}
int n,m,ans,num=0,fa[N];
inline int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1,u,v,w;i<=n;++i){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
stable_sort(e+1,e+1+cnt);
for(int i=1;i<=cnt;++i){
int fx=find(e[i].u),fy=find(e[i].v);
if(fx!=fy){
++num;
fa[fx]=fy;
if(num==n-1){ //剩下一个点没有合并
ans=e[i].w;
break;
}
}
}
cout<<ans<<"\n";
return 0;
}
不难想,打表可以发现有解的条件是 n % 8 = = 7 ∣ ∣ n % 8 = = 0 n\%8==7||n\%8==0 n%8==7∣∣n%8==0,在纸上画一画就可以得到 7 ∗ 7 7*7 7∗7的三角形、 8 ∗ 8 8*8 8∗8的三角形的构造(下面代码有),那么把他们拼在一块就变成了 8 ∗ 8 8*8 8∗8的正方形了,接下来就模拟一下堆积木的过程。
#include<bits/stdc++.h>
using namespace std;
int n,idx=0,mp[1005][1005];
int tri1[10][10]={
{1},
{1,1},
{1,2,2},
{3,2,2,4},
{3,3,4,4,4},
{3,5,6,6,6,7},
{5,5,5,6,7,7,7}
};
int tri2[10][10]={
{1},
{1,1},
{1,2,2},
{3,2,2,4},
{3,3,4,4,4},
{3,6,6,6,7,7},
{5,5,6,8,7,7,9},
{5,5,8,8,8,9,9,9}
};
int rct[10][10]={
{1,10,10,10,11,12,12,12},
{1,1,10,11,11,11,12,13},
{1,2,2,14,14,14,13,13},
{3,2,2,4,14,15,15,13},
{3,3,4,4,4,15,15,16},
{3,6,6,6,7,7,16,16},
{5,5,6,8,7,7,9,16},
{5,5,8,8,8,9,9,9}
};
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
// for(int i=1;i<=n;++i) frac[i]=frac[i-1]+i;
// for(int i=1;i<=n;++i) cout<<i<<" "<<frac[i]<<" "<<frac[i]%4<<" !!\n";
if(n%8!=7&&n%8!=0){
cout<<"NO\n";
return 0;
}
cout<<"YES\n";
int sx=1,sy=1,idx=0;
if(n%8==7){
for(int i=0;i<7;++i){
for(int j=0;j<=i;++j){
mp[sx+i][sy+j]=tri1[i][j]+idx;
}
}
idx+=7;sx=8;sy=1;
for(;sx<n;sx+=8){
for(sy=1;sy<=sx;sy+=8){
for(int i=0;i<8;++i){
for(int j=0;j<8;++j){
mp[sx+i][sy+j]=rct[i][j]+idx;
}
}
idx+=16;
}
for(int i=0;i<7;++i){
for(int j=0;j<=i;++j){
mp[sx+i+1][sy+j]=tri1[i][j]+idx;
}
}
idx+=7;
}
}else{
for(int i=0;i<8;++i){
for(int j=0;j<=i;++j){
mp[sx+i][sy+j]=tri2[i][j]+idx;
}
}
idx+=9;sx=9;sy=1;
for(;sx<n;sx+=8){
for(sy=1;sy<sx;sy+=8){
for(int i=0;i<8;++i){
for(int j=0;j<8;++j){
mp[sx+i][sy+j]=rct[i][j]+idx;
}
}
idx+=16;
}
for(int i=0;i<8;++i){
for(int j=0;j<=i;++j){
mp[sx+i][sy+j]=tri2[i][j]+idx;
}
}
idx+=9;
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j){
//printf("%2d ",mp[i][j]);
cout<<mp[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
贪心把同时不符合行和列的奇偶性的格子改掉,必然是最优的。
#include<bits/stdc++.h>
using namespace std;
const int N=1007;
int n,numx[N],numy[N];
char mp[N][N];
void solve(){
cin>>n;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
mp[i][j]='1';
++numx[i];++numy[j];
}
}
for(int i=n-1;i>=0;--i){
for(int j=n-1;j>=0;--j){
if((numx[i]&1)!=(i&1)&&(numy[j]&1)!=(j&1)){
--numx[i];--numy[j];
mp[i][j]='0';
}
}
}
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
cout<<mp[i][j];
}
cout<<"\n";
}
for(int i=0;i<n;++i) numx[i]=numy[i]=0;
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升
如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1. 创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1. 创建SpringBoot项目 打开IDEA,选择NewProject创建项目。 填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。 选择springboot版本以及需要的包,此处只选择了springweb。 此处需特别注意,若你使用的是jdk1
文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐
代码请进行一定修改后使用,本代码保证100%通过率,本题目提供了java、python、c++三种代码。复盘思路在文章的最后题目描述祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。输入描述第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量之后每行为
https://cloud.189.cn/t/BJbYreYbmUj2(访问码:djz6)(网盘2022-4-1更新)一、刷入armbian。1.1使用AmlBurnTool软件烧录首选底包至固件。烧录完成后断开玩客云电源备用。(靠近hdmi的那个口子。)1.2使用WIn32diskimager软件将emmc固件写入U盘。1.3写入成功后,先将U盘插入玩客云靠近网线接口端的USB口,再接入电源。玩客云通电后指示灯会先亮绿灯,再亮蓝灯,红蓝闪烁,最后蓝灯常亮。等到确定蓝灯常亮后,再拔掉U盘、电源。(最好蓝灯常亮后,启动一次玩客云,看看ssh是否正常。)1.4使用WIn32diskimager写入
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。 因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我正在努力寻找一套好的工具来实现我的个人网站。必须具备:网站或其生成器必须基于Ruby必须易于部署和维护拥有的美好:它应该在排版上干净漂亮它应该具有html5/css3功能我正在考虑直接使用Rails3,但它似乎有点过分了。编辑内容将是作品集和博客的混合体。你们ruby在用什么?效果好吗?
我看过很多关于这个主题的问题,但其中很多都有相互矛盾的信息,而且出于某种原因,它对我不起作用。我有:顶级域:即lvh.me(开发)。每个用户都有子域:即userdomain.lvh.me登录表单位于顶级域:lvh.me我要:如果用户登录,session需要在所有子域之间共享。我的意思是,session需要在lvh.me:3000/something和userdomain.lvh.me:3000中处于事件状态如果用户从lvh.me:3000/something注销,它应该可以工作,如果用户从userdomain.lvh.me:3000注销,它也应该可以工作。我试过了在初始化程序中设置以下
Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可