hdu5289 Assignment
2016-06-12 23:53
267 查看
题意:给你n个数和一个数k,求存在多少个区间,区间内最大值减最小值小于k 。n
≤ 100000; a[i], k ≤ 10^9
思路:预处理出区间[i,j]中的最大值最小值,然后枚举左端点l,二分出符合条件的右端点r,以l为左端点,j为右端点(l<=j<=r)的符合条件的集合为(r-l+1)。
代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#define N 100005
#define LL long long
#define mod 1000000007
#define esp 1e-6
#define y1 y1234
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 200005
const double PI = acos(-1.0);
using namespace std;
int a
;
int mx
[21], mi
[21];
int n, k;
void RMQ(){
for (int j = 1; (1<<j) <= n; j++){
for (int i = 1; i + (1<<j)-1 <= n; i++){
int p = 1 << (j - 1);
mx[i][j] = max(mx[i][j - 1], mx[i + p][j - 1]);
mi[i][j] = min(mi[i][j - 1], mi[i + p][j - 1]);
}
}
}
int q(int i, int j){
int k = log2(j - i + 1.0);
int mma = max(mx[i][k], mx[j - (1 << k) + 1][k]);
int mmi = min(mi[i][k], mi[j - (1 << k) + 1][k]);
return mma - mmi;
}
int main(){
int t;
cin >> t;
while (t--){
cin >> n >> k;
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
mx[i][0] = mi[i][0] = a[i];
}
RMQ();
LL ans = 0;
for (int i = 1; i <= n; i++){
int l = i, r = n;
while (l + 1 < r){
int m = (l + r) >> 1;
if (q(i, m) < k)l = m;
else r = m;
}
if (q(i, r) < k)
ans += (r * 1LL - i + 1);
else ans += (l * 1LL - i + 1);
}
cout << ans << endl;
}
return 0;
}
≤ 100000; a[i], k ≤ 10^9
思路:预处理出区间[i,j]中的最大值最小值,然后枚举左端点l,二分出符合条件的右端点r,以l为左端点,j为右端点(l<=j<=r)的符合条件的集合为(r-l+1)。
代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#define N 100005
#define LL long long
#define mod 1000000007
#define esp 1e-6
#define y1 y1234
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 200005
const double PI = acos(-1.0);
using namespace std;
int a
;
int mx
[21], mi
[21];
int n, k;
void RMQ(){
for (int j = 1; (1<<j) <= n; j++){
for (int i = 1; i + (1<<j)-1 <= n; i++){
int p = 1 << (j - 1);
mx[i][j] = max(mx[i][j - 1], mx[i + p][j - 1]);
mi[i][j] = min(mi[i][j - 1], mi[i + p][j - 1]);
}
}
}
int q(int i, int j){
int k = log2(j - i + 1.0);
int mma = max(mx[i][k], mx[j - (1 << k) + 1][k]);
int mmi = min(mi[i][k], mi[j - (1 << k) + 1][k]);
return mma - mmi;
}
int main(){
int t;
cin >> t;
while (t--){
cin >> n >> k;
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
mx[i][0] = mi[i][0] = a[i];
}
RMQ();
LL ans = 0;
for (int i = 1; i <= n; i++){
int l = i, r = n;
while (l + 1 < r){
int m = (l + r) >> 1;
if (q(i, m) < k)l = m;
else r = m;
}
if (q(i, r) < k)
ans += (r * 1LL - i + 1);
else ans += (l * 1LL - i + 1);
}
cout << ans << endl;
}
return 0;
}
相关文章推荐
- 梳理hibernate-面试题
- Android开发常见的Activity中内存泄漏及解决办法
- SQL Server 2008 clearhtml函数清除字段中的HTML标记
- 在Xcode中使用Git进行源码版本控制
- Irrlicht 移植到 Android
- HttpClient4.5教程
- leetcode 120 Triangle
- 使用 ViewStub 延迟加载布局
- 指针
- 好的用户体验的网站怎么策划?
- 狗狗们来袭!分享一个独立小游戏,狗狗后院!
- SQL Server 2008 parseJSON函数将JSON解析成Table
- Linux进程关系
- js的闭包解决百度地图的信息窗口问题
- ActionBar
- 在Android中调用C#写的WebService(附源代码)
- 指针与引用
- android中gravity和layout_gravity的区别
- opencv第四课----smooth函数使用(提出几个课后作业,希望完成)
- Tensorflow 问题