jzoj5848
小 S 热爱大自然, 一天他种了一棵奇怪的线段树.
奇怪的线段树是一种与普通线段树类似的结构, 唯一不同的是, 它不一定以每一个区间的中点作为分治中心.
麻烦的是, 小 S 的线段树被风吹散了, 散成了一个个表示单一区间的结点, 而且正在逐渐飘远. 不过小 S 早有准备, 他可以进行抓取操作, 每一次他可以给出一个抓取区间, 由于这个抓取区间只有两个端点有磁力, 所以只能抓取满足与抓取区间有交而不被抓取区间包含的所有线段树结点.
现在小 S 进行了若干次抓取操作, 对于每次操作, 他希望你能回答他一共抓取了多少个线段树结点.
這道題給出了m個區間,要求我們求構造出來的樹之中,與當前區間有交集關係而且當前區間不包含的區間到底有多少個
首先是建樹問題,我們可以按照題意遞歸建樹,看一下現在的l是否==r,不然return,否則輸入當前區間的mid,並且遞歸左子樹和右子樹,所有區間可以使用一個結構體來存下來
然後再將詢問和線段樹區間按照右端點排序
而且,這道題有區間關係,應該想到掃描線
但是,在這道題中,如果直接求出答案,會很複雜,需要很多分類討論,正難則反,所以我們可以求出與當前詢問區間不相交的區間個數
這種類型有3個:
1.該區間右端點在當前區間左端點的左邊
2.該區間被現在的區間包含
3.該區間左端點在當前區間右端點的右邊
將這些算出來以後,所有區間個數-1類個數-2類-3類個數就是當前詢問區間個數的答案
對於1:我們可以維護一個樹狀數組,其維護了當前位置合法區間右端點的前綴和。每次移動一個區間時,不斷的將下一個線段樹區間加入樹狀數組,直到下一個區間的左端點在該區間裡面。然後,查詢當前區間左端點左邊有多少個右端點,就知道了與當前區間不相交的線段個數,這樣得到了ans1
對於2:可以再維護一個樹狀數組,初始,其將所有線段樹區間的右端點都加了進去。每一次移動區間時,不斷的將下一個線段樹區間從數組刪除,知道下一個區間的左端點在該區間裡面,則我們已經去除了所有l不在這個區間的線段。現在當前的所有區間的l值都大於現在查詢區間的l值,但是我們還想要現在查詢的右端點大於當前所有區間的右端點,所以得查詢一下有多少個右端點在區間l-r中
對於3,也可以再使用一個樹狀數組維護,但是我們發現,只要維護一個後綴和,記錄有多少個區間的l值大於等於現在的l值即可,因為如果有區間的l值大於現在查詢區間的r值,則這個區間的r值一定大於查詢區間的r值。
所以我們減去即可,所有查詢區間要存id表示它是第幾個詢問
#include<bits/stdc++.h>
using namespace std;
int n,m,b[300010],c[300010],s[300010],ans[3000010];
struct no{
int l,r,id;
bool operator <(const no &rhs)const{
return l<rhs.l;
}
}x[3000010],y[3000010];
int ct=0;
void get(int l,int r){
if(l==r)return;
x[++ct]=(no){l,r,0};
int mid;
scanf("%d",&mid);
get(l,mid);get(mid+1,r);
}
void mod1(int x,int y){for(int i=x;i<=n;i+=(i&-i))b[i]+=y;}
void mod2(int x,int y){for(int i=x;i<=n;i+=(i&-i))c[i]+=y;}
int q1(int x){
int ans=0;
while(x){
ans+=b[x];
x-=x&-x;
}
return ans;
}
int q2(int x){
int ans=0;
while(x){
ans+=c[x];
x-=x&-x;
}
return ans;
}
int main(){
freopen("strange.in","r",stdin);
freopen("strange.out","w",stdout);
scanf("%d%d",&n,&m);
get(1,n);
for(int i=1;i<=m;i++){
scanf("%d%d",&y[i].l,&y[i].r);
y[i].id=i;
}
sort(x+1,x+ct+1);
sort(y+1,y+m+1);
for(int i=1;i<=ct;i++){
s[x[i].l]++;
mod2(x[i].r,1);
}
for(int i=n;i>=1;i--)
s[i]=s[i]+s[i+1];
int now=1;
for(int i=1;i<=m;i++){
while(now<=ct&&x[now].l<y[i].l){
mod2(x[now].r,-1);
mod1(x[now].r,1);
now++;
}
ans[y[i].id]=ct-q1(y[i].l-1)-q2(y[i].r)+q2(y[i].l-1)-s[y[i].r+1];
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
jzoj5848的更多相关文章
随机推荐
- jmeter完成数据批量添加
Jmeter结构如图 目的: 需要在每个组织下面分别添加5个设备资源 思路: 1.先登录平台 2.进入系统配置页面 3.获取到每个区域的ID 4.在每个区域下面添加设备资源 重点及难点: 1.登录加密 ...
- tp5在apache下能访问,但放到nginx下报404
index index.php index.html index.htm; if ( -f $request_filename) { break; } if ( !-e $request_filena ...
- OSGi 系列(十三)之 Configuration Admin Service
OSGi 系列(十三)之 Configuration Admin Service OSGi 的 CM 就是 Configuration Admin Service,是用于管理 Bundle 属性.并在 ...
- tomcat 时间相差8个小时,百度上查到的,备份下
通常网上一查都是 修改 tomcat 的参数 ,如catalina 文件,jvm parameters 等.如果都不起作用,可以使用如下方式.. 你可以修改jdk的时间校正了,你这么来.进入 \hom ...
- iOS与PHP/Android AES128 ECB NoPadding加密
前言 谈谈AES加密,网上有很多的版本,当我没有真正在加密安全问题前,总以为百度出来某个AES加密算法就可以直接使用,实际上当我真正要做加密时,遇到了很多的坑,原来不是拿过来就能用的.写下本篇文章,记 ...
- Django入门与实践 1-16章总结
注意事项:随时备份.随时记录.从宏观到微观 不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之:学至于行之止矣 安装 Python 3.6.2 pip install django==1.11.4 ...
- Tcl写法
#=============================================================== #Analysi&Synthesis execute_modu ...
- 201709020工作日记--synchronized、ReentrantLock、读写锁
1.reentrantLock java.util.concurrent.lock 中的Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现.这就为Lock ...
- OpenGL ES之GLFW窗口搭建
概述 本章节主要总结如何使用GLFW来创建Opengl窗口.主要包括如下内容: OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于O ...
- 几个经典的数学库之一学习---VCGlib(3)
Camera and shot abstraction for managing views 视图的定义,以及mesh的操作说明. Shot(镜头) and camera(相机) shot摄像结构以及 ...