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

news2024/12/28 3:16:37

目录

D.Chocolate

H.Matches

J.Roulette

K.Subdivision

M.Water


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;
}

M.Water

思路:首先,该题的x可以表示为sA+rB,也就是sA+rB=x。因为+A和+B都可以通过倒满一杯水然后喝掉来获得,而-A可以通过用一直用满杯的B杯倒满A杯,直至B杯中剩余kB-A量的水。-B亦可以通过次方式获得。既然+A,+B,-A,-B都可以获得,那么我们能够得到的水量自然能用sA+rB来表示。

根据裴蜀定理,若无解,则x%gcd(s,r)!=0,反之则一定有解。而这个sA+rB的式子可以总共分为两种情况:

1.s*r>=0,并且s和r不能同时小于等于0,因为x>=0。此时的最小操作数很显然,就是重复倒s杯容量为A的水然后喝下,重复倒r杯容量为B的水然后喝下,总操作数为2*(r+s)。

2.s*r<0,也就是s和r中有一个小于0的情况。不妨设s>r且s>0,r<0。此时表达式可以先转换一下:

sA+rB=>(s+r)A-r(A-B)

(s+r)A可以由s*r>=0时一样的方式来获得,操作数为2*(r+s),而-r(A-B)则可以通过:先倒满A杯->将A杯的水倒入B杯(此时A杯剩A-B的水,B杯满水)->喝掉A-B->倒掉B,总共四步来获得。并且最后那一步的B杯不用倒,因为B杯已经用不到了,省下了一步,总共是4*(-r)-1步。

然后我们将这两部代入公式得到:

(s+r)A-r(A-B)

=>2*(r+s)+4*(-r)-1

=>2*s-2*r-1=>2*(s-r)-1

因此,此时的操作数至少为2*abs(s-r)+1步。

最后,我们可以先通过exgcd找出一组解,也就是s0*A+r0*B=x中的s0和r0。又因为该式子可以表示为(s0+t*B)A+(r0-t*A)B=x,也就是说解可以表示为ss=s0+t*B,rr=r0-t*A,又因为答案可以表示为

2*abs(s-r)-1

=>2*abs(ss-rr)-1

=>2*abs(s0-r0+t*(A+B))-1

所以s0-r0+t*(A+B)离0越近答案越小,所以我们需要在解的原点附近取min值。

代码:

void exgcd(int a,int b,int &x,int &y) {
	if(!b)x=1,y=0;
	else exgcd(b,a%b,y,x),y-=a/b*x;
}
void f(int t) {
	int rr=s+b*t,ss=r-a*t;
	if(rr>=0&&ss>=0)ans=min(ans,2*(rr+ss));
	else ans=min(ans,2*abs(rr-ss)-1);
}
void solve() {
	ans=inf;
	cin>>a>>b>>x;
	int g=__gcd(a,b);
	if(x%g) {
		cout<<-1<<endl;
		return;
	}
	exgcd(a,b,s,r);
	a/=g,b/=g,x/=g,s*=x,r*=x;
	for(int i=-s/b-1; i<=-s/b+1; i++)f(i);
	for(int i=r/a-1; i<=r/a+1; i++)f(i);
	cout<<ans<<endl;
}

 

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

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

相关文章

使用对象解构赋值,将对象的某些属性赋值给另一个对象

在处理接口返回的数据时&#xff0c;我需要将接口返回的数据&#xff08;对象&#xff09;的某些属性用另一个对象进行接收&#xff0c;学习对象解构赋值之前&#xff0c;我一直使用的都是最笨的方法&#xff1a; this.formData.projectId res.data.projectId this.formData.…

奖牌数领跑是为何?解码长沙华中医卫科技中等职业学校的国防教育成功之道

近些年&#xff0c;越来越多的学生、家长、企业开始重新审视职业教育的价值。在产教融合的大背景下&#xff0c;职业教育已经成为了高新产业发展的人才引擎&#xff0c;职业教育的教学模式、软硬件配置乃至未来毕业生的就业情况&#xff0c;已完全变了模样。 实际上&#xff0…

Linux环境下的开发工具(yum、vim、gdb、make/Makefile)

目录 yum vim GDB调试 Makefile yum 在Linux系统上安装软件的方式有 下载到程序的源代码&#xff0c;自行进行编译&#xff0c;得到可执行程序。 获取rpm安装包&#xff0c;通过rpm命令进行安装。&#xff08;未解决软件的依赖关系&#xff09; 通过yum进行安装软件。&…

Android APP性能及专项测试

Android篇 1. 性能测试 Android性能测试分为两类&#xff1a; 1、一类为rom版本&#xff08;系统&#xff09;的性能测试 2、一类为应用app的性能测试Android的app性能测试包括的测试项比如&#xff1a; 1、资源消耗 2、内存泄露 3、电量功耗 4、耗时 5、网络流量消耗 6、移动…

evenloop事件循环机制

