2023牛客暑期多校训练营1(D/H/J/K)

目录

D.Chocolate

H.Matches

J.Roulette

K.Subdivision


D.Chocolate

思路:当n=1且m=1时候先手必输,然后1*k(k>=2)的情况下后手必输,因为先手可以选到只剩下一个格子。而在其它情况里先手第一步可以先选(1,1)的格子,然后后手无论怎么选,先手都能使得在他选完之后,使剩下来的格子形成不了矩形,直到后手将剩下1*k的矩形,此时先手必胜。

void solve() {int n,m;cin>>n>>m;if(n==1&&m==1) cout<<"Walk Alone"<<endl;else cout<<"Kelin"<<endl;
}

H.Matches

思路:我们将a[i]>=b[i]的序对称为序1,a[i]<b[i]的序对称为序2,所有的序列两两配对总共可以分为六种情况

1.序1与序1(等价于序2与序2)不交

可以看出对答案的贡献为2*(C-B)。

2.序1与序1(等价于序2与序2)相交

 

 可以看出对答案的贡献为0。

3.序1与序1(等价于序2与序2)包容

 可以看出对答案的贡献为0。

4.序1与序2(等价于序2与序1)不交

 可以看出对答案的贡献为2*(D-B)。

5.序1与序2(等价于序2与序1)相交

  可以看出对答案的贡献为-2*(B-D)。

6.序1与序2(等价于序2与序1)包容

   可以看出对答案的贡献为-2*(B-D)。

综上可得,只有两个序列对类型不同,且他们有交集时,才会对答案产生负贡献,贡献的大小为-2*相交线段长度,所以我们可以将两种序对标记一下存入容器,左端点排序后遍历寻找不同类型序对的相交线段的最大长度,具体实现见代码。

代码:

struct st {int l,r,id;
};
bool cmp(st a,st b) {return a.l<b.l;//根据左端点来从小到大排序
}
vector<st>v;
void solve() {int n,k,sum=0,ans=0;//ans储存最长相交线段maxx[0]=maxx[1]=-inf;//分别记录两种线段的前缀右端点的最大值cin>>n;for(int i=1; i<=n; i++)cin>>a[i];for(int i=1; i<=n; i++) {cin>>k;sum+=abs(a[i]-k);//记录原本的答案if(k<=a[i])v.push_back({k,a[i],0});//分为两种序对,标记存储else v.push_back({a[i],k,1});}sort(v.begin(),v.end(),cmp);for(int i=0; i<v.size(); i++) {int now=v[i].id;if(maxx[!now]>v[i].l) { //如果前缀右端点的最大值比当前的左端点大,则说明产生了交集if(maxx[!now]<v[i].r)ans=max(ans,maxx[!now]-v[i].l);//若小于当前右端点,交集长度则为前缀右端点的最大值-当前左端点else ans=max(ans,v[i].r-v[i].l);//否则,则为当前的线段长度(相当于当前线段整个都被包含)}maxx[now]=max(maxx[now],v[i].r);//更新前缀右端点的最大值}cout<<sum-2*ans<<endl;//答案减去最大的负贡献
}

J.Roulette

思路:接下来的描述中1代表赢,0代表输。我们先对它们每个1进行分治,可以看出每个1对于答案的贡献一定是1,因为连续的x-1位0对于的答案的贡献为-(2^x-1),而连续的x-1位0后的第x位1的贡献为2^x次,它们的和即为-(2^x-1)+2^x=1。

比如0001,前面三场0的负贡献分别为-1,-2,-4,总共为-7,而最后一场1的贡献为4*2=8,所以总贡献为8-7=1。

因此,Walk Alone赢的次数固定为m次。而对于每个1前面的最多有几个0我们是可以计算的,只要负贡献不大于当前的本钱就行,

每次分治Walk Alone赢的基础概率为1/2,而后面的第x个的0会产生(1/2)^(x+1)的贡献,这表示形成之前x-1情况的概率*1/2,所以每位1的总贡献为1/2+(1/2)^2...(1/2)^(零的个数+1),最后分块求和就完事了。

代码:

