序列操作 BZOJ2962 线段树】的更多相关文章

分析: 数据范围表示:c特别的小(c<20) 我们可以考虑nlogn*c^2的算法. 线段树维护区间信息:f[i]表示在[l,r]这段区间中选择i个数相乘的和. 因此,我们可以将区间看成一个点,在PushUp的时候用背包的方式更新父节点.(仔细观察发现这是卷积) 剩下的就是一些优化了... 附上代码: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #…
[BZOJ2962]序列操作(线段树) 题面 BZOJ 题解 设\(s[i]\)表示区间内选择\(i\)个数的乘积的和 考虑如何向上合并? \(s[k]=\sum_{i=0}^klson.s[i]*rson.s[k-i]\) 相当于是一个卷积形式 区间取相反数是一个很好处理的操作 把所有的\(s[k],k\&1=1\)取相反数就好了 区间加法? 假设我们已经知道了原来的所有的答案 现在的数从原来的\(a[1],a[2],....\) 变成了\(a[1]+x,a[2]+x,....\) 把乘积的形…
BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0 3 a b 询问[a, b]区间内总共有多少个1 4 a b 询问[a, b]区间内最多有多少个连…
[BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 这样可以维护前4个操作 对于第5个操作 维护区间从左/右端点开始的最大连续\(0/1\)的个数 以及区间内的最大连续\(0/1\)的个数 做区间翻转的时候所有的关于\(0/1\)连续个数的计数全部要交换过来 其他的细节自己注意一下 #include<iostream> #include<c…
序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$,$1\le c\le 20$. 想法: 首先切入点非常明显,我们发现c只有20. 又因为前两个操作给我们提示:不难想到用线段树维护. 那么线段树上的每个节点维护21个值sum[pos][i]表示在pos节点维护的区间中选取i个数的乘积和. 合并也是容易的:$sum[pos][i]=\sum\lim…
传送门 线段树基础题. 题意:要求维护区间区间中选择ccc个数相乘的所有方案的和(c≤20c\le20c≤20),支持区间加,区间取负. 由于c≤20c\le20c≤20,因此可以对于每个线段树节点可以暴力维护212121个sumsumsum值,合并也很简单,是一个卷积的形式sumi=∑j=0isumjsumi−jsum_i=\sum_{j=0}^isum_jsum_{i-j}sumi​=∑j=0i​sumj​sumi−j​可以用FFT优化一波(滑稽. 区间取负并没有什么难度,对于sumisum…
题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0 3 a b 询问[a, b]区间内总共有多少个1 4 a b 询问[a, b]区间内最多有多少个连续的1 对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,…
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i(0); i < (n); ++i) #define rep(i,a,b) for(int i(a); i <= (b); ++i) #define dec(i,a,b) for(int i(a); i >= (b);…
题目大意: 给定一个长度为n的01序列为,现在有m种操作 \(0\ a\ b\) 把\([a,b]\)的数全部修改为0 \(1\ a\ b\) 把\([a,b]\)的数全部修改为1 \(2\ a\ b\) 把\([a,b]\)的所有数取反,就是0->1 1->0 \(3\ a\ b\) 询问\([a,b]\)中一共有多少个0 \(4\ a\ b\) 询问\([a,b]\)中最长有多少个连续的1 其中\(n\le100000,m\le 100000\) 一看这个数据范围和题目要求,我们就不难看出…
Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值. Input 第一行两个数n,q表示序列长度和操作个数. 第二行n个非负整数,表示序列. 接下来q行每行输入一个操作I a b c或者 R a b或者Q a b c意义如题目描述. Output 对于每个询问,输出选出c…