高效算法设计专项:LA 4726
2013-05-20 21:25
393 查看
这是一道斜率优化的题目。在《浅谈数形结合思想在信息学竞赛中的应用》中有较为详细的解释,对于细节的实现还是没有完全体会,只能说是似懂非懂。这里我就不班门弄斧了,还是去仔细研究那篇论文吧。
#include <iostream> #include <cstdio> using namespace std; #define M 100010 int n,l; char d[M]; int q[M],s[M]; int main() { freopen("in.txt","r",stdin); int T; cin>>T; while(T--) { cin>>n>>l>>d; s[0]=0; for(int i=1;i<=n;i++) { if(d[i-1]=='1') s[i]=s[i-1]+1; else s[i]=s[i-1]; } int head=0,tail=-1; int beg=1,end=l; int a=s[l]-s[0],b=l; for(int i=l;i<=n;i++) { int tmp=i-l; while(head<tail&&(s[tmp]-s[q[tail]])*(q[tail]-q[tail-1])<=(s[q[tail]]-s[q[tail-1]])*(tmp-q[tail])) tail--; q[++tail]=tmp; while(head<tail&&(s[i]-s[q[head]])*(i-q[head+1])<=(s[i]-s[q[head+1]])*(i-q[head])) head++; if((s[i]-s[q[head]])*b==a*(i-q[head])&&b>i-q[head]) { a=s[i]-s[q[head]]; b=i-q[head]; beg=q[head]+1; end=i; } else if((s[i]-s[q[head]])*b>a*(i-q[head])) { a=s[i]-s[q[head]]; b=i-q[head]; beg=q[head]+1; end=i; } } cout<<beg<<" "<<end<<endl; } return 0; }
相关文章推荐
- 高效算法设计专项:LA 4356
- 高效算法设计专项:LA 2689
- 高效算法设计专项:LA 2963
- 高效算法设计专项:UVa 10535
- 高效算法设计专项:UVa 10391
- 高效算法设计专项:UVa 11054
- 高效算法设计专项:UVa 10691
- 高效算法设计专项:UVa 10730
- SEERC 2006 Subsequence, 高效算法设计 ,LA 2678
- 高效算法设计专项:UVa 11572
- 高效算法设计专项:UVa 10125
- 高效算法设计专项:UVa 10827
- 高效算法设计专项:UVa 10810
- 算法竞赛入门经典:第八章 高效算法设计 8.4快速排序应用之第k小的数
- 算法竞赛入门经典:第八章 高效算法设计 8.16贪心之乘船问题
- 高效算法设计_算法分析初步(最大连续和)
- 【算法】如何设计--高效的大数据匹配算法
- 如何高效设计游戏——从抽奖模型到圆桌算法(下)
- 集训第四周(高效算法设计)G题 (贪心)
- 集训第四周(高效算法设计)K题 (滑窗问题)