回滚线段树+bitset优化01背包——cf981E
/*
首先考虑如何计算一个点的可能凑出的值,这就是一个01可行性背包问题
那么再拓展到一段区间[1..n]的点上,每个query都可以看做是一段区间上的点[l,r]加上一个体积为x的物品,转换到01背包上就是进行一次更新
那么用线段树来维护每个query的区间更新
每个位置(区间)维护一个bitset,每次加入a都进行一次01背包
用线段树来维护区间的bitset,表示一段区间能组成的值
但是没法用lazy,每次区间更新只能停留在一段区间
可以把每次停留在区间的数a用vector保存下来,当进行完所有的更新时,从线段树叶子结点开始向上回滚
每个区间的可行性是左儿子的可行性|右儿子的可行性|vector里存的每个a提供的可行性贡献
*/
#include<bits/stdc++.h>
using namespace std; int n,m; #define maxn 10005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Node{int l,r,x;}p[maxn];
bitset<>seg[maxn<<];
vector<int>v[maxn<<];
void build(int l,int r,int rt){
seg[rt][]=;
if(l==r)return;
int m=l+r>>;
build(lson);
build(rson);
}
void update(int L,int R,int x,int l,int r,int rt){
if(L<=l && R>=r){
v[rt].push_back(x);
return;
}
int m=l+r>>;
if(L<=m)update(L,R,x,lson);
if(R>m)update(L,R,x,rson);
} void debug(int l,int r,int rt){
cout<<rt<<" "<<l<<" "<<r<<'\n';
for(int i=;i<=n;i++)
cout<<seg[rt][i];
puts("");
} void roll(int l,int r,int rt){
if(l==r){
for(int i=;i<v[rt].size();i++)
seg[rt]|=seg[rt]<<v[rt][i];
//debug(l,r,rt);
return;
}
int m=l+r>>;
roll(lson);
roll(rson);
seg[rt]|=seg[rt<<];
seg[rt]|=seg[rt<<|];
for(int i=;i<v[rt].size();i++){
int a=v[rt][i];
seg[rt]|=seg[rt]<<a;
}
//debug(l,r,rt);
} int main(){
cin>>n>>m;
for(int i=;i<=m;i++)
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].x);
build(,n,); for(int i=;i<=m;i++)
update(p[i].l,p[i].r,p[i].x,,n,);
roll(,n,); int ans=;
for(int i=;i<=n;i++)
if(seg[][i])ans++; cout<<ans<<'\n';
for(int i=;i<=n;i++)
if(seg[][i])cout<<i<<" ";
}
回滚线段树+bitset优化01背包——cf981E的更多相关文章
- HDU 5808 Price List Strike Back bitset优化的背包。。水过去了
http://acm.hdu.edu.cn/showproblem.php?pid=5808 用bitset<120>dp,表示dp[0] = true,表示0出现过,dp[100] = ...
- poj 1742 Coins(二进制拆分+bitset优化多重背包)
\(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...
- HDU 3732 Ahui Writes Word 多重背包优化01背包
题目大意:有n个单词,m的耐心,每个单词有一定的价值,以及学习这个单词所消耗的耐心,耐心消耗完则,无法学习.问能学到的单词的最大价值为多少. 题目思路:很明显的01背包,但如果按常规的方法解决时间复杂 ...
- 2018 焦作网络赛 K Transport Ship ( 二进制优化 01 背包 )
题目链接 题意 : 给出若干个物品的数量和单个的重量.问你能不能刚好组成总重 S 分析 : 由于物品过多.想到二进制优化 其实这篇博客就是存个二进制优化的写法 关于二进制优化的详情.百度一下有更多资料 ...
- 简单了解Oracle的回滚段
因为上一次研究了Oracle的事务一致性,中间查阅资料的时候,看到这个地方与回滚段有关.所以就罗列了以下简单的知识.更为深层次的就不再深挖了,个人感觉对于事务的一致性和隔离级别是开发经理应该了解的,但 ...
- 01二维背包+bitset优化——hdu5890
口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...
- 洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)
洛谷题面传送门 一道挺有意思的题,想到了某一步就很简单,想不到就很毒瘤( 首先看到这样的设问我们显然可以想到背包,具体来说题目等价于对于每个满足 \(i\in[l,r]\) 的 \(a_i\) 赋上一 ...
- HDU - 6268: Master of Subgraph (分治+bitset优化背包)
题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示. 思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN. 然后背包 ...
- HDU——2191悼念512汶川大地震遇难同胞(多重背包转化为01背包或二进制优化)
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
随机推荐
- vuex之module的使用
一.module的作用 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿. 为了解决以上问题,Vuex 允许我们将 store 分 ...
- Fiddler,对数据进行抓包,拦截,修改等操作
转载....... 一.fiddler设置fiddler默认是只能抓取http网络格式的,所以我们要先设置下使fiddler可以获取到https网络格式 首先tools→options→https进去 ...
- Delphi如何获取一个字符串再另一个字符串中最后一次出现的位置
uses StrUtils; function ReversePos(SubStr, S: String): Integer; var i : Integer; begin i := Po ...
- thinkcmf链接多个数据库
1.打开/data/conf/config.php 'db1'=>[ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '', / ...
- cmake build
{ //cmake CMakeLists.txt -G "Visual Studio 15 2017" }
- Yii2中一些常用的参数
系统类型: <?= php_uname() ?> 解译引擎: <?= $_SERVER['SERVER_SOFTWARE'] ?>, Zend: <?= Zend_Ver ...
- 「ZJOI2019」线段树 解题报告
「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...
- Mac上安装Android SDK
今天开始学习IOS,所以先买了个设备先,但是开始使用了苹果本,还是需要继续开发Android,因为那是我现在吃饭的东西,所以就需要在Mac上配置Android SDK,原以为安装SDK很简单,和Win ...
- Linux 常用的一些操作
1.查看linux中某个端口是否被占用 1> 使用lsof lsof -i:端口号 查看该端口是否被占用 2> 使用netstat netstat -antpu |grep 80 ...
- Linux环境安装PHP链接SQLserver2008
网上很多介绍,但是跟着做总是有问题,找到一个大神的,没出现过问题: 1.首先需要编译安装FreeTDS 1.1.安装 说明:一定要从官网下载最新的版本FreeTDS-0.95 ftp://ftp.fr ...