Description

Input

Output

Sample Input

2
3 3
3 5 7
4 6 10
7 3 9
1 9 1000
3 2
3 5 6
4 8 7
1 1 1
1 1

Sample Output

59
-1

Solution

当时同步赛的时候写出来了……只不过忘了是爆$long~long$还是小细节写爆了只有$75$……

当时蠢的一比直接强上了一颗$splay$强行增加码量……现在觉得当时太蠢了然后就重写了一遍……

首先对于这个题,每次使用的剑可以发现是固定的,这个可以使用$set$来求出来。

知道了攻击力,知道了龙的血量和回血,就可以$exgcd$求出用多少刀的倍数砍死龙了。这其实是一个同余方程。

把所有同余方程搞出来,然后$exCRT$求解同余方程组就完事了QAQ

记得用快速乘还有特判一下回血全是$1$的情况。

Code

 #include<iostream>
#include<cstdio>
#include<set>
#define N (100009)
#define LL long long
using namespace std; LL T,n,m,x,a[N],p[N],v[N],Ai[N],Mod[N];
multiset<LL>S; LL Mul(LL a,LL b,LL MOD)
{
LL tmp=a*b-(LL)((long double)a*b/MOD+0.1)*MOD;
return tmp<?tmp+MOD:tmp;
} void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if (!b) {d=a; x=; y=; return;}
exgcd(b,a%b,d,y,x); y-=x*(a/b);
} LL Find(LL x)
{
multiset<LL>::iterator it;
it=S.upper_bound(x);
if (it!=S.begin()) it--;
LL ans=*it;
S.erase(it);
return ans;
} LL exCRT()
{
LL M=Mod[],A=Ai[],d,x,y,t;
for (int i=; i<=n; ++i)
{
exgcd(M,Mod[i],d,x,y);
if ((Ai[i]-A)%d) return -;
t=Mod[i]/d; x=(x%t+t)%t; x=Mul(x,(Ai[i]-A)/d,t);
A=M*x+A; M=M/d*Mod[i]; A%=M;
}
A=(A%M+M)%M;
return A;
} int main()
{
scanf("%lld",&T);
while (T--)
{
S.clear();
scanf("%lld%lld",&n,&m);
for (int i=; i<=n; ++i) scanf("%lld",&a[i]);
for (int i=; i<=n; ++i) scanf("%lld",&p[i]);
for (int i=; i<=n; ++i) scanf("%lld",&v[i]);
for (int i=; i<=m; ++i) scanf("%lld",&x), S.insert(x); LL maxn=-,flag=,all_one=;
for (int i=; i<=n; ++i)
{
LL A=Find(a[i]),B=p[i],C=a[i],x,y,d;
exgcd(A,B,d,x,y);
if (C%d) {flag=; break;}
x=(x%B+B)%B;
Ai[i]=Mul(x,C/d,B); Mod[i]=B/d;
if (p[i]!=) all_one=;
maxn=max(maxn,a[i]/A+(a[i]%A!=));
S.insert(v[i]);
} if (!flag) {puts("-1"); continue;}
if (all_one) printf("%lld\n",maxn);
else printf("%lld\n",exCRT());
}
}

BZOJ5418:[NOI2018]屠龙勇士(exCRT,exgcd,set)的更多相关文章

  1. BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set

    题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...

  2. BZOJ5418 NOI2018屠龙勇士(excrt)

    显然multiset求出每次用哪把剑.注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1.比较坑的是还可能存在ai=pi,稍微考虑一下. 剩下的部分即解bix≡ai(mod ...

  3. Luogu4774 NOI2018 屠龙勇士 ExCRT

    传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...

  4. [NOI2018]屠龙勇士(exCRT)

    首先很明显剑的选择是唯一的,直接用multiset即可. 接下来可以发现每条龙都是一个模线性方程.设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$. ...

  5. BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset

    题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...

  6. BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt

    BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...

  7. P4774 [NOI2018]屠龙勇士

    P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...

  8. uoj396 [NOI2018]屠龙勇士

    [NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...

  9. [洛谷P4774] [NOI2018]屠龙勇士

    洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...

随机推荐

  1. mysql安装配置、主从复制配置详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8213723.html 邮箱:moyi@moyib ...

  2. Linux安装jdk,编写helloworld程序

    今天学习了Linux安装jdk,做个笔记记录一下. 第一步,确定Linux是32位的还是64位的,然后到oracle官网上下载对应版本的jdk,一般下载.tar.gz文件.查看Linux的版本的命令是 ...

  3. UVA11624(KB1-J)

    Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...

  4. 第二十四天- 模块导入 import from xxx import xxx

    # 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...

  5. [转]关于浏览器css选择器性能优化

    作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...

  6. HackerRank Special Substrings 回文树+后缀自动机+set

    传送门 既然要求对每个前缀都求出答案,不难想到应该用回文树求出所有本质不同的回文子串. 然后考虑如何对这些回文子串的前缀进行去重. 结论:答案等于所有本质不同的回文子串长之和减去字典序相邻的回文子串的 ...

  7. Angular7 Drag and Drop

    完整代码在最后,下面讲解以此代码为例 1.环境配置 1.1 安装@angular/material.@angular/cdk cnpm install --save @angular/material ...

  8. iview select下拉bug

    1场景:弹框内有一个下拉组件(支持搜索),当选择完数据后弹框关闭,再次打开后,下拉框内的数据是刚才选中的数据.原因:分析后觉得是搜索内容没有清空,导致下拉的数据只有一个解决:调用下setQuery方法 ...

  9. io流中read方法使用不当导致运行异常的一点

    public class CopyMp3test { public static void main(String[] args) throws IOException { FileInputStre ...

  10. docker实战 (1) 关于docker的安装

    docker定义: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...