HDU 5289 Assignment (ST算法区间最值+二分)
2015-07-22 10:55
417 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289
题面:
Total Submission(s): 672 Accepted Submission(s): 335
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
(0<=a[i]<=10^9),indicate the i-th staff’s ability.
Output
For each test,output the number of groups.
Sample Input
Author
FZUACM
Source
2015 Multi-University Training Contest 1
解题:
比赛的时候,怎么想都想不对,想去找最近的不合法的点,复杂度太高。看了题解才知道是用ST算法的。先前不知道,这是一篇很不错的ST算法的介绍。/article/1944874.html
枚举左边端点,二分右端点,用ST算法判断该区间是否合法,直至右端点到极限(即二分的左右边界相遇或交叉)。
代码:
题面:
Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 672 Accepted Submission(s): 335
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
(0<=a[i]<=10^9),indicate the i-th staff’s ability.
Output
For each test,output the number of groups.
Sample Input
2 4 2 3 1 2 4 10 5 0 3 4 5 2 1 6 7 8 9
5 28 HintFirst Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
Author
FZUACM
Source
2015 Multi-University Training Contest 1
解题:
比赛的时候,怎么想都想不对,想去找最近的不合法的点,复杂度太高。看了题解才知道是用ST算法的。先前不知道,这是一篇很不错的ST算法的介绍。/article/1944874.html
枚举左边端点,二分右端点,用ST算法判断该区间是否合法,直至右端点到极限(即二分的左右边界相遇或交叉)。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> #include <vector> #include <cmath> #include <algorithm> #define mod 1000000007 using namespace std; int t,n,k; int a[100100],minn[100010][20],maxn[100010][20],mid; long long ans; void Rmq_Init() { int m=19; for(int i=1;i<=n;i++) maxn[i][0]=minn[i][0]=a[i]; for(int i=1;i<=m;i++) for(int j=n;j;j--) { maxn[j][i]=maxn[j][i-1]; minn[j][i]=minn[j][i-1]; if(j+(1<<(i-1))<=n) { maxn[j][i]=max(maxn[j][i],maxn[j+(1<<(i-1))][i-1]); minn[j][i]=min(minn[j][i],minn[j+(1<<(i-1))][i-1]); } } } int Query_dif(int l,int r) { int m=floor(log((double)(r-l+1))/log(2.0)); int Max=max(maxn[l][m],maxn[r-(1<<m)+1][m]); int Min=min(minn[l][m],minn[r-(1<<m)+1][m]); return Max-Min; } int solve(int l) { int le,ri; le=l; ri=n; while(le<=ri) { mid=(le+ri)/2; if(Query_dif(l,mid)>=k) { ri=mid-1; } else { le=mid+1; } } /*if(Query_dif(l,mid)>=k) return mid-l; else return mid-l+1;*/ return ri-l+1; } int main() { scanf("%d",&t); while(t--) { ans=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } Rmq_Init(); for(int i=1;i<=n;i++) { ans=ans+solve(i); //cout<<i<<" "<<Query_dif(i,n)<<endl; //cout<<ans<<endl; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 原子上下文
- spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)
- 菜鸟学Linux命令:ssh命令 远程登录
- mongo数据库。
- 影响软件开发时间估算有哪些方面
- -Dmaven.multiModuleProjectDirectory system propery is not set.
- Linux系统管理之模块管理、打印机设置(笔记)
- iOS开发之获取沙盒路径
- GRE写作必备句型
- 记一次失败的面试
- 链接器link.exe 编译器cl.exe 资源编译器rc.exe
- hibernate mysql concat 查询 结果 乱码
- Storm源码浅析之topology的提交
- 贪心法,拟阵和亚模函数(refer)
- js事件之onmousedown和onmouseup
- arping 通知网关刷新IP
- ubuntu 添加 Samba 然后windows 共享
- Java中的static关键字解析
- Linux Redhat 6.4 LAMP 平台搭建
- linux shell bash使用管道|和read结合时问题解决