河南理工大学算法协会暑期集训积分赛(二)网络同步赛Numbers of interval尺取法

原题链接:https://hpuoj.com/contest/24/problem/E/

思路:一般的尺取法,不断更新左端点的值。

 1 #include<iostream>
 2 #include<iomanip>
 3 #include<string.h>
 4 #include<set>
 5 #include<map>
 6 #include<stdio.h>
 7 #include<queue>
 8 #define inf 0x3f3f3f3f
 9 const int N=1000020;
10 using namespace std;
11 typedef long long ll;
12 
13 int a[N];
14 
15 int main()
16 {
17     std::ios::sync_with_stdio(false);
18     cin.tie(0);
19     cout.tie(0);
20     int n,k;
21     cin>>n>>k;
22     memset(a,0,sizeof(a));
23     // memset(sum,0,sizeof(sum));
24     //  sum[0]=0;
25     int l=1;
26     ll sum=0,ans=0;//ans要设成ll,不然第二组数据就过不去
27     for(int i=1; i<=n; i++)
28     {
29         cin>>a[i];
30         //sum[i]=sum[i-1]+a[i];
31         sum+=a[i];
32         while(l<=i&&sum>=k)
33         {
34             //  l++;
35             ans=ans+n-i+1;
36             sum-=a[l];
37             l++;
38         }
39     }
40     cout<<ans<<endl;
41     return 0;
42 }

这是直接调用库函数的一种写法(和上面的原理一样):

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+100;
 4 typedef long long ll;
 5 long long a[N],sum[N];
 6 int main()
 7 {
 8     int n,k;
 9     cin>>n>>k;
10     for(int i=1; i<=n; i++) 
11     {
12         cin>>a[i];
13         sum[i]=sum[i-1]+a[i];
14     }
15     
16     long long ans=0;
17     for(int l=1; l<=n; l++)
18     {
19         int id=lower_bound(sum+1,sum+n+1,k+sum[l-1])-sum;
20         ans+=(n-id+1);
21     }
22     cout<<ans<<endl;
23     return 0;
24 }
原文地址:https://www.cnblogs.com/OFSHK/p/11259339.html