题目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[