标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3175 Accepted Submission(s): 1457
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAXN 100010 4 int n,mn[MAXN][17],mx[MAXN][17],a[MAXN]; 5 int read() 6 { 7 int s=0,fh=1;char ch=getchar(); 8 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();} 9 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();} 10 return s*fh; 11 } 12 void ST() 13 { 14 int i,j; 15 for(i=1;i<=n;i++)mn[i][0]=mx[i][0]=a[i]; 16 for(j=1;(1<<j)<=n;j++) 17 { 18 for(i=1;i+(1<<j)-1<=n;i++) 19 { 20 mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); 21 mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); 22 } 23 } 24 } 25 int Query(int l,int r) 26 { 27 int j; 28 for(j=0;(1<<j)<=(r-l+1);j++);j--; 29 return max(mx[l][j],mx[r-(1<<j)+1][j])-min(mn[l][j],mn[r-(1<<j)+1][j]); 30 } 31 int main() 32 { 33 int T,k,i,left,right; 34 long long ans; 35 T=read(); 36 while(T--) 37 { 38 n=read();k=read(); 39 for(i=1;i<=n;i++)a[i]=read(); 40 ST(); 41 left=1;//左端点(左端点一定是单调递增的) 42 ans=0; 43 for(right=1;right<=n;right++)//枚举右端点 44 { 45 while(Query(left,right)>=k&&left<right)left++;//在枚举右端点的同时,移动左端点.每次改变右端点时,左端点只可能不变或向右移动. 46 ans+=((long long)right-left+1LL);//统计的子串为以右端点为最右端,最左端在 右端点->左端点 之间. 47 } 48 printf("%lld\n",ans); 49 } 50 fclose(stdin); 51 fclose(stdout); 52 return 0; 53 }
标签:
原文地址:http://www.cnblogs.com/Var123/p/5404427.html