我们只需要查询,这些区间的区间颜色数就可以了,这里需要注意的是,当我们枚举的mex比较大的时候,此时分成的几个区间的mex可能比他们的真实值要小但是由于我们要求的是最大值,所以对答案没有影响,所以我们不需要知道区间mex只需要知道区间颜色数就可以,查询区间颜色数使用树状数组扫描线...
对于区间[a[i-1],a[i]],当前遍历到a[i],如果竖轴x=a[i]上used[x]=true 那么需要将答案加上当前竖轴上区间的白点个数query(x,x),否认设置used[x]=true(因为当前遍历的就是黑点),计算完该区间以后一定要记得将该区间的树状数组清掉,因为树状数组维护的区间和,如果不清会导致重复计算(两条扫描线之间...
对于x+y和x-y这两个函数,分别开一个树状数组去维护合法点的个数 #include <cstdio> #include <cctype> #include <iostream> #include <algorithm> #include <vector> #define rep(i, a, b) for (int i = a; i <= b; i++) #define All(x) (x.begin()), (x.end()) using namespace std...
将所有询问离线保存,按照右端点排序;(左端点也可) 枚举右端点,计算出加入右端点之后前面的数的贡献,同时消除重复的贡献,这里要结合树状数组的差分原理来理解,是题目中不好推的地方; 对于每个右端点为当前点的询问,借助区间求和与前缀和求出答案并保存; 输出答案; 一些有用的链接 Codeforces 220B 学长题解...
POJ 2109 Inner Vertices(扫描线+树状数组) 【题目链接】http://poj.org/problem?id=3109 【题目大意】 在一个棋盘上放满白子,现在把一些白子变成黑子, 如果一个白子上下左右都有黑子,就会变成黑子,问最终黑子个数 【题解】 首先我们在每列的开头和结尾做标记,之后对行线扫描,...
简介:CF220B Little Elephant and Array(扫描线+树状数组) 原题链接 思路: 首先,我们可以先将所有的询问进行离线,区间问题借助扫描线的思想,枚举右端点,计算左端点产生的贡献。 考虑什么时候的区间是一个合法的区间,比如当前枚举到数x,如果x前面有x − 1个x都在区间里,并且这个x前面的第x个x不在区间里,这...
Helter Skelter (扫描线 + 离散化 + 树状数组) 扫描线:按照其中一个区间的标记为pos,然后左区间标记d为正影响,有区间标记d为负影响,然后根据所有的pos排序。pos从小扫到大,那么对于某一个区间一定会被扫过2次,那么经过2次之后就只剩下中间那一段的影响了,但是先提前扫过去的话后面的区间就会影响到前面的...
右端点是它消失的点,我们可以使用树状数组维护,1表示增加,-1表示减少,一根扫描线的属性是[x, y, 1或者-1],一根水平线可以拆分成[x1, y, 1]和[x2, y + 1, -1],我们只要修改在树状数组上的y点即可,然后每次枚举一根竖线,我们把这根竖线x点之前的扫描线都读进来,然后查看在y1, y2之间的点数,即是...
CF220B Little Elephant and Array(扫描线+树状数组) 思路: 首先,我们可以先将所有的询问进行离线,区间问题借助扫描线的思想,枚举右端点,计算左端点产生的贡献。 考虑什么时候的区间是一个合法的区间,比如当前枚举到数 ,如果 前面有 个 都在区间里,并且这个...
牛客练习赛9 E.子串(转移+扫描线+树状数组),;while(l[i]>1&&p[l[i]-1]<=i)l[i]=l[l[i]-1];//我比左边的数字大,那么