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 }

 

转载于:https://www.cnblogs.com/lonelycatcher/archive/2011/11/28/2265756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值