您的位置:首页 > 其它

Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes ACM解题报告(预处理)

2015-01-25 16:57 337 查看
这题是预处理的题。

ans=(当前区间内的总糖果数-当前区间内放对位置的糖果数)+(需要放的糖果数-当前区间内放对位置的糖果数)

前者是需要拿走的,后者是需要放入的。

当前区间内的糖果数是需要枚举计算n+count*k-1(1<=n<=k)到n的区间内放对位置的糖果数的累计和。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[100005];
bool b[100005];
int d[100005];
int main()
{
    int n,k,w;
    char c;
    scanf("%d%d%d",&n,&k,&w);
    memset(b,0,sizeof(b));
    getchar();
    int num=0;
    a[0]=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%c",&c);
        if(c=='1')
        {
            b[i]=true;
            num++;
        }
        a[i]=num;
    }
    memset(d,0,sizeof(d));
    for(int i=1;i<=k;i++)
    {
        int tot=0;
        for(int count=1;i+count*k-1<=n;count++)
        {
            if(b[i+count*k-1])
            {
                tot++;
            }
            d[i+count*k-1]=tot;
        }
    }
    //for(int i=1;i<=n;i++) printf("%d ",d[i]);
    while(w--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        int cnt=(r-l+1)/k;
        printf("%d\n",a[r]-a[l-1]+cnt-2*(d[r]-d[l-1]));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: