斜率优化&单调队列
我也还没看懂
《浅谈数形结合思想在信息学竞赛中的应用》
#include
#include
#include
using namespace std;
const int MAXN(100010);
char str[MAXN];
int que[MAXN];
double sum[MAXN];
int front, rear;
double get_k(int a, int b)
{
return
(sum[b]-sum[a])/(b-a);
}
int main()
{
int
T;
scanf("%d",
&T);
while(T--)
{
int n, l , i;
scanf("%d%d", &n, &l);
scanf("%s", str+1);
for(i = 1; i <= n; ++i)
sum[i] = sum[i-1]+str[i]-'0';
front = 0;
rear = -1;
int s = 0, e = l;
double ans = get_k(s, e);
int al = l;
for(i = l; i <= n; ++i)
{
int temp = i-l;
while(front < rear && get_k(que[rear], temp) <=
get_k(que[rear-1], que[rear]))
--rear;
que[++rear] = temp;
while(front < rear && get_k(que[front], i) <=
get_k(que[front+1], i))
++front;
double tans = get_k(que[front], i);
if(tans == ans && i-que[front] <
al)
{
al = i-que[front];
s = que[front];
e = i;
}
else
if(tans > ans)
{
ans = tans;
al = i-que[front];
s = que[front];
e = i;
}
}
printf("%d %d\n", s+1, e);
}
return
0;
}