【BZOJ】2118 墨墨的等式

【解析】最短路

[Overview]给定n个物品,每个物品有一个非负价值,问[L,R]区间内有多少价值可以被凑出来。

[Analysis]

这道题很多神犇的题解都写得模模糊糊的,貌似看了好久才弄懂,下面是原创啊。

生成函数?TLE。

对于区间[l,r]的答案,可以通过差分转化为 1到r的答案数 - 1到(l-1)的答案数。

注意这道题是求有多少个值能被凑出来,而不是有多少种方法,只要判断一个值行不行就可以了。

选取一个数x=p[rand()%n+1],假设可以凑出值a满足 a mod x=b,0<=b<x。

假如凑出了a,一定能凑出a+x。

假如我们知道了对于每个b最小能凑出来的值a,

那么就能知道在余数b下共有(now-a)/x+1个不大于now的数可以被凑出。

且两个相同的值在mod x下一定有一样的余数,所以当b不同时,a一定也不同。

只要把所有b下的答案相加就是结果。

那么我们只要求出对于任意的b,a能取到的最小值。即:在mod x的余数分类为b中,所能凑出来的最小的价值。

这个东西用最短路就可以求出。

[Extended]如果每个物品有一个购买数量下限,怎样做?

解答:先把下限的值全部减掉,恢复到本题的询问。

[Sumup]

①静态的区间:差分的思想。

②缩小检索范围的方法:分类,分段。

③序列的计数是与最值联系在一起的,有时先需要分类才能存在最值。

④程序的强健性检查:注意最大值赋得对不对。

[Code]

/**************************************************************
    Problem: 2118
    User: y20070316
    Language: C++
    Result: Accepted
    Time:1860 ms
    Memory:8616 kb
****************************************************************/

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

typedef long long LL;
const int N=13;
const int M=500001;
const LL MAX=10000000000000;

int n; LL BMin,BMax;
int p[N],vtx;
LL dis[M]; int q[M],h,t,v[M];

inline LL query(LL w)
{
    LL cnt=0;
    for (int i=0;i<vtx;i++)
        if (dis[i]<=w) cnt+=(w-dis[i])/vtx+1;
    return cnt;
}

int main(void)
{
    scanf("%d%lld%lld",&n,&BMin,&BMax);

    for (int i=1;i<=n;i++) scanf("%d",&p[i]);
    vtx=p[1]; for (int i=2;i<=n;i++) if (vtx>p[i]) vtx=p[i];

    int now,nxt;
    for (int i=1;i<vtx;i++) dis[i]=MAX;
    v[q[t=1]=0]=1;
    for (;h^t;)
    {
        v[now=q[h=h%vtx+1]]=0;
        for (int r=1;r<=n;r++)
        {
            nxt=(dis[now]+p[r])%vtx;
            if (dis[now]+p[r]<dis[nxt])
            {
                dis[nxt]=dis[now]+p[r];
                if (!v[nxt])
                {
                    v[nxt]=1;
                    q[t=t%vtx+1]=nxt;
                }
            }
        }
    }

    printf("%lld\n",query(BMax)-query(BMin-1));

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 05:13:28

【BZOJ】2118 墨墨的等式的相关文章

【BZOJ 2118】 2118: 墨墨的等式 (最短路)

2118: 墨墨的等式 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数列的长度.B的下界.B的上界.输入的第二行包含N个整数,即数列{an}的值. Output 输出一个整数,表示有多少b可以使等式存在非负整数解. Sample Input 2 5 1

BZOJ 2118: 墨墨的等式

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1656  Solved: 650[Submit][Status][Discuss] Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数

数论+spfa算法 bzoj 2118 墨墨的等式

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数列的长度.B的下界.B的上界.输入的第二行包含N个

2118: 墨墨的等式

2118: 墨墨的等式 https://www.lydsy.com/JudgeOnline/problem.php?id=2118 分析: 最短路. 题意就是判断[L,R]内多少数,可以被许多个a1,a2,a3...构成.设最小的Mi = min{ai}. 直接枚举肯定超时,那么换个方法枚举. 考虑一个能构成的数b,它一定可以分解为$b = k \times M_i + r, \ r<M_i$.而且$b + M_i$也是可以构成的.所以我们可以找到最小的%Mi=r的数,比它大的%Mi=r的数可以

bzoj2118 墨墨的等式

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MB Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数列的长度.B的下界.B的上界.输入的第二行包含N个整数,即数列{an}的值. Output 输出一个

BZOJ2118墨墨的等式[数论 最短路建模]

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discuss] Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数

(最短路) bzoj 2118

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 479  Solved: 183[Submit][Status][Discuss] Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数列

bzoj 2118

2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2390  Solved: 937[Submit][Status][Discuss] Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input 输入的第一行包含3个正整数,分别表示N.BMin.BMax分别表示数

BZOJ 2118 墨墨的等式(最短路)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2118 [题目大意] 求a1x1+a2y2+…+anxn=B在B的取值范围,有多少B可以使等式存在非负整数解. [题解] 同余最短路,不等式解集计数即可. [代码] #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int N=500010; n