「NOI2018」屠龙勇士

首先对于每个龙用哪个剑砍,我们可以用set随便模拟一下得到。

然后求出拿这个剑砍这条龙的答案

\[atk_ix-p_iy=a_i
\]

其中\(atk_i\)是砍第\(i\)条龙的剑的攻击力,\(p_i\)是龙的回复系数,\(a_i\)是初始生命值,然后\(x\)就是单独考虑这个剑砍这个龙的答案。

我们可以拿exgcd去解这个方程,但是冷静分析一波,我们发现回复次数\(y\)需要非负。

然后我们再冷静一波,发现\(p_i\not=1\)的数据都有一个叫性质\(1\)的东西是\(a_i\le p_i\)

在性质\(1\)的情况下,因为\(atk_i\)和\(x\)都是非负的,所以\(y<0\)的时候显然是无解的

然后发现\(p_i\)都等于\(1\)的时候,我们只需要取最大的生命值就可以了

然后快乐的解一下这个方程

注意一件事,可以得到通解\(x\)是在\(\pmod {\frac{p_i}{\gcd(p_i,atk_i)}}\)下的

这样我们就得到了很多个同余方程,然后excrt合并就可以了


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <set>
#define ll long long
using std::max;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
//#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
std::multiset <ll> s;
std::multiset <ll>::iterator it;
const int N=1e5+10;
int n,m;
ll hp[N],p[N],atk[N],A[N],B[N];
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
}
ll mul(ll d,ll k,ll p)
{
ll f=0;
while(k)
{
if(k&1) (f+=d)%=p;
(d+=d)%=p;
k>>=1;
}
return f;
}
void work()
{
ll mx=0;
s.clear();
read(n),read(m);
for(int i=1;i<=n;i++) read(hp[i]);
for(int i=1;i<=n;i++) read(p[i]);
for(int i=1;i<=n;i++) read(atk[i]);
for(int i=1;i<=m;i++)
{
ll x;
read(x);
s.insert(x);
}
for(int i=1;i<=n;i++)
{
ll a,b,c,x,y;
it=s.upper_bound(hp[i]);
if(it==s.begin())
{
b=*it;
s.erase(it);
}
else
{
it--;
b=*it;
s.erase(it);
}
a=b,b=p[i],c=hp[i];
ll d=gcd(a,b);
if(c%d!=0)
{
puts("-1");
return;
}
mx=max(mx,(c-1)/a+1);
exgcd(a,b,x,y);
x=mul(x,c/d,b/d);
x=(x%(b/d)+b/d)%(b/d);
A[i]=x,B[i]=b/d;
s.insert(atk[i]);
}
for(int i=2;i<=n;i++)
{
if(A[i]==A[i-1])
{
B[i]=B[i]/gcd(B[i],B[i-1])*B[i-1];
continue;
}
if(A[i]<A[i-1]) std::swap(A[i],A[i-1]),std::swap(B[i],B[i-1]);
ll a=B[i-1],b=B[i],c=A[i]-A[i-1],d=gcd(a,b),x,y;
if(c%d!=0)
{
puts("-1");
return;
}
exgcd(a,b,x,y);
x=mul(x,c/d,b/d);
B[i]=a/d*b;
A[i]=((A[i-1]+mul(x,B[i-1],B[i]))%B[i]+B[i])%B[i];
}
printf("%lld\n",max(A[n],mx));
}
int main()
{
freopen("dragon.in","r",stdin);
freopen("dragon.out","w",stdout);
int T;read(T);
while(T--) work();
return 0;
}

2019.4.30

「NOI2018」屠龙勇士 解题报告的更多相关文章

  1. 「NOI2018」屠龙勇士

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

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

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

  3. LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)

    题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...

  4. loj#2721. 「NOI2018」屠龙勇士

    题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...

  5. POJ1061 青蛙的约会 和 LOJ2721 「NOI2018」屠龙勇士

    青蛙的约会 Language:Default 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133470 Accep ...

  6. 「NOI2018」屠龙勇士(CRT)

    /* 首先杀每条龙用到的刀是能够确定的, 然后我们便得到了许多形如 ai - x * atki | pi的方程 而且限制了x的最小值 那么exgcd解出来就好了 之后就是扩展crt合并了 因为全T调了 ...

  7. LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理

    题目:https://loj.ac/problem/2721 1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值. 2.注意用 m ...

  8. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  9. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

随机推荐

  1. 【leetcode】552. Student Attendance Record II

    题目如下: Given a positive integer n, return the number of all possible attendance records with length n ...

  2. 【leetcode】923. 3Sum With Multiplicity

    题目如下: Given an integer array A, and an integer target, return the number of tuples i, j, k  such tha ...

  3. GPIO软件模拟IIC时序

    一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...

  4. paper 142:SDM算法--Supervised Descent Method

    对于face recognition的研究,我是认真的(认真expression,哈哈哈~~~~~~)许久没有写blog了,欢迎一起讨论. SDM(Supvised Descent Method)方法 ...

  5. 2018icpc南京/gym101981 G Pyramid 找规律

    题意: 数一个金字塔里面有多少个正三角形. 题解: ans[n]=n*(n-1)*(n-2)*(n-3)/24 #include<bits/stdc++.h> using namespac ...

  6. 四. jenkins部署springboot项目(1)--window环境

    前提:jenkins和springboot运行在同一台机器 springboot项目使用git和maven jenkins所需的插件如Maven,Git等这里就不再详述. 1.jenkins配置git ...

  7. 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas

    1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...

  8. 十二、SpringBoot 优雅的集成Spring Security

    前言 至于什么是Spring security ,主要两个作用,用户认证和授权.即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面.有的用户有权限执行某一操作,而有的用户不能 ...

  9. mongo 大数据量更新注意事项

    1.大数据量最好在本地执行更新. 2.在客户端执行更新时需要注意serve活动时间(10分钟),10分钟内解决不了的使用batchSize  或者db.getCollection("&quo ...

  10. jquery中attr方法和prop方法的区别

    关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...