河南理工大学算法协会暑期集训积分赛网络同步赛-Numbers of interval-尺取法
Posted ofshk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了河南理工大学算法协会暑期集训积分赛网络同步赛-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
以上是关于河南理工大学算法协会暑期集训积分赛网络同步赛-Numbers of interval-尺取法的主要内容,如果未能解决你的问题,请参考以下文章