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)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...
随机推荐
- SQL[Err]ORA-00XXX: missing 相关
1.[Err]ORA-00936: missing expression 造成这个错误的原因是:选取的最后一个字段与from之间有逗号 解决方法:将字段与from之间的逗号去掉. 2.[Err] OR ...
- 2018/04/24 PHP 设计模式之注册树模式
之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...
- Java+selenium 如何操作日历控件
场景:一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 但是,有的日期控件是readonly的 ,比如神 ...
- 简单的document操作
1.新增商品:新建文档,建立索引PUT /index/type/id{ "json数据"}例如:PUT /ecommerce/product/1{ "name" ...
- TCP/IP协议栈基础知识
设计思想 把一个复杂的事物进行分层划分,使得每个部分变得相对简单 分层模型 OSI分为7层模型 tcp/ip分为四层模型 应用层(Application) 传输层(Transport) 网络层(I ...
- ABAP 创建function model 返回参数为内表类型
1:通过T-CODE se11 创建一个structure ZSTRU2. 2: 创建一个table type, 表名 ZTAB1. 3: 表的row type 选择 ZSTRU2 4: ...
- sap 下载程序
1: 左下角,直接输入 software centre. 搜索相应程序下载.
- C 语言boolean 值判断
printf("%d\n", !0); 1 1 printf("%d\n", !0); #include <std ...
- awk命令分析日志的简单笔记
awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...
- js, css混淆
原理:调用yuicompressor-2.4.8.jar, 生成混淆后的文件,强大的它能处理css,js. 1,准备一个txt,列出所需要合并的js,如js.txt jquery-1.9.1.min. ...