LA 4726 Average

斜率优化&单调队列

我也还没看懂

《浅谈数形结合思想在信息学竞赛中的应用》

#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; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值