真是个简单坑题...++

前置:

exgcdexCRTSTL-multiset

读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求。攻击最少显然应该对于每一条龙都操作一次,即攻击\(x\)次。设对于第\(i\)条龙,攻击时使用的剑的攻击力为\(us_i\),生命值为\(hp_i\),恢复能力为\(rh_i\),则\(us_ix\equiv hp_i\pmod{rh_i}\)。然后仔细阅读数据范围和提示,会发现存在\(hp_i>rh_i\)的情况,此时\(rh_i=1\),也即求\(\max\{\Large\lceil\frac{hp_i}{us_i}\rceil\normalsize\}\)。对于\(hp_i\leq rh_i\)的情况,可以直接用exCRT求答案。而exCRT适用于\(x\)系数为\(1\)的情况,此处需要用exgcd求出\(\large\frac{hp_i}{us_i}\normalsize\pmod{rh_i}\),转化为\(x\equiv a_i\pmod{p_i}\)形式。剩下的就只需要exCRT板子了。可能会爆long long的乘法转用龟速乘就好了。

#include<bits/stdc++.h>

using namespace std;

void qread(long long &xx){
xx=0;int ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
xx=xx*10+ch-'0';
ch=getchar();
}
} const int N=1e5+5; long long t,n,m,ans,lcm,mx; long long hp[N],rh[N],aw[N],st[N],us[N],a[N],p[N]; multiset<long long>ms; long long mul(long long u,long long v,long long MOD){
long long rep=0;
while(v>0){
if(v&1){
rep=(rep+u)%MOD;
}
u=(u+u)%MOD;
v>>=1;
}
return rep;
} long long exgcd(long long u,long long v,long long &x,long long &y){
if(v==0){
x=1;y=0;
return u;
}
long long _w=exgcd(v,u%v,y,x);
y-=u/v*x;
return _w;
} long long x,y; void excrt(){
ans=a[1];lcm=p[1];
for(int i=2;i<=n;i++){
long long rep=(((a[i]-ans)%p[i])+p[i])%p[i];
long long g=exgcd(lcm,p[i],x,y);
long long pg=p[i]/g;
if(rep%g){
ans=-1;
return;
}
x=mul(x,rep/g,pg);
ans+=lcm*x;
lcm=lcm*pg;
ans=((ans%lcm)+lcm)%lcm;
}
ans=((ans%lcm)+lcm)%lcm;
} bool check(){
for(int i=1;i<=n;i++){
if(hp[i]>rh[i]){
return 0;
}
}
return 1;
} int main(){
qread(t);
while(t--){
ans=mx=0;
qread(n);qread(m);
for(int i=1;i<=n;i++){
qread(hp[i]);
}
for(int i=1;i<=n;i++){
qread(rh[i]);
}
for(int i=1;i<=n;i++){
qread(aw[i]);
}
for(int i=1;i<=m;i++){
qread(st[i]);
}
ms.clear();
for(int i=1;i<=m;i++){
ms.insert(st[i]);
}
multiset<long long>::iterator ite;
for(int i=1;i<=n;i++){
ite=ms.upper_bound(hp[i]);
if(ite!=ms.begin()){
--ite;
}
us[i]=*ite;
ms.erase(ite);
ms.insert(aw[i]);
}
for(int i=1;i<=n;i++){
mx=max(mx,(long long)ceil((double)hp[i]/(double)us[i]));
long long g=exgcd(us[i],rh[i],x,y);
p[i]=rh[i]/g;
if(hp[i]%g){
ans=-1;
break;
}
x=((x%p[i])+p[i])%p[i];
a[i]=mul(hp[i]/g,x,p[i]);
}
if(!ans){
if(check()){
excrt();
}
else{
for(int i=1;i<=n;i++){
ans=max(ans,(long long)ceil((double)hp[i]/(double)us[i]));
}
}
}
printf("%lld\n",ans);
}
return 0;
}

Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】的更多相关文章

  1. 洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士(扩展中国剩余定理)

    题目链接: 洛谷 BZOJ LOJ 题目大意:这么长的题面,就饶了我吧emmm 这题第一眼看上去没法列出同余方程组.为什么?好像不知道用哪把剑杀哪条龙…… 仔细一看,要按顺序杀龙,所以获得的剑出现的顺 ...

  2. LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】

    好久没写了,写一篇凑个数. 题目分析: 这题不难想,讲一下中国剩余定理怎么扩展. 考虑$$\left\{\begin{matrix}x \equiv a\pmod{b}\\ x \equiv c\pm ...

  3. P4774 [NOI2018]屠龙勇士

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

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

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

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

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

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

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

  7. uoj396 [NOI2018]屠龙勇士

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

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

    链接:P4774 前言: 交了18遍最后发现是多组数据没清空/ll 题意: 其实就是个扩中. 分析过程: 首先发现根据题目描述的选择剑的方式,每条龙对应的剑都是固定的,有查询前驱,后继(在该数不存在前 ...

  9. luogu P4774 [NOI2018]屠龙勇士

    传送门 这题真的是送温暖啊qwq,而且最重要的是yyb巨佬在Day2前几天正好学了crt,还写了博客 然而我都没仔细看,结果我就同步赛打铁了QAQ 我们可以先根据题意,使用set维护,求出每次的攻击力 ...

随机推荐

  1. 多线程系列之四:Guarded Suspension 模式

    一,什么是Guarded Suspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待.这种模式通过让线程等待来保证实例的安全性 二,实现一个简单的线程间通信的例子 一个线程(Clie ...

  2. Git使用过程中的问题

    Q-1:怎么切换到远程的分支 本地已经有一个代码库了(是从github上clone的),但是现在远程库中一个新的branch,怎么拉取远程分支,并在本地创建该分支(内容一样).how to do? # ...

  3. jenkins 迁移后 提示 反向代理设置有误

    jenkins报:反向代理设置有误-布布扣-bubuko.comhttp://www.bubuko.com/infodetail-2038758.html [Linux][Jenkins]系统配置报反 ...

  4. jmeter压测参数设定(转)

    jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...

  5. MySQL 性能调优之存储引擎

    原文:http://bbs.landingbj.com/t-0-246222-1.html        http://bbs.landingbj.com/t-0-245851-1.html MySQ ...

  6. RESTful架构详解

    什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移,它首次出现在2000年Roy Fielding的博士论文中.Roy Fieldi ...

  7. [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比

    迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比 Intel 最强CPU 从最开始的双核 到现在的 28核 发展迅猛. https://www.cnbeta.com/article ...

  8. windows环境下protobuf的java操作{编译,序列化,反序列化}

    google protocol buffer的使用和原理 概况: Protocol Buffers(也就是protobuf)是谷歌的语言中立的.平台中立的.可扩展的用于序列化结构化的数据: windo ...

  9. redis 的简单命令

    以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis > re ...

  10. JavaSE从入门到精通

      1.JavaSE的安装 windows下安装完成后,配置环境变量如下: JAVA_HOME       C:\Program Files (x86)\Java\jdk1.8.0_91 CLASSP ...