POJ-3468 A Simple Problem with Integers(分块 区间加+区间查询)
来源:互联网 发布:linux下cp命令 编辑:程序博客网 时间:2024/06/05 07:51
题目:http://poj.org/problem?id=3468
题意:
C:区间加值 Q:询问区间和
思路:分块,参考hzwer
atag数组代表每个整体块加的值,sum数组为每个位置单独加(非整体块)的值
区间修改和区间查询复杂度都是
代码:
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int N = 1e5+5;int n,q,blo;int v[N],bl[N],atag[N];ll sum[N];void add(int a,int b,int c){ for(int i = a;i <= min(bl[a]*blo,b);i++) v[i] += c,sum[bl[a]] += c; if(bl[a] != bl[b]) for(int i = (bl[b]-1)*blo+1;i <= b;i++) v[i] += c,sum[bl[b]] += c; for(int i = bl[a]+1;i <= bl[b]-1;i++) atag[i] += c;}ll query(int a,int b){ ll ans = 0; for(int i = a;i <= min(bl[a]*blo,b);i++) ans += 1ll*v[i] + atag[bl[a]]; if(bl[a] != bl[b]) for(int i = (bl[b]-1)*blo+1;i <= b;i++) ans += 1ll*v[i] + atag[bl[b]]; for(int i = bl[a]+1;i <= bl[b]-1;i++) ans += sum[i] + 1ll*atag[i]*blo; return ans;}int main(){ scanf("%d%d",&n,&q); blo = sqrt(n); for(int i = 1;i <= n;i++) scanf("%d",&v[i]); for(int i = 1;i <= n;i++) { bl[i] = (i - 1)/blo + 1; sum[bl[i]] += v[i]; } char op[5]; int x,y,z; while(q--) { scanf("%s",op); if(op[0] == 'C') { scanf("%d%d%d",&x,&y,&z); add(x,y,z); } else { scanf("%d%d",&x,&y); printf("%lld\n",query(x,y)); } } return 0;}
阅读全文
0 0
- POJ-3468 A Simple Problem with Integers(分块 区间加+区间查询)
- POJ 3468 A Simple Problem with Integers(线段树区间更新区间查询)
- POJ 3468 A Simple Problem with Integers 树状数组(区间更新,区间查询)
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
- 线段树 (更新区间查询区间)poj 3468 A Simple Problem with Integers
- POJ - 3468 A Simple Problem with Integers (区间求和)
- POJ 3468 A Simple Problem with Integers (区间增减)
- POJ 3468 A Simple Problem with Integers(区间更新)
- POJ 3468 A Simple Problem with Integers(区间更新)
- POJ 3468 A Simple Problem with Integers (线段树 区间共加)
- poj 3468 A Simple Problem with Integers经典区间更新区间查询
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- poj 3468 A Simple Problem with Integers【线段树】区间延迟,区间查询
- POJ 3468 A Simple Problem with Integers (树状数组解法 树状数组区间更新 区间查询)
- POJ 3468 A Simple Problem with Integers (树状数组) (区间修改+区间查询)
- poj 3468 A Simple Problem with Integers(区间查询区间更新)
- POJ 3468 A Simple Problem with Integers(树状数组区间修改+区间查询)
- HDU
- java单例模式
- Java中字符串内存位置
- javac 编译原理
- hdu 6181
- POJ-3468 A Simple Problem with Integers(分块 区间加+区间查询)
- udp数据报从网卡驱动到用户空间流程总结
- java 中switch基本用法
- 实体类的变量名称一定是小写!
- 关系运算
- Okhttp和Gson解析
- Unity资源处理机制(Assets/WWW/AssetBundle/...)读取和加载资源方式详解
- js 加密库crypto-js
- web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。