北航OJ刷题

题目1:D&C–玲珑数题面

Bamboo听说知道了正确的玲珑数,就能开启玲珑阵,穿越时空,然后解锁一个满分玛丽苏cp……

于是决定停止幻想,现在就去算玲珑数。

玲珑数是什么呢?

在数列中任意两个数a[i],a[j],如果i<j且a[i]>2*a[j],那么a[i]和a[j]就构成了一对儿玲珑对。玲珑数就是玲珑对的总数。

是不是听起来很简单?快帮Bamboo算一下玲珑数是多少吧!

输入

多组输入数据

输入的第一个数是正整数n,表示数组长度,0<n<=10000。

接下来n个正整数是数组an,均在int范围内。

然后是正整数t表示t次查询 ,0< t<1000

接下来t行,每行两个数p和q,代表查询的数组下标区间 0<=p<n, 0<=q<n。

输出

每次查询输出一行,为所求区间内的玲珑数。

输入样例

3
3 2 1
1
0 2

输出样例

1

解题思路

第一反应就是这道题很像“序列优美差值”那道题,应该可以用分治法解决。把数组分成两A,B两部分,那么A部分里的数,下标一定小于B内的数,满足条件i<j,如果A,B内的数是升序排列的,那么对A内满足条件的任意A[i],其在B内的数一定是在同一个区间里的,所以我们可以尝试维护一个st标记,使其指向最后一个满足条件二B中元素位置,因为此题只有一个边界,所以区间一定是[mid+1,st],不需要维护下界。A,B两个部分满足条件的数,则可以递归求解。代码如下

代码

/*注意由于涉及到多次查询,不能直接操作a数组,这会改变某一区间内的元素排列顺序,所以要将查询
的区间提取出来,这卡了我好一会*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

void msort(int l, int r);
void merge(int l,int r);

long long ans=0;
long long a[10004];
long long b[10004];
long long A[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值