BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt

Description

www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf


每次用哪吧剑显然用个set就搞定了。

对于每头龙,生命值ai,回血pi,剑的攻击力为atk,打的次数为ans。

显然有ans*atk-ai>=0&&pi|ans*atk-ai。

ans*atk+pi*y=ai (y<=0)。

要求y<=0的前提下ans尽量的小,是一个ax+by=n的形式,exgcd直接做。

然后得到n个方程,每个方程形如ans mod ai=bi。

ai不一定互质,直接上excrt。

感觉excrt一定程度上比crt还好理解。

大概就是个不断用exgcd合并的过程吧,自己想应该也能想出来。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
typedef long long ll;
#define N 100050
int n,m,da[N];
ll a[N],p[N],mods[N],q[N];
ll Abs(ll x) {return x>0?x:-x;}
multiset<ll>S;
ll ch(ll x,ll y,ll mod) {
ll re=0; for(;y;y>>=1ll,x=(x+x)%mod) if(y&1ll) re=(re+x)%mod; return re;
}
void exgcd(ll a,ll b,ll &x,ll &y,ll &p) {
if(!b) {p=a; x=1; y=0; return ;}
exgcd(b,a%b,y,x,p),y-=a/b*x;
}
ll gcd(ll x,ll y) {return y?gcd(y,x%y):x;}
void init() {
S.clear();
}
int find(ll x) {
multiset<ll>::iterator it;
it=S.upper_bound(x);
if(it!=S.begin()) {
it--;
}
int tmp=*it;
S.erase(it);
return tmp;
}
ll exCRT() {
int i;
ll M=mods[1],A=q[1],t,d,x,y;
for(i=1;i<=n;i++) {
exgcd(M,mods[i],x,y,d);
if((q[i]-A)%d) return -1;
t=mods[i]/d;
x=(x%t+t)%t;
x=ch(x,(((q[i]-A)/d)%t+t)%t,t);
A=M*x+A; M=M/d*mods[i]; A=A%M;
}
A=(A%M+M)%M;
return A;
}
void solve() {
init();
scanf("%d%d",&n,&m);
int i,x;
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
for(i=1;i<=n;i++) scanf("%lld",&p[i]);
for(i=1;i<=n;i++) scanf("%d",&da[i]);
for(i=1;i<=m;i++) {
scanf("%d",&x); S.insert(x);
}
ll mx=0;
int flg=0;
for(i=1;i<=n;i++) {
ll D=find(a[i]),P=p[i],A=a[i],X,Y,d,td=D,tp=P,ta=A;
if(p[i]==1) {mx=max(mx,(a[i]+D-1)/D); flg=1; S.insert(da[i]); continue;}
exgcd(D,P,X,Y,d);mods[i]=P/d;
if(A%d) {puts("-1"); return ;}
D/=d; P/=d; A/=d;
D=Abs(D);
Y=(ch(Y,A,D)+D)%D;
if(Y>0) Y-=D;
X=(ta-tp*Y)/td;
q[i]=X;
S.insert(da[i]);
}
if(flg) printf("%lld\n",mx);
else printf("%lld\n",exCRT());
}
int main() {
// freopen("dragon.in","r",stdin);
// freopen("dragon.out","w",stdout);
int T;
scanf("%d",&T);
while(T--) solve();
}

BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt的更多相关文章

  1. BZOJ5418 NOI2018屠龙勇士(excrt)

    显然multiset求出每次用哪把剑.注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1.比较坑的是还可能存在ai=pi,稍微考虑一下. 剩下的部分即解bix≡ai(mod ...

  2. 「NOI2018」屠龙勇士(EXCRT)

    「NOI2018」屠龙勇士(EXCRT) 终于把传说中 \(NOI2018D2\) 的签到题写掉了... 开始我还没读懂题目...而且这题细节巨麻烦...(可能对我而言) 首先我们要转换一下,每次的 ...

  3. P4774 [NOI2018]屠龙勇士

    P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...

  4. uoj396 [NOI2018]屠龙勇士

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

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

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

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

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

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

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

  8. Luogu4774 NOI2018 屠龙勇士 ExCRT

    传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...

  9. BZOJ5418:[NOI2018]屠龙勇士(exCRT,exgcd,set)

    Description Input Output Sample Input 23 33 5 74 6 107 3 91 9 10003 23 5 64 8 71 1 11 1 Sample Outpu ...

随机推荐

  1. boost exception jam0.exe 异常错误

    在Windows 8 64 bit下执行boost_1_53_0的bootstrap.bat出现了jam0.exe执行错误 搜索网页发现需要修改两处文件: tools/build/v2/engine/ ...

  2. 基于GPU加速的三维空间分析【转】

    基于GPU加速的三维空间分析 标签:supermap地理信息系统gisit 文:李凯 随着三维GIS 的快速发展和应用普及,三维空间分析技术以其应用中的实用性成为当前GIS技术研究的热点领域.面对日益 ...

  3. windows pipe

    管道分为 匿名管道 和 命名管道 . 1.匿名管道仅仅能在父子进程间进行通信.不能在网络间通信,并且传输数据是单向的.仅仅能一端写,还有一端读. 2.命令管道能够在随意进程间通信.通信是双向的,随意一 ...

  4. python的私有化

    1.双下划线(__) 由双下划线開始的属性在执行时被混淆,所以直接訪问是不同意的.实际上以双下划线開始的属性 会在解释时在前面加上下划线和类名.如self.__num会被解析为self._classN ...

  5. 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)

    近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...

  6. 【Caffe代码解析】compute_image_mean

    功能: 计算训练数据库的平均图像. 由于平均归一化训练图像会对结果有提升,所以Caffe里面,提供了一个可选项. 用法: compute_image_mean [FLAGS] INPUT_DB [OU ...

  7. OpenGL之路(七)为立方体加入丰富色彩

    在立方体的六个面贴上不同的颜色,假设想达到混合颜色的效果,能够參照立方体的前面代码在每一行前都加上颜色 代码例如以下 #include <gl/glut.h> #pragma commen ...

  8. PHP中curl获取本机虚拟主机接口

    在PHP的curl代码中增加header可解决此问题. $header = array( "Host: 你的域名(不能包含http://)", "Accept: text ...

  9. Android组件系列----ContentProvider内容提供者【4】

    (4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentR ...

  10. 两个经典的文件IO程序示例

    前言 本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅. 程序功能 程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据. 程序一代码及其注释 # ...