宏任务&#xff1a;script&#xff08;整体代码&#xff09;&#xff0c;setTimeout&#xff0c;setInterval&#xff0c;setImmediate&#xff0c;i/o&#xff0c;UIrendering 微任务&#xff1a;promise&#xff0c;async/await&#xff0c;Object.observe&#xff0c;Mutati…

Leetcode-每日一题【19.删除链表的倒数第N个结点】

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1输出&#xff1a;[] 示例 3&#x…

没有人能真正精通C++

任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了&#xff0c;是的&#xff0c;今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编程语言了&#xff0c;甚至很多程序员已经从手动编码开始向AI编码转型…

050、事务设计之Percolator事务模型

Percolator 背景 Bigtable: 大表打散每行到各个节点&#xff0c;每一行作为一个kv。解决的问题 一个事务涉及的行在多个节点&#xff0c;如何用单行对一个事务进行控制&#xff0c;实现原子性。 快照隔离级别&#xff08;snapshot &#xff09; 白色点&#xff1a;代表事务开始…

.Net5 mvc项目UseBrowserLink插件功能失效的原因

前期基于.Net Framework创建的Web项目&#xff0c;使用了BrowserLink插件协助前端开发&#xff0c;功能一直都比较稳定&#xff0c;后来项目迁到.Net5 &#xff0c;发现BrowserLink 已经失去了从浏览器定位到项目源代码的功能&#xff0c;希望在后面的版本还能继续支持此版本&a…

分区类型ID一键变身!快速改变分区类型ID的简单方法

分区类型ID是什么&#xff1f; 想要改变分区类型ID&#xff0c;先得明白分区类型ID是什么。大多数电脑用户可能只熟悉分区和分区类型&#xff0c;实际上有5种分区类型&#xff1a;主分区、可扩展固件接口&#xff08;EFI&#xff09;、扩展分区、逻辑分区和Microsoft保留分…

gitbash2.41安装教程——2023.07

文章目录 1、下载安装包2、安装 1、下载安装包 进入官网下载&#xff0c;官网链接 上面有多种系统可以选择&#xff0c;我是windows&#xff0c;点击windows进行下载 这里可以直接下载最新版本的git 2.41.0 64位。 下载可能有点慢&#xff0c;耐心等待。 2、安装 下载完…

什么是云应用程序?

应用程序优先的云服务的日益普及导致应用程序与云服务的融合程度比以前更深。应用程序和云之间的运行时边界正在从虚拟机转移到容器和函数。集成边界正在从仅访问数据库和消息代理转向应用程序的机械部分混合并在云中运行的边界。在这个最终架构中&#xff0c;应用程序是“云绑…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示&#xff0c;可能是没有包含头文件 在运行时&#xff0c;报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码&#xff1a;设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

【java】【基础2】程序流程控制

目录 一、最经典的三种执行顺序 二、分支结构 2.1 if 2.2 switch 2.3 if与switch区别 三、循环结构 3.1 for循环 3.2 while循环 3.3 do-while循环 3.4 三种循环区别 3.5 补充知识&#xff1a;死循环 3.6 补充知识&#xff1a;循环嵌套 四、跳转关键字&#xff1a;br…

轮廓提取demo

note 步骤&#xff1a; 1.滤波(使用高斯核对原图卷积) 2.取梯度(使用sobel核对步骤1之后的图卷积得到x,y两个方向的梯度分量) 3.合成梯度图(x,y两个方向的梯度分量相加) 4.取梯度平方和矩阵(x*x y*y) 5.取八邻域掩膜(3x3矩阵) 6.根据掩膜&#xff0c;合成梯度图&#x…

AIC8800 WIFI调试记录

问题&#xff1a;AIC8800 USB 接口WIFI模块无法识别 现象&#xff1a; 上层&#xff1a;WIFI打不开 驱动层&#xff1a;usb无法识别到AIC8800模块 A133P:/ $ lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 001 Device 002: ID 1a40:0101 Bus 002 Device 001: ID 1d6b:0001 Bus…

postgresql regular lock常规锁申请与释放 内幕 以及fastpath快速申请优化的取舍

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 定义 每种常规锁都需要定义几个要素&#xff0c;它由结构体 Lo…

MySQL中这14个小玩意,让人眼前一亮!!!

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

跨境电商市场迎来发展新机遇,如何利用IPIDEA扩大市场份额

根据Adobe Analytics的数据&#xff0c;美国消费者在亚马逊Prime Day期间花费了127亿美元&#xff0c;同比增长6.1%&#xff0c;创下历史新高。这一数据表明&#xff0c;亚马逊的会员日促销活动&#xff0c;持续吸引着消费者的关注和购买欲。跨境电商的迅速发展为普通商家提供了…

不得不会的软件测试bug分析定位技巧

目录 1.web前端 2.web后端 3.性能测试 身为测试工程师&#xff0c;总有一道绕不过去的坎就是定位bug&#xff0c;这其实是非常花费时间的。 也许有很多人不以为然&#xff0c;觉得无非就是发现bug后提交bug管理系统&#xff0c;描述操作步骤&#xff0c;预期结果和实际结果…