http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237

Problem H:Boring Counting

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 6  Solved: 2
[Submit][Status][Discuss]

Description

In this problem you are given a number sequence P consisting of N integer and Pi is the ith element in the sequence. Now you task is to answer a list of queries, for each query, please tell us among [L, R], how many Pi is not less than A and not greater than B( L<= i <= R). In other words, your task is to count the number of Pi (L <= i <= R,  A <= Pi <= B).

Input

In the first line there is an integer T (1 < T <= 50), indicates the number of test cases.
       For each case, the first line contains two numbers N and M (1 <= N, M <= 50000), the size of sequence P, the number of queries. The second line contains N numbers Pi(1 <= Pi <= 10^9), the number sequence P. Then there are M lines, each line contains four number L, R, A, B(1 <= L, R <= n, 1 <= A, B <= 10^9)

Output

For each case, at first output a line ‘Case #c:’, c is the case number start from 1. Then for each query output a line contains the answer.

Sample Input

1
13 5
6 9 5 2 3 6 8 7 3 2 5 1 4
1 13 1 10
1 13 3 6
3 6 3 6
2 8 2 8
1 9 1 9

Sample Output

Case #1:
13
7
3
6
9

HINT

Source

山东省第四届ACM程序设计大赛2013.6.9

比赛的时候,没有头绪,今天别人说起划分树,想了一下,还真是可以做的。

但是要一点变形,这样的变形,让我已经看不清 划分树的影子了。

划分树----求区间第K 小/大 值

这道题是求区间求区间[l,r]中 满足  A<=xi<=B; xi属于[l,r]。求xi的个数。

如何转化的呢?

枚举区间第k小数==A。此时能求出一个值 hxl

枚举区间第K小数==B,此时得到一个值   tom

显然满足tom>=hxl。

那在这范围的数,是不是就满足了  A<=xi<=B  !~~

这么一说,其实好简单。为什么没有想到呢?  划分树做的时候是求 第 k 小的是什么什么数字,现在换了回来而已,

求的是某个数字是区间里面第几小。

其实有个问题就又来了,A,B在区间[l,r]未必存在,这该怎么办?????

其实上面的说法,不严谨,(求的是某个数字是区间里面第几小。)应该说是求A的下届,B的上届值。

二分枚举,平均的时间会更小。在求下届和上届的过程中也要注意一些细节的问题、

 #include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define N 100010
using namespace std; int toleft[][N];
int Tree[][N];
int Sort[N]; void build(int l,int r,int dep)
{
int mid=(l+r)/,sum=mid-l+,lpos,rpos,i;
if(l==r) return ;
for(i=l;i<=r;i++)
if(Tree[dep][i]<Sort[mid]) sum--;
lpos=l;
rpos=mid+;
for(i=l;i<=r;i++)
{
if(Tree[dep][i]<Sort[mid])
{
Tree[dep+][lpos++]=Tree[dep][i];
}
else if(Tree[dep][i]==Sort[mid] && sum>)
{
Tree[dep+][lpos++]=Tree[dep][i];
sum--;
}
else
{
Tree[dep+][rpos++]=Tree[dep][i];
}
toleft[dep][i]=toleft[dep][l-]+lpos-l;
}
build(l,mid,dep+);
build(mid+,r,dep+);
} int query(int L,int R,int l,int r,int dep,int k)
{
int mid=(L+R)/,newl,newr,cur;
if(l==r) return Tree[dep][l];
cur=toleft[dep][r]-toleft[dep][l-];
if(cur>=k)
{
newl=L+toleft[dep][l-]-toleft[dep][L-];
newr=newl+cur-;
return query(L,mid,newl,newr,dep+,k);
}
else
{
newr=r+(toleft[dep][R]-toleft[dep][r]);
newl=newr-(r-l-cur);
return query(mid+,R,newl,newr,dep+,k-cur);
}
}
int EF1(int l,int r,int num,int n) //枚举下届
{
int low=,right=r-l+,mid,tmp;
mid=(low+right)/;
while(low<right)
{
tmp=query(,n,l,r,,mid);
if(tmp>=num)
right=mid-;
else low=mid; //!!!!
mid=(low+right+)/; //!!! 加了一个1。
}
return low; } int EF2(int l,int r,int num,int n)
{
int low=,right=r-l+,mid,tmp;
mid=(low+right)/;
while(low<right)
{
tmp=query(,n,l,r,,mid);
if(tmp>num)
right=mid; //!!!
else low=mid+;
mid=(low+right)/; //木有加1
}
return low;
} int main()
{
int T,n,m,i,l,r,k,a,b,hxl,tom,qq;
scanf("%d",&T);
{
for(qq=;qq<=T;qq++)
{
scanf("%d%d",&n,&m);
memset(Tree,,sizeof(Tree));
for(i=;i<=n;i++)
{
scanf("%d",&Tree[][i]);
Sort[i]=Tree[][i];
}
sort(Sort+,Sort++n);
build(,n,);
printf("Case #%d:\n",qq);
while(m--)
{
scanf("%d%d%d%d",&l,&r,&a,&b);
hxl=query(,n,l,r,,);
if(a<=hxl) hxl=; //对临界条件的判断。如果A就是最小的,木有下届
else
{
hxl=EF1(l,r,a,n);
hxl++;
}
tom=query(,n,l,r,,r-l+);
if(b>=tom) tom=r-l+; //如果B是该区间[l,r]最大的,显然木有上届
else
{
tom=EF2(l,r,b,n);
tom--;
}
hxl=tom-hxl+;
printf("%d\n",hxl);
}
}
}
return ;
}

最新文章

  1. [DeviceOne开发]-do_LinearLayout组件使用技巧
  2. Verilog (一) assignment, register and net
  3. Error starting static Resources java.lang.IllegalArgumentException: Document base D:\Program Files\apache-tomcat-xxx\webapps\xxx does not exist or is not a readable directory
  4. JavaScript 语言基础知识点总结
  5. servlet+ajax+json字符串后台传入,前端解析并把数据循环填入表格实例
  6. 搭建环境Visual Studio 2013 社区版
  7. 网络tcp/ip资料
  8. 普通用户创建ssh无密码访问
  9. Cobbler自动化部署最佳实践
  10. Charles抓包工具安装与配置
  11. 微信小程序之公共函数引入
  12. [BJOI 2011]元素
  13. 试用 Angular v6 的 Ivy compiler
  14. Spring Cloud基础教程
  15. 6. 添加messager.alert()确定按钮的回调函数,即点完确定按钮后触发的事件
  16. mvc Filters 过滤器
  17. Linux -- 之HDFS实现自动切换HA(全新HDFS)
  18. Material Design系列第四篇——Defining Shadows and Clipping Views
  19. Oracle新建数据库,并导入dmp文件
  20. DBA_实践指南系列1_Oracle Erp R12系统安装Install(案例)

热门文章

  1. P3175 [HAOI2015]按位或
  2. Atcoder Tenka1 Programmer Contest 2019题解
  3. SQL执行计划分析2
  4. java中关键字static和final
  5. LINUX中如何查看某个端口是否被占用
  6. sqlmap命令详解
  7. 自己实现简单的RSA秘钥生成与加解密(Java )
  8. Junit的常见注解
  9. POJ 1036
  10. django框架--中间件系统