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

前置:

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. React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)

    React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例) TextInput组件介绍 TextInput是一个允许用户在应用中通过键盘输入文本的基本组 ...

  2. Window.scrollTo()

    摘要 滚动到文档中的某个坐标. 语法 window.scrollTo(x-coord,y-coord ) window.scrollTo(options) 参数 x-coord 是文档中的横轴坐标. ...

  3. 将表单数据转换为json代码分享

    <body> <form action="#" method="post" id="form1"> <inpu ...

  4. display设置弹性盒布局

    转自:http://blog.csdn.net/itbwy/article/details/52648711 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖  ...

  5. 认识SQL

    一.SQL介绍 SQL 是用于访问和处理数据库的标准的计算机语言. i.What? SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 ii.How? ...

  6. 关于浏览器兼容问题——还有移动端meta问题

    <!DOCTYPE html><!--[if lt IE 7]> <html dir="ltr" lang="en-US" cla ...

  7. jdbc工具类1.0

    package cn.zhouzhou; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManag ...

  8. Java使用RabbitMQ之整合Spring(生产者)

    依赖包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.amq ...

  9. Spring Boot 构建电商基础秒杀项目 (十二) 总结 (完结)

    SpringBoot构建电商基础秒杀项目 学习笔记 系统架构 存在问题 如何发现容量问题 如何使得系统水平扩展 查询效率低下 活动开始前页面被疯狂刷新 库存行锁问题 下单操作步骤多,缓慢 浪涌流量如何 ...

  10. Simple Use IEnumerable<T>

    Private static IEnumerable<T> FunDemo(T para) { while(...) { .... yield return Obj; } } static ...