【excrt】屠龙勇士(luogu 4774)

2024-01-29 23:32
文章标签 luogu 勇士 屠龙 excrt 4774

本文主要是介绍【excrt】屠龙勇士(luogu 4774),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正题

luogu 4774


题目大意

有n条龙,第i条血量为 a i a_i ai,回血量为 b i b_i bi,杀死后掉落伤害为 D i D_i Di的刀,初始有若干刀

杀第i条龙要用现有伤害比 a i a_i ai小的刀中伤害最大的(如果没有就用伤害最小的),对第i条龙造成x次伤害后,龙会连续回血,每次回 b i b_i bi,若某一时刻龙的血量为0,那么该龙死亡

现在问你找到最小的x,使其满足能杀死所有龙


解题思路

对于每条龙所选刀,可以用multiset存现有刀,然后直接查询符合的

设所选刀伤害为 d i d_i di,那么答案就是要求:

− ( a i − d i × x ) ≡ 0 ( m o d b i ) -(a_i-d_i\times x)\equiv 0(\mod b_i) (aidi×x)0(modbi)

d i × x ≡ a i ( m o d b i ) d_i\times x\equiv a_i(\mod b_i) di×xai(modbi)

该式子形如crt的式子

因为 b i b_i bi不保证互质,所以求解要用excrt


