首页 > 其他分享 >NOIP2024模拟赛10:热烈张扬

NOIP2024模拟赛10:热烈张扬

时间:2024-06-01 17:10:38浏览次数:29  
标签:10 p1 int 张扬 rd fa dep buf NOIP2024

NOIP2024模拟赛10:热烈张扬

T1

  • 一句话题意:给定一颗树和两个玩家的起点 \(a,b\) 和各自的移动速度 \(da,db\).问:如果二人均以最优策略移动,问最后谁是赢家(先走到对方当前位置)

  • 标签:LCA,思维,博弈

  • 不妨设 \(a\) 是速度快的,\(b\) 是速度慢的。

  • 结论一:若二者初始距离 \(\le\) 先手的初始速度,则先手第一步就赢.

    除此以外:

  • 结论2:\(a\) 总是可以通过若干步同 \(b\) 调整距离,使得最终 \(a\) 可以跳到 \(b\), 但 \(b\) 跳不到 \(a\).【这很好理解】

  • 结论3:若两者速度相同,平局.

  • 时间复杂度: \(O(T(NlogN+QlogN))\)

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
using namespace std;
using ll = long long;
char buf[100],*p1=buf,*p2=buf;
inline int gc(){return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100,stdin),p1==p2)?EOF:*p1++;}
inline int rd(){
	int x=0; char ch;
	while(!isdigit(ch=gc()));
	do x=(x<<3)+(x<<1)+(ch^48); while(isdigit(ch=gc()));
	return x;
}
const int N=2e6+5;
int fa[N][22],dep[N];
int n,q,d,t;
vector<int> G[N];
void ini(int u,int f){
	fa[u][0]=f;
	dep[u]=dep[f]+1;
	F(i,1,20) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(auto v:G[u]){
		if(v==f) continue;
		ini(v,u);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	G(i,20,0) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	if(x==y) return x;
	G(i,20,0) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int calc(int x,int y){
	int p=lca(x,y);
	return dep[x]+dep[y]-2*dep[p];
}
signed main(){
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	d=rd(),t=rd();
	while(t--){
		n=rd(),q=rd();
		F(i,1,n-1){
			int u=rd(),v=rd();
			G[u].emplace_back(v);
			G[v].emplace_back(u);
		}
		ini(1,0);
		while(q--){
			int a=rd(),b=rd(),da=rd(),db=rd();
			int dis=calc(a,b);
			if(da>db) puts("Zayin");
			else if(da==db){
				if(dis<=da) puts("Zayin");
				else puts("Draw");
			}
			else{
				if(dis<=da) puts("Zayin");
				else puts("Ziyin");
			}
		}
		F(i,1,n) {
			G[i].clear();	
		}
	}
	return 0;
} 
  • 总结:
    • 看数据范围这么大,结论应该往简单了猜,否则肯定T掉!
    • 关于 题目条件"最优策略" 的使用:往往是在 "特定一方尽量优的情况下,保证另一方被动中的最优".

标签:10,p1,int,张扬,rd,fa,dep,buf,NOIP2024
From: https://www.cnblogs.com/superl61/p/18226159

相关文章

  • 力扣刷題---回文數 擊敗100%用戶的解法
    題目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:从左向右读,为-121。从右......
  • 学习前端的知识总结10
    CSS浮动网页布局方式有以下五种:标准流(普通流、文档流)︰网页按照元素的书写顺序依次排列浮动定位Flexbox和Grid(自适应布局)标准流是由块级元素和行内元素按照默认规定的方式来排列,块级就是占一行,行内元素一行放好多个元素。1.浮动浮动最典型的应用:可以让多个块级元素一行......
  • GD32F103VET6通过仰邦BX_6K1字符卡控制96*16LED显示
    1.GD32F103VET6介绍        GD32系列单片机和STM32系列单片机在应用上十分类似,需要注意的是本系统GD32的最大时钟频率是108MHz。本系统的功能是实现LORA网关,GD32F103VET6相较于STM32系列单片机的性价比更高。          GD32F103VET6是一款基于Arm®的32位......
  • Day 11 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式
    20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.有效的括号.html思考classSolution:......
  • YOLOv10的改进、部署和微调训练总结
    YOLO模型因其在计算成本和检测性能之间的平衡而在实时目标检测中很受欢迎。前几天YOLOv10也刚刚发布了。我们这篇文章就来看看YOLOv10有哪些改进,如何部署,以及微调。YOLOv10通过无nms的训练解决了延迟问题,作者为无nms训练引入了一致的双任务,同时获得了具有竞争力的性能和低推理延......
  • 洛谷1090 合并果子 【贪心】
    [NOIP2004提高组]合并果子/[USACO06NOV]FenceRepairG题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出......
  • 转 Win10 共享文件夹、打印机。 使用微软账户登录共享文件夹,如何确认账号密码。
    目的是通过该方法实现了局域网内 共享目录给电视盒子,放在电视盒子使用。感谢不爱吃山楂大佬https://zhuanlan.zhihu.com/p/446872571   Win10共享文件夹、打印机。使用微软账户登录共享文件夹,如何确认账号密码。......
  • 微软官方出品微服务架构:10个.Net开源项目
    今天一起盘点下,11月份推荐的10个.Net开源项目(点击标题查看详情)。1、一个高性能类型安全的.NET枚举实用开源库Enums.NET是一个.NET枚举实用程序库,专注于为枚举提供丰富的操作方法。它支持.NETFramework和.NetCore。它主要优点表现在类型安全、高性能、丰富的操作方法和易于使......
  • 10.Golang中的数组
    1、Array(数组)的介绍数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如int、string等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在Golang中数组是一个长度固定的数据类型,数组的长......
  • 【华为OD】D卷真题100分:分割数组的最大差值 Java代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、Java、python、C、C++代码实现:【华为OD】D卷真题100分:分割数组的最大差值JavaScript代码实现[思路+......