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)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...
随机推荐
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- es中对mapping的理解
(1)往es里面直接插入数据,es会自动建立索引,同时建立type以及对应的mapping (2)mapping中就自动定义了每个field的数据类型 (3)不同的数据类型(比如说text和date) ...
- cors与jsonp
在.net中,可以在webApiConfig代码里写,也可以在web.config里配置,但都需要引入System.Web.Cors.这些都是服务器端的配置,对整个项目有效. {若只想对某个请求有效, ...
- iis子站点
在iis已有的站点下可以继续添加”应用程序”,就构成子站点:需要访问子站点app下的程序,只想在controller/action前,加个app就行,即app/controller/action 这样 ...
- SVN安装部署
svn安装版本用的是1.8 SVN属于功能性软件,yum安装即是最佳实践. 安装svn yum install subversion 检查svn是否安装完毕 [root@mysql ~]# rpm - ...
- OC照片选择器MJPhotoBrowser
图片选择器,看cocoachina发现一个有趣的框架,很好用,分享一下,其实做出该功能我之前写过一篇博客,使用转场动画写的,就是图片的手势缩放没写,有兴趣可以看看 效果图: github地址:http ...
- python实时得到鼠标的位置
1.#先下载pyautogui库,打开cmd输入pip install pyautogui,回车 2.代码如下: import os,time import pyautogui as pag try: ...
- Redis入门到高可用(三)——通用命令
通用命令 参考 http://redisdoc.com/index.html 1. keys #查看所有key 时间复杂度:O(N), N 为数据库中 key 的数量. 127.0.0.1:637 ...
- 前端ps部分
一. 使用ps前的一些设置工作 1.首选项的设置 编剧-首选项-单位与标尺-[标尺/文字]改为像素 2.面板的设置 窗口--仅保留常用的[F7图层].[F8信息].[历史记录]. 3.视图的设置 视图 ...
- 2019.03.24 Ajax
也还是会用到jquery中的Ajax请i求 所以第一还是引入jQuery包 可以去网上搜腾讯网静态资源库 然后引入包 Ajax还是异步处理 处理堵塞问题 import time 就可以了 ...