题面

题解

考场上蠢了……这么简单的东西都想不到……

首先排序加去重。

先来考虑一下,形如

\[a_1x_1+a_2x_2+...a_nx_n=w,a_1<a_2<...<a_n,x_i\geq 0
\]

的方程该怎么判断是否有解

首先,把两边都放到模\(a_1\)的意义下,就是

\[a_2x_2+...a_nx_n\equiv w\pmod{a_1}
\]

然后是一个神仙的转化,我们设有\(a_1\)个点,分别代表\(0,1,...,a_1-1\),对于每一个点\(u\),都连出去\(n-1\)条边,分别连向\((a+a_i)\%a_1\),代价为\(a_i\)。那么我们对这个图跑一遍最短路,如果\(dis_{w\%a_1}\leq w\),那么显然可以用这条最短路上的所有边加上若干个\(a_1\)构成\(w\),否则的话肯定不行

那么对于大于等于\(L\)的部分我们可以暴力\(dp\),设\(dp_{i,j}\)表示选了\(i\)个数,其中这\(i\)个数的和模\(a_1\)后为\(j\)(\(a_1\)就是最小的数),这\(i\)个数的和最小是多少,直接大力转移即可。

最后用\(dp_{i,j}\)更新\(dis_j\),然后从每一个不为\(inf\)的\(dis_j\)出发,以所有\(a_i< L\)为边,跑多源最短路就行了

ps:其实严格来说如果\(a_1\geq L\)的话会发现上面的做法是错的,不过错的只有最短路那部分,暴力\(dp\)还是正确的,所以忽视这一点也没问题

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=55,M=10005;
struct node{
int u,d;
node(){}
node(R int U,R int D):u(U),d(D){}
inline bool operator <(const node &b)const{return d>b.d;}
};priority_queue<node>q;
bitset<N*M>f[N];int a[N],vis[M];
int n,m,p,l,c,lim,u,v;ll w,dis[M],dp[N][M];
void mdzz(){
memset(dis,0x3f,sizeof(dis));
fp(i,0,a[1]-1){
fp(j,0,c)cmin(dis[i],dp[j][i]);
if(dis[i]!=inf)q.push(node(i,dis[i]));
}
while(!q.empty()){
u=q.top().u,q.pop();
if(vis[u])continue;vis[u]=1;
fp(i,2,p)if(cmin(dis[v=(u+a[i])%a[1]],dis[u]+a[i]))q.push(node(v,dis[v]));
}
}
int main(){
// freopen("testdata.in","r",stdin);
freopen("bag.in","r",stdin);
freopen("bag.out","w",stdout);
n=read(),m=read();
fp(i,1,n)a[i]=read();
sort(a+1,a+1+n),n=unique(a+1,a+1+n)-a-1;
l=read(),c=read(),p=lower_bound(a+1,a+1+n,l)-a-1;
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
fp(i,p+1,n)fp(k,0,c-1)fp(j,0,a[1]-1){
v=(j+a[i])%a[1];
cmin(dp[k+1][v],dp[k][j]+a[i]);
}
mdzz();
while(m--){
w=read();
puts(dis[w%a[1]]<=w?"Yes":"No");
}
return 0;
}

jzoj4916. 【GDOI2017模拟12.9】完全背包问题 (背包+最短路)的更多相关文章

  1. jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)

    题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...

  2. jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)

    题面 题解 调了好几个小时啊--话说我考试的时候脑子里到底在想啥-- 首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\) 那么就可以把数列分成三份,\(L+S+R\),其中\ ...

  3. 【GDOI2017模拟12.9】最近公共祖先

    题目 分析 首先,将这些节点按dfs序建一棵线段树. 因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置. 发现,对于一个位置x,它的权值只会对以x为根的子树造成影响. 当修改x时,用w[x ...

  4. [JZOJ4913] 【GDOI2017模拟12.3】告别

    题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...

  5. 【JZOJ4925】【GDOI2017模拟12.18】稻草人

    题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...

  6. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

  7. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  8. 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序

    题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...

  9. Noip模拟12 2021.7.12

    T1 interval 亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了. 先预处理出以a[i]为最大值的最大左右区间.然后再将a[i]取%!!!是的,要不然会影响单调栈的使用.. ...

随机推荐

  1. java集合类(2)

    java集合的主要分为三种类型:JAVA集合位于 java.util包 Set(集) List(列表) Map(映射) arrays函数, equals():比较两个array是否相等. fill() ...

  2. BIOS简单设置 解析“集成显卡”内存占用问题

    很多使用集成显卡的用户会发现,在系统信息窗口中,内存容量和实际不一样.比如系统内存显示4GB,可用3.48G之类.这不可用的一部分内存到哪去了? 其实减少的这部分内存是被集成显卡占用当做显存使用了.而 ...

  3. Solaris10技巧

    如何查看UFS文件系统创建命令 root@ofs0accmcc01 # mkfs -m /dev/md/rdsk/d100 mkfs -F ufs -o nsect=128,ntrack=48,bsi ...

  4. Repmat:Replicate and tile an array

    Repmat:Replicate and tile an array Syntax B = repmat(A,m,n) B = repmat(A,[m n]) B = repmat(A,[m n p. ...

  5. 部署和调优 1.3 pureftp部署和优化-1

    FTP 是 File Transfe Protocol(文件传输协议)的英文简称,而中文简称为 “文传协议” 用于 Internet 上的控制件的双向传输. 可以访问    www.pureftpd. ...

  6. DAY14-前端之Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  7. 解决实现OnPageChangeListener()接口的方法参数出现arg0,arg1的现象

    在安卓开发中,我们经常用到ViewPager,那么既然用到ViewPager,一般都需要去实现OnPageChangeListener()接口的三个方法. 但是有时候实现的三个方法的参数都变成agr0 ...

  8. css知多少(10)——display(转)

    css知多少(10)——display   1. 引言 网页的所有元素,除了“块”就是“流”,而且“流”都是包含在“块”里面的(最外层的body就是一个“块”).在本系列一开始讲<浏览器默认样式 ...

  9. 用批处理,批量安装字体文件 (Erector.bat)

    @echo off color 0A title 字体安装器 Powered by Cheney_Yang cls xcopy /y "Fonts\*.ttf" "%wi ...

  10. 7-n!末尾有几个0

    如何确定一个N!末尾有多少个零 转载 2015年08月30日 15:02:49 622 题目:1*2*3*……*100 求结果末尾有多少个零 分析:一般类似的题目都会蕴含某种规律或简便方法的,阶乘末尾 ...