2019 徐州 icpc 树状数组套线段树 H - Yuuki and a problem

H - Yuuki and a problem

题目
题意大概是 :
给一个数组,有两种操作:
1 x y 把x位置上的值替换为y
2 l r 求 l ~ r 区间内元素任意子集的和都不能构成的最小值
这个题刚开始看到,没有一点想法,, 后来也没一点想法。。
如果只有查询怎么办?
只有查询的话,我只能想到背包。再次感慨我好菜
对,就是背包的想法。
如果把1 ~ x 内的数都能由他的子集表示出来,那么x + 1满足什么条件才能表示出来?
在1 ~ x 的数都能表示出来的前提下,1 ~ x + 1 内数的和如果大于等于x + 1,那么x + 1就能被表示出来。
为什么呢?可以试想一下背包,0 ~ x 内dp值全为1 那么只要随便有一个1 ~ x + 1的数 就可以转移过来了。所以成立。
如果x + 1能表示出来,后面的同理, 所以可得:
如果1 ~ x能表示出来,则直接跳到(区间在1 ~ x内数的和) + 1就可以了。
这个最低时间复杂度情况下是一个Fibonacci数列。所以查询不了几次。很快。
那么全是查询,没有修改的情况可以用主席树里的查询来完成。
现在多了一个修改,怎么办?
树状数组套线段树来写。

代码:
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <stack>
#include <map>
#include <bitset>
#include <math.h>
#include <set>
#include <ctime>
#include <unordered_set>
#include <climits>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj(){
   freopen("P3380_2.in","r",stdin);freopen("hash.out","w",stdout)</
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值