10/30的update:如果是冲着dijk的板子来的,建议看多校联考contest中第二场day2的T2,那边的写法比较优秀。。。
--------------------------------------------
编译器真是神经了 k=k*2打成了k*2居然都不报错 还一点事情没有
害我改一晚上
一开始忘记了c++的数组默认从0开始
后来又把dijk写T了。。。。。重申一遍,这里是先把所有点加进去然后依次pop()
至于这道题,大家都说它是一道数论好题
而狗王一定要把它当作spfa专题来讲给小朋友们听
---erh。。。
网上题解有很多 首推po姐的
#include<cstdio> #define ll long long #define inf 1<<29 #include<algorithm> #include<iostream> #define N 500100 #include<cstring> using namespace std; int n,q[N],pos[N];ll a[N],f[N];ll bmin,bmax; int top; void push_up(int kk) { int k=kk; >&&f[q[k]]<f[q[k/]]) { pos[q[k]]=k/;pos[q[k/]]=k; swap(q[k],q[k/]); k/=; } } void push_down() { ; <=top) { +<=top&&f[q[k]]>f[q[k*+]]&&f[q[k*+]]<f[q[k*]]) { pos[q[k]]=k*+;pos[q[k*+]]=k; swap(q[k],q[k*+]); k=k*+; }]]) { pos[q[k]]=k*;pos[q[k*]]=k; swap(q[k],q[k*]); k=k*; }else break; } } void ins(int x) { top++;q[top]=x;pos[x]=top;push_up(top); } void dijk() { ;i<a[];i++)f[i]=inf; f[]=;;i<a[];i++)ins(i); while(top) { ];q[]=q[top];top--; pos[q[]]=;push_down(); ;i<=n;i++) ]]>f[u]+(u+a[i])/a[]) { f[(u+a[i])%a[]]=f[u]+(u+a[i])/a[]; ]; push_up(pos[xx]); } } } ll max(ll a,ll b) { if(a>b)return a;else return b; } long long calc(long long x) { int i; ; ;i<a[];i++) re+=max(0ll,x/a[]+(x%a[]>=i)-f[i]); return re; } int main() { scanf("%d%lld%lld",&n,&bmin,&bmax); ;i<=n;i++)scanf("%lld",&a[i]); dijk(); printf()); }
这里是一个很懒的博主。。。相信po姐大家都知道我就不贴传送门了yep