51Nod 1542 羊圈偷袭

来源:互联网 发布:长安大学网络教育 编辑:程序博客网 时间:2024/06/11 21:28

分块

考虑到这个问题太具有一般性,没什么性质能搞。分块处理询问即可,大b直接跑,小b预处理。

然后会被卡常数,加上输入优化,调整一下块大小即可。

#include<cstdio>#include<algorithm>#define N 300005#define S 250using namespace std;namespace runzhe2000{    int read()    {        int r = 0; char c = getchar();        for(; c < '0' || c > '9'; c = getchar());        for(; c >='0' && c <='9'; r = r*10+c-'0', c = getchar());        return r;    }    typedef long long ll;    struct query{int a, b, id;}que[N];    int w[N], n, m, qcnt, ccnt;    ll sum[N], ans[N];    bool cmp(query u, query v){if(u.b != v.b) return u.b > v.b; else return u.a > v.a;}    void main()    {        n=read();        for(int i = 1; i <= n; i++)w[i]=read();        m=read();        for(int i = 1; i <= m; i++)        {            int a=read(),b=read();            if(b >= S) for(int j = a; j <= n; j += b) ans[i] += w[j];            else que[++qcnt] = (query){a, b, i};        }        sort(que+1, que+1+qcnt, cmp);         int cur = 1;        for(int i = S-1; i && cur <= qcnt; i--)        {            for(int j = n; j && que[cur].b == i; j--)            {                sum[j] = j+i<=n ? sum[j+i] + w[j] : w[j];                for(; que[cur].a == j && que[cur].b == i; cur++) ans[que[cur].id] = sum[j]; ccnt++;            }        }        for(int i = 1; i <= m; i++) printf("%I64d\n",ans[i]);    }}int main(){    runzhe2000::main();}
0 0
原创粉丝点击