Helter Skelter (扫描线 + 离散化 + 树状数组)
扫描线:按照其中一个区间的标记为pos,然后左区间标记d为正影响,有区间标记d为负影响,然后根据所有的pos排序。pos从小扫到大,那么对于某一个区间一定会被扫过2次,那么经过2次之后就只剩下中间那一段的影响了,但是先提前扫过去的话后面的区间就会影响到前面的区间,反过来却不会。所以求答案的时候也是按照查询区间的左部那么我只需要一边录入数据,一边求就可以了。
然后对于1的区间只需要用一个线段树/树状数组就可以将判断是否符合了,还有就是树状数组离散化之后对速度有些许帮助。
#include<bits/stdc++.h>
using namespace std; const int maxm = 1e6 + ;
int in[maxm], discre[maxm << ], tr[maxm << ];
int l, r, L, R, opL, disL;
char ans[maxm]; void TreeAdd(int rt, int num){
while(rt <= disL){
tr[rt] += num;
rt = rt + (rt & -rt);
}
} int TreeSum(int rt){
int ret = ;
while(rt){
ret += tr[rt];
rt = rt - (rt & -rt);
}
return ret;
} struct OP{
int pos, d, L, R;
bool operator < (const OP& a)const{
return pos < a.pos;
}
}op[maxm << ]; struct QUERY{
int a, b, id;
bool operator < (const QUERY& A)const{
return a < A.a;
}
}query[maxm]; void join(){
op[opL].d = ;op[opL].pos = l;
op[opL].L = L;op[opL ++].R = R;
op[opL].d = -;op[opL].pos = r + ;
op[opL].L = L;op[opL ++].R = R;
discre[disL ++] = L;
discre[disL ++] = R;
} int main(){
int T, n, m, k;scanf("%d", &T);
while(T --){
k = disL = opL = ;
scanf("%d%d",&n, &m);
for(int i = ; i <= n; i ++)
scanf("%d",&in[i]);
for(int i = ; i < m; i ++){
scanf("%d%d",&query[i].a, &query[i].b), query[i].id = i;
discre[disL ++] = query[i].b;
}
sort(query, query + m);
for(int i = ; i <= n; i ++){
///单区间
if(i & ){l = , r = in[i], L = R = ; join();}
else {l = r = , L = , R = in[i]; join();}
///双区间
if(i & && i < n){l = L = ; r = in[i]; R = in[i + ]; join();}
else if(i < n) {l = L = ; r = in[i + ]; R = in[i]; join();}
///多区间
l = r = L = R = ;
for(int j = i + ; j < n; j ++){
l += ((j & ) ? in[j] : );
L += ((j & ) ? : in[j]);
r = l + ((i & ) ? in[i] : ) + ((j & ) ? : in[j + ]);
R = L + ((i & ) ? : in[i]) + ((j & ) ? in[j + ] : );
join();
}
}
sort(op, op + opL);
sort(discre, discre + disL);
disL = unique(discre, discre + disL) - discre;
for(int i = ; i <= disL; i ++) tr[i] = ;
for(int i = ; i < m; i ++){
for(;k < opL && query[i].a >= op[k].pos; k ++){
int ll = lower_bound(discre, discre + disL, op[k].L) - discre + ;
int rr = lower_bound(discre, discre + disL, op[k].R) - discre + ;
TreeAdd(ll, op[k].d); TreeAdd(rr + , - * op[k].d);
}
int qq = lower_bound(discre, discre + disL, query[i].b) - discre + ;
ans[query[i].id] = '' + (TreeSum(qq) > );
}
ans[m] = ;
printf("%s\n",ans);
}
return ;
}
Helter Skelter (扫描线 + 离散化 + 树状数组)的更多相关文章
- CodeForces 540E - Infinite Inversions(离散化+树状数组)
花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...
- Ultra-QuickSort(归并排序+离散化树状数组)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 50517 Accepted: 18534 ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组
BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...
- poj-----Ultra-QuickSort(离散化+树状数组)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 38258 Accepted: 13784 ...
- Code Forces 652D Nested Segments(离散化+树状数组)
Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- hdu 3015 Disharmony Trees (离散化+树状数组)
Disharmony Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组
题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...
- HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)
6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...
随机推荐
- # 20165225 《Java程序设计》第一周学习总结
20165225 <Java程序设计>第一周学习总结 1.视频与课本中的学习: 首先是为了运行和开发Java分别安装了JRE和JDK,具体做法在老师给的<Java2 实用教程(第五版 ...
- Android SDK下载和更新失败的如何解决
一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...
- opencv 替换图像中的一部分
首先选取图像中的Roi区域,然后对Roi区域进行赋值,那么原图像相应的区域也跟着变化了: dst = src.clone(); cv::Mat Roi(dst, cv::Rect(x, y, cut_ ...
- C#生成exe、dll版本号自动增加
修改AssemblyInfo.cs 1.注释[assembly: AssemblyFileVersion("1.0.0.0")] 2.[assembly: AssemblyVers ...
- mysql mpm
mysql mpm 参考文章 http://www.myexception.cn/mysql/1968274.html http://www.linuxidc.com/Linux/2013-07/86 ...
- pt-table-checksum 使用实践
在另外部署的机器上执行: pt-table-checksum h='192.168.122.47',u='root',p='cc.123',P=3306 -d cat --nocheck-r ...
- 启动Jmeter4.0 后弹出命令窗口提示信息是什么意思?
启动Jmeter4.0 后弹出命令窗口提示信息: =========================================================================== ...
- perfmon——使用windows系统自带的性能监视器监控进程信息
第一次使用perfmon监控应用进程的信息,步骤总结如下: 第一部分 性能监视器 1.快捷键Win+R打开运行界面,输入“perfmon”命令后回车即可打开windows的性能监视器 2.点击“性能监 ...
- Python3学习之路~3.1 函数基本语法及特性、返回值、参数、局部与全局变量
1 函数基本语法及特性 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法定义: d ...
- spark sql的agg函数,作用:在整体DataFrame不分组聚合
.agg(expers:column*) 返回dataframe类型 ,同数学计算求值 df.agg(max("age"), avg("salary")) df ...