【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)
这道题看了题解后才会的。。果然是国家集训队的神仙题,思维独特。
首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每一个$ a_i $方程$ \sum_{i=1}^{n}a_ix_i=k $都必有非负整数解。于是若取$ Min=\min(a_i) $,那么对于任意$ j \in [0,min) $,若对于自然数数$ k $,$ \sum_{i=1}^{n}a_ix_i=k (k \equiv j (mod \ Min)) $有解,则对于一切自然数$ B>k(B \equiv j (mod \ Min)) $,方程$ \sum_{i=1}^{n}a_ix_i=k $都必有解。因此,我们只需对每一个$ j $求出对应的$ k $值。(我代码中实际求的是$ k/Min $,取$ Min $是为了让状态数尽可能小)
但是,这个值怎么求呢?根据上文,若$ \sum_{i=1}^{n}a_ix_i=k $,则我们可以尝试将$ k $分别加上每一个$ a_i $得到新的合法数值。这其实相当于对于每一个$ i \in [1,n] $,从$ k $向$ (k+a_i)mod \ Min $连一条长度为$ a_i $的边。同时,我们要使$ k $尽可能小,所以要在原图中跑最短路求解。
代码:
dijkstra+堆(这个如果dijkstra写得不好在洛谷上会tle)
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000000
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 5010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
struct data{
int id,dis;
friend bool operator < (data a,data b){
return a.dis>b.dis;
}
};
std::priority_queue<data>heap;
struct edge{
int to,nxt,d;
}e[];
int fir[],mark[],dist[];
int a[];
int n,m,tot=;
ll l,r;
void add(int x,int y,int z){e[tot].to=y; e[tot].d=z; e[tot].nxt=fir[x]; fir[x]=tot++;}
void dij(int S)
{
memset(dist,0x3f,sizeof(dist));
memset(mark,,sizeof(mark));
data now; now.id=S; now.dis=; heap.push(now);
while(!heap.empty()){
now=heap.top(); heap.pop();
if(mark[now.id])continue;
mark[now.id]=; dist[now.id]=now.dis;
for(int i=fir[now.id];~i;i=e[i].nxt)
if(!mark[e[i].to]){
data tmp; tmp.id=e[i].to; tmp.dis=dist[now.id]+e[i].d;
heap.push(tmp);
}
// printf("A\n");
}
}
int main()
{
memset(fir,,sizeof(fir));
n=read(); l=read(); r=read();
int mn=inf;
for(int i=;i<=n;i++)
a[i]=read(),mn=min(mn,a[i]);
for(int i=;i<mn;i++)
for(int j=;j<=n;j++){
int nxt=i+a[j];
add(i,nxt%mn,nxt/mn);
}
dij();
// for(int i=0;i<mn;i++)printf("%d %d\n",i,dist[i]);
ll ans=;
for(int i=;i<mn;i++)
if(1ll*dist[i]*mn+i<=r){
ll L=max(dist[i]*mn+i,l),R=r;
if(L/mn<R/mn){
ans+=R/mn-L/mn-;
if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
if(L<=R/mn*mn+i&&R/mn*mn+i<=R)++ans;
}
else if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
// printf("*** %d %lld %lld %lld\n",i,ans,L,R);
}
printf("%lld\n",ans);
}
bzoj2118&&洛谷P2371
spfa(这个就很清真了,跑得飞快)
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000000
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 5010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
using namespace std;
struct edge{
int to,nxt,d;
}e[];
int fir[],inq[],dist[];
int q[];
int a[];
int n,m,tot=;
ll l,r;
void add(int x,int y,int z){e[tot].to=y; e[tot].d=z; e[tot].nxt=fir[x]; fir[x]=tot++;}
void spfa(int S)
{
memset(dist,0x3f,sizeof(dist));
memset(inq,,sizeof(inq));
int h=,t=; q[]=S; inq[S]=; dist[S]=;
while(h<=t){
for(int i=fir[q[h]];~i;i=e[i].nxt)
if(dist[q[h]]+e[i].d<dist[e[i].to]){
dist[e[i].to]=dist[q[h]]+e[i].d;
if(!inq[e[i].to]){
q[++t]=e[i].to; inq[e[i].to]=;
}
}
inq[q[h++]]=;
}
}
int main()
{
memset(fir,,sizeof(fir));
n=read(); l=read(); r=read();
int mn=inf;
for(int i=;i<=n;i++)
a[i]=read(),mn=min(mn,a[i]);
for(int i=;i<mn;i++)
for(int j=;j<=n;j++){
int nxt=i+a[j];
add(i,nxt%mn,nxt/mn);
}
spfa();
ll ans=;
for(int i=;i<mn;i++)
if(1ll*dist[i]*mn+i<=r){
ll L=max(dist[i]*mn+i,l),R=r;
if(L/mn<R/mn){
ans+=R/mn-L/mn-;
if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
if(L<=R/mn*mn+i&&R/mn*mn+i<=R)++ans;
}
else if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
}
printf("%lld\n",ans);
}
bzoj2118&&洛谷P2371
【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)的更多相关文章
- 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题
洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...
- 洛谷P2371 [国家集训队]墨墨的等式
P2371 [国家集训队]墨墨的等式 题目描述 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=Ba_1x_1+a_2y_2+-+a_nx_n=Ba1x1+a2y2+-+a ...
- 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)
洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...
- 【BZOJ2763/洛谷p4563】【分层图最短路】飞行路线
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4630 Solved: 1797[Submit][Stat ...
- 洛谷P1462-通往奥格瑞玛的道路-二分+最短路
洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...
- 洛谷——P2371 EXCEEDED WARNING C(50)
P2371 EXCEEDED WARNING C 题目背景 第三道溢出警告... 机(wei)智(suo)的TMXi又搬题来坑大家了... 注意时空限制[坏笑] 题目描述 [li]1949年,阿三的数 ...
- 洛谷 P1876 开灯(思维,枚举,规律题)
P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编 ...
- 洛谷 P2622 关灯问题II(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...
- 洛谷 p1164 小A点菜 【dp(好题)】 || 【DFS】 【恰好完全装满】
题目链接:https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. u ...
随机推荐
- JDK的命令具体解释操作
JDK的命令具体解释1 rmic 功能说明: rmic 为远程对象生成 stub 和 skeleton. 语法: rmic [ options ] package-qualified-class-na ...
- 《从零开始学Swift》学习笔记(Day 23)——尾随闭包
原创文章,欢迎转载.转载请注明:关东升的博客 闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性.尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用 ...
- 企业实施DevOPS的七大挑战(转)
从别人的演讲视频中摘抄,做笔记. 什么是DevOPS 如何衡量DevOPS 企业实施DevOPS的七大挑战 自动化测试投入不足 单元测试 API测试 界面测试 功能测试 高度集中的IT服务 标准化 脚 ...
- x+=y与x=x+y有什么区别?
一般情况下,x+=y与x=x+y输出结果是等价的,因此两种写法是可以通用的,但是在某些临界值选用x+=y更加合适,比如: short n=3; n+=1;//编译通过 n=n+1;//编译失败 上述例 ...
- 《挑战程序设计竞赛》2.2 贪心法-区间 POJ2376 POJ1328 POJ3190
POJ2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14585 Accepte ...
- text files and binary files
https://en.wikipedia.org/wiki/Text_file https://zh.wikipedia.org/wiki/文本文件
- Centos简介(一)
Centos作为主流的一种Linux操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍,请参考 百度百科
- What are DESC and ASC Keywords?
What are DESC and ASC Keywords? ASC is the short form for ascending DESC is the short form for desce ...
- 插叙LTE-2
LTE TDD与LTE FDD技术简介和比较 标签: 频分双工(FDD) 时分双工(TDD) LTE 摘要:UTRA 的长期演进(Long Term Evolution ,LTE) 技术存在LTE ...
- 通过配置rinetd来实现ECS跳转访问非外网连接的mongodb
跳转的原理通用,不单单针对mongo,其他需求应用也可以使用这种方式 生成环境中的mongodb迁移到了阿里云上的mongodb,由于机制的问题,mongodb不能直接被外网访问,故此采用的办法为 ...