HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
来源:互联网 发布:天猫是属于淘宝的吗 编辑:程序博客网 时间:2024/04/30 05:47
Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 627 Accepted Submission(s): 318
Problem Description
Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to some staffs who were in the same group. In a group, the difference of the ability of any two staff is less than k, and their numbers are continuous. Tom want to know the number of groups like this.
Input
In the first line a number T indicates the number of test cases. Then for each case the first line contain 2 numbers n, k (1<=n<=100000, 0<k<=10^9),indicate the company has n persons, k means the maximum difference between abilities of staff in a group is less than k. The second line contains n integers:a[1],a[2],…,a[n](0<=a[i]<=10^9),indicate the i-th staff’s ability.
Output
For each test,output the number of groups.
Sample Input
24 23 1 2 410 50 3 4 5 2 1 6 7 8 9
Sample Output
528HintFirst Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
Author
FZUACM
Source
2015 Multi-University Training Contest 1
解题思路:
枚举左端点,二分查找右端点,用RMQ维护区间最大值和最小值
#include <iostream>#include <cstring>#include <cmath>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <stack>#define LL long longusing namespace std;const int MAXN = 100000 + 10;int A[MAXN];int dp1[MAXN][20], dp[MAXN][20];int N, M;void RMQ_init_Min(){ for(int i=0;i<N;i++) dp1[i][0] = A[i]; for(int j=1;(1<<j) <= N;j++) { for(int i=0;i+(1<<j) - 1 < N;i++) { dp1[i][j] = min(dp1[i][j-1], dp1[i + (1<<(j-1))][j-1]); } }}int RMQ_Min(int L, int R){ int k = 0; while(1<<(k+1) <= R - L + 1) k++; return min(dp1[L][k], dp1[R-(1<<k)+1][k]);}void RMQ_init_Max(){ for(int i=0;i<N;i++) dp[i][0] = A[i]; for(int j=1;(1<<j) <= N;j++) { for(int i=0;i+(1<<j) - 1 < N;i++) { dp[i][j] = max(dp[i][j-1], dp[i + (1<<(j-1))][j-1]); } }}int RMQ_Max(int L, int R){ int k = 0; while(1<<(k+1) <= R - L + 1) k++; return max(dp[L][k], dp[R-(1<<k)+1][k]);}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%d%d", &N, &M); for(int i=0;i<N;i++) scanf("%d", &A[i]); RMQ_init_Min(); RMQ_init_Max(); long long ans = 0; for(int i=0;i<N;i++) { int l = i, r = N-1; while(l <= r) { int mid = (l + r) >> 1; int low = RMQ_Min(i, mid); int high = RMQ_Max(i ,mid); //cout << l << ' ' << r << ' ' << high << ' ' <<low << endl; if(high - low < M) l = mid + 1; else r = mid - 1; } //cout << l << endl; ans += (l - i); } printf("%I64d\n", ans); } return 0;}
0 0
- 多校第一场 hdu 5289 Assignment(rmq+二分)
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
- 2015多校联合第一场5289Assignment RMQ+二分
- hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
- [RMQ+二分] 2015多校联合第一场 Assignment
- HDU 5289 Assignment(多校联合第一场1002)
- HDU 5289 Assignment (RMQ+二分)
- HDU 5289 Assignment (二分+RMQ)
- HDU 5289 Assignment(RMQ+二分)
- RMQ + 二分_______GCD(hdu 5726 2016多校第一场)
- hdu 5289 Assignment 二分+rmq
- hdu 5289(二分+RMQ) Assignment
- HDU 5289 Assignment【二分+RMQ】
- 【二分+RMQ】hdu 5289 Assignment
- 【多校第一场】【单调队列】HDU 5289 Assignment
- hdu 5289 Assignment(15多校第一场1002)
- Hdu-5289 Assignment (二分+RMQ || 单调队列)
- 2016 多校第一场 hdu 5276((线段树+暴力打表)|(RMQ + 二分))
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- Mysql5.6审计功能
- ofbiz 订单信息
- HDOJ 1241 Oil Deposits(8方位简单dfs)
- JdbcTemplate详解
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
- Codeforces 558C Amr and Chemistry 暴力 - -
- ofbiz 购物车
- 关于导航栏设置的一些操作
- Html5存储总结(未完)
- 安卓android属性中的px,sp,dip有什么区别?
- SDWebImage内存缓存 磁盘缓存
- jQuery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
- Apache OFBiz Business Setup Guide - OFBiz End-User Documentatio