P4774 [NOI2018]屠龙勇士


先平衡树跑出打每条龙的atk t[]

然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\)

就是\(xt+kp[i]=a[i]\)

求出一个满足条件的\(x_0\),通解是\(x=x_0+k*\text{gcd}(t,p[i])\)

就是\(x \equiv x_0 (\text{mod }\text{gcd}(t,p[i]))\)

然后就有n个这样的式子,用excrt,合并方程

excrt懒得写了

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define vd void
#define int long long
il int gi(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int a[100010],p[100010],ATK[100010],Atk[100010],t[100010];
std::multiset<int>ST;
il int mult(int a,int b,int mod){
if(llabs(a)<llabs(b))std::swap(a,b);
if(b<0)b=-b,a=-a;
int ret=0;
while(b){
if(b&1)ret=(ret+a)%mod;
a=(a<<1)%mod;b>>=1;
}
return (ret+mod)%mod;
}
il int gcd(int a,int b){return b?gcd(b,a%b):a;}
il int exgcd(int a,int b,int&x,int&y){
if(b==0){x=1,y=0;return a;}
else{
int ret=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return ret;
}
}
il int inv(int a,int b){
int x,y;exgcd(a,b,x,y);
while(x<0)x+=b;
return x;
}
int M[100010],Mod[100010];
main(){
int T=gi(),n,m;
while(T--){
n=gi(),m=gi();
for(int i=1;i<=n;++i)a[i]=gi();
for(int i=1;i<=n;++i)p[i]=gi();
for(int i=1;i<=n;++i)ATK[i]=gi();
for(int i=1;i<=m;++i)Atk[i]=gi(),ST.insert(Atk[i]);
for(int i=1;i<=n;++i){
std::multiset<int>::iterator it=ST.upper_bound(a[i]);
if(it==ST.begin())t[i]=*it;
else --it,t[i]=*it;
ST.erase(it);
ST.insert(ATK[i]);
}
ST.clear();
bool flg=1;
for(int i=1;i<=n;++i)if(p[i]!=1)flg=0;
if(flg){
int ans=0;
for(int i=1;i<=n;++i)ans=std::max(ans,(a[i]+t[i]-1)/t[i]);
printf("%lld\n",ans);
continue;
}
#define GG(a) {printf("%d\n",a);goto ed;}
for(int i=1;i<=n;++i){
int x,y;
int g=exgcd(t[i],p[i],x,y);
if(a[i]%g)GG(-1);
int P=p[i]/g;
x=(x%P+P)%P;
M[i]=mult(x,a[i]/g,P),Mod[i]=P;
}
{
int lM=M[1],lMod=Mod[1];
for(int i=2;i<=n;++i){
int m1=lMod,m2=Mod[i],c1=lM,c2=M[i],g=gcd(m1,m2);
if((c2-c1)%g)GG(-2);
int m3,c3;
m3=(m1/g*m2);
c3=mult(mult(inv(m1/g,m2/g),(c2-c1)/g,m3)%(m2/g),m1,m3)+c1;
c3=(c3%m3+m3)%m3;
lM=c3,lMod=m3;
}
printf("%lld\n",lM);
}
ed:;
}
return 0;
}

P4774 [NOI2018]屠龙勇士的更多相关文章

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

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

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

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

  3. 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]

    传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...

  4. luogu P4774 [NOI2018]屠龙勇士

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

  5. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

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

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

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

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

  8. uoj396 [NOI2018]屠龙勇士

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

  9. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】

    真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...

随机推荐

  1. ubuntu 常见配置文件

    环境变量:linux的环境变量其实就是在启动时执行一下赋值语句 系统级 1./etc/environment   系统级$PATH   2.其他启动文件(https://www.cnblogs.com ...

  2. 解决tableView中cell动态加载控件的重用问题

    解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...

  3. 制作动态logo教程

    本人从事iOS开发工作,但对特效制作很感兴趣,现提供一份教程,制作本人logo的教程. 上图是用 Photoshop 与 After Effects 与 GIF Movie Gear 合力制作的动态图 ...

  4. swift版的GCD封装

    swift版的GCD封装 说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利. 源码 https://github ...

  5. C++实现一个Vector3空间向量类(转)

    转自:http://www.2cto.com/kf/201311/260139.html ector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数 ...

  6. git五分钟教程

    使用Git前,需要先建立一个仓库(repository).您可以使用一个已经存在的目录作为Git仓库或创建一个空目录. 使用您当前目录作为Git仓库,我们只需使它初始化. git init 使用我们指 ...

  7. lsync目录文件实时同步工具

    参考文档:https://vastxiao.github.io/article/2017/09/02/Linux/lsyncd_usage/ 防止连接丢失,已保存至百度网络-郑州-XXXXX 建议首先 ...

  8. Log4net 使用之 日期字段格式化

    Log4net 是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介. 之前Log4net的日期字段Data一直采 ...

  9. C++编译器符号表有哪些内容?

    http://blog.csdn.net/wangbingcsu/article/details/48340479 C++编译器符号表有哪些内容? 很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔 ...

  10. 【洛谷】【st表+模拟】P1311 选择客栈

    [题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...