代码

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll __int128
#define N 100100
using namespace std;
ll T, n, m, p, x, y, g, X, mx, a[N], mo[N], b[N];
multiset<ll>d;
ll exgcd(ll a,ll b, ll &x, ll &y)
{if(!b){x = 1;y = 0;return a;}ll k = exgcd(b, a % b, x, y);ll z = y;y = x - a / b * y;x = z;return k;
}
ll read()
{char ch=getchar();ll ds=0,fs=1;while (ch<'0'||ch>'9') {if (ch=='-') fs=-1;ch=getchar();}while (ch>='0'&&ch<='9') ds=(ds<<3)+(ds<<1)+ch-48,ch=getchar();return ds*fs;
}
void writ(ll c) {if (c/10) writ(c/10); putchar(c%10+48); return;}
void write(ll s) {s<0?putchar(45),writ(-s):writ(s); putchar(10);return;}
int main()
{T = read();while(T--){mx = 0;p = 0;d.clear();n = read();m = read();for (ll i = 1; i <= n; ++i)a[i] = read();for (ll i = 1; i <= n; ++i)mo[i] = read();for (ll i = 1; i <= n; ++i)b[i] = read();for (ll i = 1; i <= m; ++i)d.insert(read());for (ll i = 1; i <= n; ++i)//找刀{multiset<ll>::iterator it = d.upper_bound(a[i]);if (it == d.begin()) x = *it;else x = *--it;d.erase(it);d.insert(b[i]);b[i] = x;mx = max(mx, (a[i] - 1) / b[i] + 1);//最小刀数}m = 1;X = 0;for (ll i = 1; i <= n; ++i)//excrt{g = exgcd(b[i] * m, mo[i], x, y);if ((a[i] - X * b[i]) % g){p = 1;break;}x = x * ((a[i] - X * b[i]) / g) % (mo[i] / g);X = X + x * m;m = m * (mo[i] / g);X = (X % m + m) % m;//最小解}if (p){puts("-1");continue;}if (X < mx) X += (mx - X + m - 1) / m * m;//保证剩余血量>0write(X);}return 0;
}

这篇关于【excrt】屠龙勇士(luogu 4774)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658510

相关文章

FHQ Treap模版(luogu P3369)

FHQ Treap模版(自用),带注释 #include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,root,idx;struct node{int l,r;int val,key,size;}tr[N];int getnew(int v){tr[++idx].val=v;//权值tr[idx].key=rand(

万龙觉醒辅助:屠龙攻略大全!VMOS云手机带你组团抓龙!

在《万龙觉醒》中,使用VMOS云手机能够为玩家提供专属定制版的云手机,不仅内置游戏安装包,还无需重新下载安装游戏。这一切都让玩家的游戏体验更加便捷和高效。VMOS云手机能够辅助游戏的自动化运行,支持24小时云端运行,同时还能无限多开,让玩家在多个账号之间无缝切换。此外,VMOS云手机支持安卓、iOS、PC、网页端多端互通,即使是低配手机,也能够畅玩《万龙觉醒》中的各大场景,享受极致的游戏体

LUOGU P2048 [NOI2010] 超级钢琴(贪心+堆)

原题链接:[NOI2010] 超级钢琴 题目大意: 给出一个长度为 n n n 的数组,且 a i a_{i} ai​ 可正可负,再给出三个数字 k , L , R k,L,R k,L,R 。 定义每个子数组的价值为其所有元素的和,你需要找到 k k k 个连续的子数组(可重叠但不可重复),且满足长度在 [ L , R ] [L,R] [L,R] 内,问你最后这 k k

每日一题~abc 367 F+luogu p10102(随机算法)

随机化的思想: 充分条件的计算代价比较大,想找个计算代价小的必要条件,但必要条件可能会出错,然后通过一些手段(比如随机映射)把这个出错的概率降低。(参考园子) 添加链接描述 题意: 两个数组,元素均为 1~N. q 次查询,判断 a b 数组,这一区间内的元素是否相同。(排列的顺序不重要,主要是元素的种类个数相同) n,q 均在2e5 内。 如果暴力,对每次查询,我们只能将这个区间内的所有数扫一

腾讯《地下城与勇士:起源》手游在部分安卓平台停止更新

原标题:因合约到期 《DNF手游》停止安卓平台更新   易采游戏网6月19日消息:《地下城与勇士:起源》(简称DNF手游)官方今天公告,因合作协议到期,自6月20日起,该游戏将不再在某些安卓应用商店提供。腾讯公司已经向华为、OPPO、vivo以及小米发送了正式通知,告知这四大渠道的DNF手游将不再更新。此外,有报告指出,《地下城与勇士:起源》已经从vivo应用商店中下架。   DNF手

《地下城与勇士》新手攻略,开荒必备!云手机多开教程!

《地下城与勇士》(DNF)是一款广受欢迎的多人在线动作角色扮演游戏。玩家将在游戏中扮演不同职业的角色,通过打怪、做任务、PK等方式不断提升自己,探索广阔的阿拉德大陆。游戏中设有丰富的副本、装备、技能系统,玩家可以通过各种活动获取装备和道具,提升自己的战斗力。 在游戏中,除了做好攻略之外,还要学会借助辅助工具节省时间,提升效率,接着大家一起去看看怎样操作: 在VMOS云手机官网中创建自己需要的端

luogu-P10570 [JRKSJ R8] 网球

题目传送门: [JRKSJ R8] 网球 - 洛谷https://www.luogu.com.cn/problem/P10570 解题思路         数学问题,暴力这个范围会超时。         首先,找出这两个数的最大公因数,将这两个数分别除以最大公因数,则这两个数互质,判断如果有一方<=c,求出他们翻倍的倍数(ceil(c*1.0/min(a,b))),那么将他们分别乘ceil

DNF手游攻略:勇士进阶指南!

在即将到来的6月5日,《DNF手游》将迎来一场盛大的更新,此次更新带来了大量新内容和玩法,极大丰富了游戏的体验。本文将为广大玩家详细解析此次更新的亮点,包括新增的组队挑战玩法“罗特斯入门团本”、新星使宠物的推出、宠物进化功能的开放,以及六月下旬即将到来的李小龙联动内容。无论你是新手玩家还是资深老玩家,这篇攻略都将为你提供全方位的指导和建议,助你在新版本中迅速上手,收获最佳游戏体验。 一、

做算法是屠龙,做工程是狩猎,做数据是养猪!

近来一段时间,能明显感到,想入行 AI 的人越来越多,而且增幅越来越大。 缘起 为什么这么多人想入行 AI 呢?真的是对计算机科学研究或者扩展人类智能抱着无限的热忱吗?说白了,大多数人是为了高薪。 人们为了获得更高的回报而做出选择、努力工作,原本这是个非常正当的事情,但是关键在于:如何找对路径。 想要入行,总得知道这个行业里面都有什么样的岗位,分别是干什么的吧。 本文中,我们将从直观

剖析勇士如何成为新赛季夺冠热门:基于Spark GraphFrames的金州勇士传球网络分析

databricks 最近发布了 GraphFrames,这是一个用 DataFrames 封装图处理过程的Spark插件。 我评估了网络分析并且利用丰富的NBA.com的数据对金州勇士的传球网络进行可视化。 金州勇士的传球网络 传接球 联盟 MVP Stephen Curry 接到了大多数的传球,而团队中的 MVP Draymond Green则发动了最多的传球。