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

前置:

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. python_format格式化输出、while else、逻辑运算符、编码初识

    1.格式化输出 .%d  %s  格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...

  2. MYSQL 三元 函数

    mysql函数之流程控制-FreeOAhttp://www.freeoa.net/osuport/db/mysql-control-fun_2143.html mysql如何利用三元算法判断数字奇偶性 ...

  3. gethostbyname用法

    //会优先查询解析%windir%\system32\drivers\etc\hosts中静态dns表 //一个域名可对应多个IP hostent->h_addr_list ==> 是in ...

  4. 便捷的ajax请求

    为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...

  5. laravel服务容器

    laravel框架底层解析 本文参考陈昊<Laravel框架关键技术解析>,搭建一个属于自己的简化版服务容器.其中涉及到反射.自动加载,还是需要去了解一下. laravel服务容器 建立项 ...

  6. word的"bug"

    发表博客发现,从word复制文本到chrome浏览器上的博客时, 如果复制完后立即关闭word,那么将无法粘贴到通过chrome浏览器访问的博客上,也无法粘贴到记事本上: 但是复制完立即关闭word后 ...

  7. 996.ICU

    996.ICU https://github.com/996icu/996.ICU https://www.zhihu.com/question/317722302 LICENSE https://g ...

  8. 老男孩python学习自修第十三天【md5加密】

    示例代码如下: hashlib_test.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import hashlib def genPasswd(na ...

  9. wget 下载网页

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ wget --http-user=username --http-passwd=password http:/w ...

  10. JMeter 连接 sql server

    1.安装驱动 http://www.microsoft.com/zh-CN/download/details.aspx?id=11774 下载后解压后复制sqljdbc.jar到 “jmeter的安装 ...