jzoj4916. 【GDOI2017模拟12.9】完全背包问题 (背包+最短路)
题面
题解
考场上蠢了……这么简单的东西都想不到……
首先排序加去重。
先来考虑一下,形如
\]
的方程该怎么判断是否有解
首先,把两边都放到模\(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】完全背包问题 (背包+最短路)的更多相关文章
- jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)
题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...
- jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)
题面 题解 调了好几个小时啊--话说我考试的时候脑子里到底在想啥-- 首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\) 那么就可以把数列分成三份,\(L+S+R\),其中\ ...
- 【GDOI2017模拟12.9】最近公共祖先
题目 分析 首先,将这些节点按dfs序建一棵线段树. 因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置. 发现,对于一个位置x,它的权值只会对以x为根的子树造成影响. 当修改x时,用w[x ...
- [JZOJ4913] 【GDOI2017模拟12.3】告别
题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...
- 【JZOJ4925】【GDOI2017模拟12.18】稻草人
题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...
- noip模拟12[简单的区间·简单的玄学·简单的填数]
noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...
- BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...
- 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序
题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...
- Noip模拟12 2021.7.12
T1 interval 亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了. 先预处理出以a[i]为最大值的最大左右区间.然后再将a[i]取%!!!是的,要不然会影响单调栈的使用.. ...
随机推荐
- (转)c# Linq及Lamda表达式应用经验之 GroupBy 分组
本文转载自:http://www.cnblogs.com/han1982/p/4138163.html 示例1: GroupBy 分组在List<>泛型中的应用 原表: 按姓名Nam 分组 ...
- [置顶]
C语言itoa()函数和atoi()函数详解(整数转字符C实现)
头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...
- C# Dynamic通用反序列化Json类型并遍历属性比较
背景 : 最近在做JAVA 3D API重写,重写的结果需要与原有的API结果进行比较,只有结果一致时才能说明接口是等价重写的,为此需要做一个API结果比较的工具,比较的内容就是Json内容,但是为了 ...
- 2007.1.1 string.Format
String.Format举例(C#) stringstr1 =string.Format("{0:N1}",56789); //result: 56,789.0 stringst ...
- 2015.4.21 SetWindowPos函数用法
定义:[DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd, int hWndl ...
- python ConfigParser 读取配置文件
- python学习笔记(1)python下载及运行
进入https://www.python.org/官网下载python,根据需要选择2.*或3.*版本 安装完将安装目录添加到环境变量path中 运行cmd,输入python出现版本号即配置成功 下载 ...
- PopupWindow-----点击弹出 PopupWindow 初始化菜单
/** * 点击弹出 PopupWindow 初始化菜单 */ private void initPopupWindow() { PopupWindowAdapter adapter = new Po ...
- sg值的求解(NIM)
硬币游戏2 挑战程序设计竞赛P315 1堆的情况: #include<bits/stdc++.h> ,grundy[],k=,A[]={,},n=; using namespace std ...
- springBoot 案例
一.工具 JDK1.7 Eclipse Maven 这里Eclipse集成Maven的这一步就省了! 二.编码 新建Maven Project 命名为:SpringBootDemo 选项如图 2.修改 ...