P4774 [NOI2018]屠龙勇士
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,合并方程
// 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]屠龙勇士的更多相关文章
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
- 洛谷 P4774 [NOI2018] 屠龙勇士
链接:P4774 前言: 交了18遍最后发现是多组数据没清空/ll 题意: 其实就是个扩中. 分析过程: 首先发现根据题目描述的选择剑的方式,每条龙对应的剑都是固定的,有查询前驱,后继(在该数不存在前 ...
- 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]
传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...
- luogu P4774 [NOI2018]屠龙勇士
传送门 这题真的是送温暖啊qwq,而且最重要的是yyb巨佬在Day2前几天正好学了crt,还写了博客 然而我都没仔细看,结果我就同步赛打铁了QAQ 我们可以先根据题意,使用set维护,求出每次的攻击力 ...
- (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)
前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
- uoj396 [NOI2018]屠龙勇士
[NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...
- Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...
随机推荐
- [翻译] SCRecorder
SCRecorder https://github.com/rFlex/SCRecorder An easy Vine/Instagram like video and/or audio record ...
- zabbix日常监控Apache2.4
Apache的安装请参考https://www.cnblogs.com/huangyanqi/p/9168637.html 1.修改配置 [root@apache ~]# httpd -v Serve ...
- 各个系统Docker安装
Ubuntu 1.Ubuntu 14.04及以上版本 Ubuntu 14.04版本官方软件源已经自带了Docker包,可以直接安装: $ sudo apt-get update $ sudo apt- ...
- Hadoop HBase概念学习系列之列、列簇(十二)
列在列簇中依照字典排序.例如,列簇是基础信息或公司域名或水果类.列是基础信息:面貌.基础信息:年龄.公司域名:org.公司域名:edu.水果类:苹果.水果类:香蕉. 列 = 列簇:列修饰符 ...
- 占位符 %s
a = input("Name:")b = input("Age:")c = input("Job:")d = input("ho ...
- BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- P1439 【模板】最长公共子序列
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- 【Agile123】Automated Test in Agile
https://www.infoq.com/articles/thoughts-on-test-automation-in-agile Start Small Balance the cost vs. ...
- 初识Qt布局管理器
Qt布局管理器的类有4种,它们分别为QHBoxLayout.QVBoxLayout.QGridLayout和QStackLayout.其中,QHBoxLayout实现水平布局,QVBoxLayout实 ...
- mac下git安装和使用
1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为: 我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...