河南理工大学算法协会暑期集训积分赛(二)网络同步赛-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 }
分类:
数论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」