【刷题】BZOJ 5418 [Noi2018]屠龙勇士
www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf
Solution
将攻击的式子列出来,\(atk \times x-p \times y=a_i\)
这不就是个扩欧的裸式子嘛,求出 \(x\) 的解的式子 \(x=x_0+r \times dis\),其中 \(r\) 为任意整数,\(dis\) 为不定方程解的间隔
上面的式子发现又是一个同余方程
对于每一条龙都是一个同余方程,那么就是要解一个同余方程组的最小解
用扩展CRT就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10;
ll T,n,m,h[MAXN],p[MAXN],rem[MAXN],mod[MAXN],v[MAXN],k[MAXN],lm;
std::multiset<ll> S;
template<typename T> inline void read(T &x)
{
	T data=0,w=1;
	char ch=0;
	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
	if(ch=='-')w=-1,ch=getchar();
	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
	x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
	if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline ll mul(ll a,ll b,ll Mod)
{
	ll res=0;
	if(b<0)a=(a%Mod+Mod)%Mod,b=(b%Mod+Mod)%Mod;
	while(b)
	{
		if(b&1)res=(res+a)%Mod;
		a=(a+a)%Mod;
		b>>=1;
	}
	return res;
}
inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	ll r=exgcd(b,a%b,x,y);
	ll t=x;
	x=y;
	y=t-(a/b)*y;
	return r;
}
inline ll exCRT()
{
	ll M=mod[1],A=rem[1],t,d,x,y;
	for(register ll i=2;i<=n;++i)
	{
		d=exgcd(M,mod[i],x,y);
		if((rem[i]-A)%d)return -1;
		t=mod[i]/d;
		x=(mul(x,(rem[i]-A)/d,t)%t+t)%t;
		ll tmp=M;M=M/d*mod[i];
		A=(mul(tmp,x,M)+A)%M;;
	}
	A=(A%M+M)%M;
	while(A<lm)A+=M;
	return A;
}
inline void solve()
{
	lm=0;
	memset(rem,0,sizeof(rem));
	memset(mod,0,sizeof(mod));
	for(register int i=1;i<=n;++i)
	{
		if(*S.begin()>=h[i])k[i]=*S.begin(),S.erase(S.begin());
		else
		{
			std::multiset<ll>::iterator it=--S.upper_bound(h[i]);
			k[i]=*it,S.erase(it);
		}
		S.insert(v[i]);
	}
	bool mk=1;
	for(register int i=1;i<=n;++i)
	{
		ll x,y,a=k[i],b=p[i],c=h[i],d=exgcd(a,b,x,y);
		if(p[i]==1)chkmax(lm,(h[i]+k[i]-1)/k[i]);
		else mk=0;
		if(c%d)
		{
			puts("-1");
			return ;
		}
		mod[i]=p[i]/d,rem[i]=mul(x,c/d,mod[i]);
		if(!rem[i])chkmax(lm,mod[i]);
	}
	if(mk)write(lm,'\n');
	else write(exCRT(),'\n');
}
int main()
{
	read(T);
	while(T--)
	{
		read(n);read(m);S.clear();
		for(register int i=1;i<=n;++i)read(h[i]);
		for(register int i=1;i<=n;++i)read(p[i]);
		for(register int i=1;i<=n;++i)read(v[i]);
		for(register int i=1,x;i<=m;++i)read(x),S.insert(x);
		solve();
	}
	return 0;
}
												
											【刷题】BZOJ 5418 [Noi2018]屠龙勇士的更多相关文章
- BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset
		
题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...
 - uoj396 [NOI2018]屠龙勇士
		
[NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...
 - BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
		
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
 - P4774 [NOI2018]屠龙勇士
		
P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...
 - [洛谷P4774] [NOI2018]屠龙勇士
		
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
 - BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
		
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
 - 洛谷 P4774 [NOI2018] 屠龙勇士
		
链接:P4774 前言: 交了18遍最后发现是多组数据没清空/ll 题意: 其实就是个扩中. 分析过程: 首先发现根据题目描述的选择剑的方式,每条龙对应的剑都是固定的,有查询前驱,后继(在该数不存在前 ...
 - 洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士(扩展中国剩余定理)
		
题目链接: 洛谷 BZOJ LOJ 题目大意:这么长的题面,就饶了我吧emmm 这题第一眼看上去没法列出同余方程组.为什么?好像不知道用哪把剑杀哪条龙…… 仔细一看,要按顺序杀龙,所以获得的剑出现的顺 ...
 - LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
		
好久没写了,写一篇凑个数. 题目分析: 这题不难想,讲一下中国剩余定理怎么扩展. 考虑$$\left\{\begin{matrix}x \equiv a\pmod{b}\\ x \equiv c\pm ...
 
随机推荐
- 通过Task异步加快对数组的运算
			
一.介绍 Task是.NetFramework3.0出现的,线程是基于线程池,然后提供了丰富的API. 先用AverageAssign方法把一组数据平均分成n组,再通过遍历n组数据,循环开Task多线 ...
 - Linux命令应用大词典-第1章 登录、退出、关机和重启
			
1.1 login:用户登录系统 1.2 logout:退出登录shell 1.3 nologin:限制用户登录 1.4 exit:退出shell 1.5 sulogin:单用户登录(single u ...
 - 【转】新装的CentOS 7安装python3
			
https://blog.csdn.net/lovefengruoqing/article/details/79284573 centos7 自带有 python,但是却是 python2 版本的 p ...
 - canvas反向裁剪技巧
			
我们都知道在canvas 可以通过clip来实现剪裁功能,其步骤一般是先设置要裁剪的区域(路径),然后通过ctx.clip()的实现裁剪,裁剪之后,后续的绘制只能在裁剪的区域显示效果,比如如下一段代码 ...
 - 32bit 天堂2 windows 2000 server架设教程
			
服务器的软件要求: Microsoft Windows 2000 Server or advanced Server license 100 Microsoft SQL Server 2000 Ent ...
 - java中JVM的原理
			
转载:https://blog.csdn.net/witsmakemen/article/details/28600127 一.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Jav ...
 - Vuejs 使用 lib 库模式打包 umd 解决 NPM 包发布的问题
			
由于升级了 v0.2 版 GearCase 使用打包工具从 parcel 更换成 vue-cli 3.x.因此打包后发布 NPM 包的方式与之前有很大的差异,这也导致了在发布完 GearCase v0 ...
 - 【Docker】第五篇 Docker 数据管理
			
一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...
 - JS模块化样例
			
var fn_pageBtn = (function(){ var m1 = function(){ alert(1); }; var m2 = function(){ alert(2); }; re ...
 - Docker Zero Deployment and Secrets (二)
			
一. 健康检测: (1)定义检测信息如下(案例,在Dockerfile中定义) FROM alpine:3.6 ... HEALTHCHECK --interval=30s \ --timeo ...