题目链接:http://codeforces.com/contest/356/problem/D

思路(官方题解):http://codeforces.com/blog/entry/9210

此题需要注意,直接用01背包会TLE, 需要看成多重背包,倍增优化一下。

代码:

#include <bits/stdc++.h>
#define LL long long
#define pii pair<int, int>
using namespace std;
const int maxn = 70010;
bitset<maxn> dp;
pii a[maxn];
int ans[maxn], pre[maxn], numl[maxn], numr[maxn], cnt[maxn];
vector<int> re[maxn];
set<pii> s;
set<pii>::iterator it;
bool v[maxn];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].first);
a[i].second = i;
cnt[a[i].first]++;
}
sort(a + 1, a + 1 + n);
reverse(a + 1, a + 1 + n);
dp[a[1].first] = 1;
cnt[a[1].first]--;
int pos = -1;
for (int i = 2; i <= n && dp[m] == 0; i++) {
int t = cnt[a[i].first];
for (int k = 1; t; k <<= 1) {
k = min(t, k);
for (int j = m; j >= a[1].first + a[i].first * k; j--) {
if(dp[j] == 0 && dp[j - a[i].first * k] == 1) {
dp[j] = 1;
numl[j] = i, numr[j] = i + k - 1;
pre[j] = j - a[i].first * k;
}
}
t -= k;
i += k;
if(dp[m] == 1) {
pos = i;
break;
}
}
i--;
}
if(dp[m] == 0) {
printf("-1\n");
return 0;
}
for (int i = m; i > a[1].first; i = pre[i]) {
for (int j = numl[i]; j <= numr[i]; j++) {
v[j] = 1;
s.insert(a[j]);
}
}
s.insert(a[1]);
v[1] = 1;
for (int i = 1; i <= n; i++) {
if(v[i]) continue;
it = s.lower_bound(make_pair(a[i].first, -1));
pii tmp = *it;
s.erase(it);
tmp.first -= a[i].first;
ans[tmp.second] -= a[i].first;
re[tmp.second].push_back(a[i].second);
s.insert(tmp);
s.insert(a[i]);
}
for (int i = 1; i <= n; i++) {
ans[a[i].second] += a[i].first;
}
for (int i = 1; i <= n; i++) {
printf("%d ", ans[i]);
printf("%d", re[i].size());
for (int j = 0; j < re[i].size(); j++) {
printf(" %d", re[i][j]);
}
printf("\n");
}
}

  

Codeforces 356D 倍增优化背包的更多相关文章

  1. POJ 1014 Dividing(多重背包, 倍增优化)

    Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...

  2. Codeforces 983E - NN country(贪心+倍增优化)

    Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...

  3. 洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)

    洛谷题面传送门 一道挺有意思的题,想到了某一步就很简单,想不到就很毒瘤( 首先看到这样的设问我们显然可以想到背包,具体来说题目等价于对于每个满足 \(i\in[l,r]\) 的 \(a_i\) 赋上一 ...

  4. HDU5890:Eighty seven(Bitset优化背包)

    Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach ch ...

  5. HZOJ 20190727 随(倍增优化dp)

    达哥T1 实际上还是挺难的,考试时只qj20pts,还qj失败 因为他专门给出了mod的范围,所以我们考虑把mod加入时间复杂度. $50\%$算法: 考虑最暴力的dp,设$f[i][j]$表示进行$ ...

  6. $Noip2012\ Luogu1081$ 开车旅行 倍增优化$ DP$

    Luogu Description Sol 1.发现对于每个城市,小A和小B的选择是固定的,可以预处理出来,分别记为ga[],gb[] 2.并且,只要知道了出发城市和出发天数,那么当前城市和小A,小B ...

  7. CodeForces - 1175E Minimal Segment Cover (倍增优化dp)

    题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...

  8. Codeforces 106 C 多重背包

    题目链接:http://codeforces.com/problemset/problem/106/C 根据题意列出式子,设每种蛋糕做了xi个,则对于每种材料bi*xi<=ai. 对于dough ...

  9. cf786E ALT (最小割+倍增优化建图)

    如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1) ...

随机推荐

  1. java Arrays工具类的操作

    package java08; /* java.util.Arrays是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作 public static String toStri ...

  2. hdu 1506:Largest Rectangle in a Histogram 【单调栈】

    题目链接 对栈的一种灵活运用吧算是,希望我的注释写的足够清晰.. #include<bits/stdc++.h> using namespace std; typedef long lon ...

  3. docker 报错端口被占用 sqlserver 占用80端口

    本想开启个容器,却发现有程序居然占用了我的80端口 C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response fr ...

  4. Angular JS - 9 - SeaJS加载js模块

    seajs加载模块的三种方式 1.seajs.use() 加载入口模块,类似于Java的main函数 2.require:      当在一个模块中需要用到其它模块时一般用require加载 1)   ...

  5. 学习总结-Redis

    一,简介 redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统,它经常被拿来和Memcached相比较,但是Memcache ...

  6. umeditor word文档图片粘贴-自动上传到服务器

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  7. 如何为网站启用HTTPS加密传输协议

    前言 当今时代对上网的安全性要求比以前更高,chrome和firefox也都大力支持网站使用HTTPS,苹果也从2017年开始在iOS 10系统中强制app使用HTTPS来传输数据,微信小程序也是要求 ...

  8. 【转】 Linux 的目录详解 (Linux基础一)

    前言 转自: http://c.biancheng.net/view/2833.html 进行了一些提炼和修改. 学习 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各 ...

  9. WinSCP

    Safe, open-source file transfers WinSCP is an open-source, free SFTP, SCP, FTPS and FTP client for W ...

  10. SSL证书部署HTTPS站点Apache/Nginx配置

    SSL证书及HTTPS协议 SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:1.数据信息在客户端和服务器之间的 ...