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. Storm框架:如何消费RabbitMq消息(代码案例)

    1.定义拓扑topology public class MessageTopology { public static void main(String[] args) throws Exceptio ...

  2. 有趣:256个class选择器可以干掉1个id选择器——张鑫旭

    我们应该都知道,从选择器得分权重上将,id选择器(#aaa{})和class选择器(.aaa{})完全不是一个数量级的,前者:1-0-0; 而后者为0-1-0.因此: #id { color:dark ...

  3. thinkPHP的几个系统常量

    echo "当前请求:" . __SELF__ . '<br>'; echo "当前分组:" . __MODULE__ . '<br>' ...

  4. 前端独立引用 ejs模版

    ejs 用法不再多说,网自行查阅.一个是基于nodeJS平台运行的EJS,另外一个是在浏览器执行的EJS.这里要说的是html 独立引入ejs.min.js 使用的一个注意点. 如:index.htm ...

  5. ubuntu下使用python3的有些库时,解决"raise ImportError(str(msg) + ', please install the python3-tk package') ImportError: No module named '_tkinter', please install the python3-tk package"的错误

    问题: 在Ubuntu下使用matplotlib这个库时,运行时出现如下错误: raise ImportError(str(msg) + ', please install the python3-t ...

  6. Hbase-indexer常用命令

    1. 启动hbase-indexer服务 nohup ./hbase-indexer server -z s1:,s2:,s3:,s4:,s5: > /work/hbase-indexer.lo ...

  7. Linux 网络流量查看 Linux ip traffic monitor

    Network monitoring on Linux This post mentions some linux command line tools that can be used to mon ...

  8. Android微信支付SDK开发

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  9. linux centos7最小化安装桥接模式网络设置、xshell、xftf

    一.网络连接设置1.桥接模式 使用电脑真实网卡,可以和自己的电脑连接,也可以和外部网络连接2.NAT模式 使用wmware network adapter vmnet8虚拟网卡,可以和自己的电脑连接, ...

  10. Java中的Number和Math类简单介绍

    Java Number类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 实例: int a = 5000; float b = 13.65 ...