UESTC 1598 兰斯的后宫计划

这道题可以用线段树来求解,当然,如果给的数据没有负值,同样可以用二分的思想去做,效率和线段树差不多

View Code
 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #define max(a,b) a>b?a:b
5 struct node
6 {
7 int left,right,maxSum;
8 };
9 node Tree[400100];
10 int sum[100010],value[100010];
11 void build_tree(int k,int left,int right)
12 {
13 Tree[k].left=left;
14 Tree[k].right=right;
15 if(left==right)
16 {
17 Tree[k].maxSum=sum[left];
18 return ;
19 }
20 int mid=(left+right)>>1;
21 build_tree(k<<1,left,mid);
22 build_tree((k<<1)+1,mid+1,right);
23 Tree[k].maxSum=max(Tree[k<<1].maxSum,Tree[(k<<1)+1].maxSum);
24 }
25 int findMinIndex(int k,int val)
26 {
27 if(Tree[k].left==Tree[k].right)return Tree[k].left;
28 if(Tree[k<<1].maxSum>=val)return findMinIndex(k<<1,val);
29 else return findMinIndex(2*k+1,val);
30 }
31 int main(void)
32 {
33 int T,n,m,i,j;
34 scanf("%d",&T);
35 while(T--)
36 {
37 scanf("%d %d",&n,&m);
38 sum[0]=0;
39 int ans=0;
40 for(i=1;i<=n;i++)
41 {
42 scanf("%d",&value[i]);
43 sum[i]=sum[i-1]+value[i];
44 }
45 build_tree(1,0,n);
46 for(i=1;i<=n;i++)
47 {
48 int temp=findMinIndex(1,sum[i]-m);
49 ans=max(ans,i-temp);
50 }
51 printf("%d\n",ans);
52 }
53 }

 

posted on 2011-11-28 09:22  lonelycatcher  阅读(389)  评论(0编辑  收藏  举报

导航