int qkp(int a,int b) {int ans=1;while(b) {if(b&1)ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
void solve() {int n,m,l,r,ans=1,base=1;cin>>n>>m;for(int i=0; i<=34; i++) {l=max(n+1,base),r=min(n+m,base*2-1),base*=2;//l表示2^i,r表示2^(i+1)-1 if(r<l)continue;int sum=(qkp(2,i)-1)*qkp(qkp(2,i),mod-2)%mod;//(qkp(2,i)-1)*qkp(qkp(2,i),mod-2)表示的是(2^i-1)/2^i,为等比数列求和公式 ans=ans*qkp(sum,r-l+1)%mod;//答案为累乘的结果 }cout<<ans<<endl;
}

K.Subdivision

思路:根据第二个样例可看出,肯定是把点加到最后层次的边上为最优,因为若在很早就把点给加到边上了,后面本来可以往下走的边就被“堵塞”了,所以肯定是越晚加点越好,所以我们可以跑一遍bfs,若跑到叶子节点了或者和之前跑过的节点“碰头”了,则说明不能再晚加点了,只能现在加点,答案加上k-步数。若还能再跑,则答案+1,表示当前节点对于答案的贡献为1。注意判断步数与k的大小关系。

void solve() {int n,m,k,ans=1;cin>>n>>m>>k;for(int i=1; i<=m; i++) {int a,b;cin>>a>>b;e[a].push_back(b);e[b].push_back(a);}queue<PII>q;q.push({1,0});while(!q.empty()) {int u=q.front().first,fa=q.front().second;q.pop();for(auto x:e[u]) {if(x==fa)continue;if(dep[x]||e[x].size()==1) {//若跑到了根节点或者碰头了,则答案加上k-步数 ans+=max(0ll,k-dep[u]);continue;}dep[x]=dep[u]+1;if(dep[u]+1<=k)ans++;q.push({x,u});}}cout<<ans<<endl;
}

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

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

相关文章

ARM 架构是什么?

ARM&#xff08;Advanced RISC Machines&#xff09;架构是一种处理器架构&#xff0c;它是一种精简指令集计算机&#xff08;RISC&#xff09;架构。ARM架构最初由ARM Holdings&#xff08;现在是SoftBank Group的子公司&#xff09;开发&#xff0c;并在1980年代末和1990年代…

sort部分

sort主要针对文件内容的操作&#xff0c;对文件内容进行匹配或者过滤&#xff0c;排序 grep 过滤 针对文本内容进行过滤&#xff0c;也就是查找 -i&#xff1a;忽略大小写默认的&#xff0c;可以不加 -n&#xff1a;显示匹配的行号 -c&#xff1a;只统计匹配的行数 &#…

Python 列表 sort()函数使用详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 sort函数使用详解 1、升序降序2、sort()和sorted()的区别3、切片排序4、指定排序…

地面点云提取:Autoware预处理ray_ground_filter节点解析 + 解决ray_ground_filter无输出的问题

文章目录 一、解决Autoware的ray_ground_filter节点无点云输出的问题二、ray_ground_filter节点代码分析2.1.监听bask_link和velodyne之间的TF2.2 裁切过高点云2.3 消除雷达近身反射点的影响2.4 角度和距离微分&#xff08;转换到柱坐标&#xff09;2.5 地面判断(核心部分) 一、…

Python numpy求均值、保留几位小数

import numpy as nplist_test [0.21, 0.32]print(f{np.mean(list_test):.2f}) #保留两位小数 print(f{np.mean(list_test):.3f}) #保留三位小数

网络虚拟化相关的Linux接口介绍

Linux拥有丰富的网络虚拟化功能&#xff0c;能被虚拟机&#xff0c;容器还有云网络使用。在这篇文章中&#xff0c;我会给出所有通用网络虚拟化接口的简要介绍。没有代码分析&#xff0c;只有简短的接口介绍和在Linux上的使用操作。这系列接口都可以使用ip link命令实现。 这篇…

Linux进程控制(一)---进程创建和终止(写时拷贝,exit与_exit等)

目录 进程创建 fork()函数 子进程如何继承父进程的数据 1.创建时拷贝分离 2.写时拷贝★ 进程终止 进程终止时&#xff0c;操作系统做了什么&#xff1f; 进程终止的常见方式 代码运行完毕&#xff0c;结果正确 退出码★ 代码运行完毕&#xff0c;结果不正确 代码异…

Echarts柱状图横向滚动,如何实现从后往前滚动

Echarts柱状图横向滚动&#xff0c;如何实现从后往前滚动 设置开始和结束的横坐标&#xff0c;设置产生横向滚动条

MVX-Net Multimodal VoxelNet for 3D Object Detection 论文学习

论文链接&#xff1a;MVX-Net Multimodal VoxelNet for 3D Object Detection 1. 解决了什么问题&#xff1f; 2D 目标检测取得了显著成效&#xff0c;但由于输入模态的本质区别&#xff0c;CNN 无法直接应用在 3D 检测任务。LiDAR 能准确地定位到 3D 空间的物体&#xff0c;基…

Spring Batch之读数据库——JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

electron+vue3全家桶+vite项目搭建【23】url唤醒应用,并传递参数

文章目录 引入实现效果实现步骤测试代码 引入 demo项目地址 很多场景下我们都希望通过url快速唤醒应用&#xff0c;例如百度网盘&#xff0c;在网页中唤醒应用&#xff0c;并传递下载链接&#xff0c;在electron中要实现这样的效果&#xff0c;就需要针对不同的平台做对应的处…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…