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
- 51Nod 1542 羊圈偷袭
- 偷袭珍珠港事件
- 偷袭珍珠港事件(续)
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- UNIX网络编程
- C++11新标准总结
- [JZOJ5023]Sequence
- 织梦修改默认模板
- 程序测试技巧总结
- 51Nod 1542 羊圈偷袭
- 关于发邮件报错535 Error:authentication failed解决方法
- First Blood (最大最小公倍数)
- JavaScript中的数组知识点全总结
- android性能优化的相关视频资料
- string.xml 占位符 替换 文件
- Android应用程序资源的编译和打包过程分析
- sscanf 函数的用法
- Android应用程序资源的编译和打包过程分析