2015 Multi-University Training Contest 1 /hdu 5289 Assignment -树状数组

来源:互联网 发布:联通软件研究院面试 编辑:程序博客网 时间:2024/05/22 07:48

点击打开题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5289


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 100100#define lowbit(i) (i&(-i))int tree1[MAXN],tree2[MAXN];//int max(int a,int b)//{//return a>b?a:b;//}//int min(int a,int b)//{//return a<b?a:b;//}// //int lowbit(int i)//{//return i&(-i);//}void addmin(int i,int num){while(i<MAXN){tree1[i]=min(tree1[i],num);i+=lowbit(i);}}int querymin (int i){int sum=MAXN;while(i){sum=min(sum,tree1[i]);i-=lowbit(i);}return sum;}void addmax(int i,int num){while(i<MAXN){tree2[i]=max(tree2[i],num);i+=lowbit(i);}}int querymax(int i){int sum=0;while(i){sum=max(sum,tree2[i]);i-=lowbit(i);}return sum;}int main(){int num[MAXN];int T,n,k;scanf("%d",&T);while(T--){scanf("%d %d",&n,&k);memset(num,0,sizeof(num));memset(tree1,MAXN,sizeof(tree1));memset(tree2,0,sizeof(tree2));for(int i=1;i<=n;i++) {scanf("%d",&num[i]);}long long ans=0; //竟然忽略了这个, WAWAWAWAWAWWA for(int i=n;i>0;i--){addmin(i,num[i]);addmax(i,num[i]);int low=i;int high=n;while(low<=high){int mid= (low+high)/2;int ma=querymax(mid);int mi=querymin(mid);if(ma-mi>=k){high=mid-1;}else{low=mid+1;}}ans+=(low-i);  //low是当前右边界,i是当前左边界 }printf("%lld\n",ans);}return 0;}


0 0