BZOJ5418:[NOI2018]屠龙勇士(exCRT,exgcd,set)
Description

Input

Output

Sample Input
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)的更多相关文章
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- BZOJ5418 NOI2018屠龙勇士(excrt)
显然multiset求出每次用哪把剑.注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1.比较坑的是还可能存在ai=pi,稍微考虑一下. 剩下的部分即解bix≡ai(mod ...
- Luogu4774 NOI2018 屠龙勇士 ExCRT
传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...
- [NOI2018]屠龙勇士(exCRT)
首先很明显剑的选择是唯一的,直接用multiset即可. 接下来可以发现每条龙都是一个模线性方程.设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$. ...
- BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset
题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...
- BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
- P4774 [NOI2018]屠龙勇士
P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...
- uoj396 [NOI2018]屠龙勇士
[NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
随机推荐
- java SE 入门之运算符(第三篇)
在 java 中主要有以上运算符,分为 赋值运算符 ,算术运算符.关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符). 我们一起来学习下吧! 一.赋值运算符 赋值运算符主要有五个.分别是 ...
- SQL查询出某字段不等于某值的行(其中有为NULL的字段)
表1如下:TBD1100 TBD1101 TBD1102------------------------------------------ 1001 水果 ...
- [android] 手机卫士黑名单功能(ListView优化)
上一篇记录了使用ListView展示出来了100条数据,当慢慢拖动的时候,不会有问题,但是当拖动很快的时候,应用会报anr错误 查看错误日志,看到报OutOfMemoryError,内存不足 List ...
- Freemarker详解一
1 截取字符串有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度<#if title.content?length lt 8> ...
- 纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比 (转载)
纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比 Spring Cloud Spring Cloud Spring Cloud Gatew ...
- LeetCode CombinationSum II
class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num ...
- MySql基本学习知识点:
1.Mysql的简介: (1):常识: MySQL是一种关系数据库管理系统,是一种开源软件 由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购.2009年,SUN又被Oracle收购 ...
- Python解析SWAN气象雷达数据--(解析、生成ASCII、Image、netCDF)
解析 from datetime import * import time import calendar import json import numpy as np from struct i ...
- python代码打包发布
背景 本文介绍了python中一种最简单的代码结构的打包方式 包名称 我们先给我们的包取个名字,python包起名需要符合下面的规范 全部小写 在pypi上是唯一的 下划线分隔或没有单词分隔符(不要使 ...
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordin al not in range(128)——解决方案备注
在vim中使用ycm插件时,偶尔会出现: “UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ord ...