传送门 线段树基础题. 题意:要求维护区间区间中选择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…
[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,....\) 把乘积的形…
[BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 这样可以维护前4个操作 对于第5个操作 维护区间从左/右端点开始的最大连续\(0/1\)的个数 以及区间内的最大连续\(0/1\)的个数 做区间翻转的时候所有的关于\(0/1\)连续个数的计数全部要交换过来 其他的细节自己注意一下 #include<iostream> #include<c…
可爱的菜菜子 题目链接:https://cometoj.com/contest/38/problem/D?problem_id=1543 数据范围:略. 题解: 首先,如果第一个操作是单点修改,我们就只需要用线段树维护区间线性基即可. 但是,第一个操作是区间异或,这就很难受了. 区间操作可以怎么转化成单点?差分呗. 将原序列异或差分之后,确实修改变成了单点修改. 查询是否有影响?其实是没有影响的因为相当于整个一个区间的每个数异或上同一个数(前$l - 1$个数的异或和),线性基不受影响. 代码:…
树 bzoj-3306 题目大意:给定一颗n个节点的树,支持换根.修改点权.查询子树最小值. 注释:$1\le n,q\le 10^5$. 想法: 如果没有换根操作,就是$dfs$序+线段树维护区间最小值即可. 加入有换根操作,我们发现对修改操作没影响. 我们只需要判断一下询问的点和当前根的关系即可. Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm…
序列操作 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…
题目描述 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\) 一看这个数据范围和题目要求,我们就不难看出…
礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件,就是所有二元组都是随机的. 这个条件很好,它几乎就保证了,任选一个区间的话,优秀二元组只有$log$个. 这是为什么呢? 其实区间内,优秀二元组的个数,就相当于把区间按照$x$排序后,$y$值是前缀最大值的期望个数. 因为二元组是随机的,所以$x$排序后,$y$仍然是随机的. 就是给定一个随机数列,…