2 条题解

  • 2
    @ 2023-11-20 18:30:37

    确实大差不差

    二分解法:

    #include<stdio.h>
    
    long long a[200010];
    long long h[200010];
    
    int main()
    {
    	int n;
    	long long mi, mx, ans = 0;
    	scanf("%d %lld %lld", &n, &mi, &mx);
    	for(int i = 1; i <= n; i++)
    	{
    		scanf("%lld", &a[i]);
    		h[i] = h[i - 1] + a[i];//前缀和计算
    	}
    	for(int i = 1; i <= n; i++)
    	{
    		int l1 = i, r1 = n;
    		if(h[r1] - h[i - 1] >= mi)
    		{
    			while(l1 < r1)//二分查大于等于最小边界值有多少个区间
    			{
    				int miid = (l1 + r1) / 2;
    				if(h[miid] - h[i - 1] >= mi)
    					r1 = miid;
    				else
    					l1 = miid + 1;
    			}
    			ans += n - l1 + 1;//ans加上这些区间个数
    			l1 = i, r1 = n;
    			if(h[r1] - h[i - 1] > mx)
    			{
    				while(l1 < r1)//二分查大于最大边界值有多少个区间
    				{
    					int miid = (l1 + r1) / 2;
    					if(h[miid] - h[i - 1] > mx)
    						r1 = miid;
    					else
    						l1 = miid + 1;
    				}
    				ans -= n - l1 + 1;//ans减去这些超出最大值的区间个数
    			}
    		}
    	}
    	printf("%lld", ans);
    	return 0;
    }
    

    信息

    ID
    941
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    339
    已通过
    31
    上传者