http://acm.timus.ru/problem.aspx?space=1&num=2062

题意:有n个数,有一个值,q个询问,有单点询问操作,也有对于区间[l,r]的每个数i,使得num[i] + w, num[i*2] + w, num[i*3] + w……

思路:有树状数组和分块两种做法,对比后分块的速度比较快(暴力的艺术)。线段树会超时(可能写法不好)。

1、树状数组用到的是单点询问区间修改,我要注意一下其写法...修改为:Add(l, w), Add(r + 1, -w); 查询为:Sum(w);

bit[]维护增加的值,每次询问的时候只要去查询该位置的所有因子的位置增加的值,还有加上本来的数字就可以了。

2、分块的做法也是类似,因为单点修改的时候增加的值不能直接加在原来的num上,所以要多开一个every数组来记录单点修改。

查询的时候每个位置就是every[i] + block[belong[i]]。

也要注意一下分块的写法= =。

先判断是否在同一块,如果在同一块就暴力扫而不是直接block+w,因为L和R不一定在边界。。。

分块:

 #include <bits/stdc++.h>
using namespace std;
#define N 300010
typedef long long LL;
LL cnt, sz, block[N], every[N], l[N], r[N], belong[N], num[N], n, q; void Build() {
sz = sqrt(n);
cnt = n / sz; if(n % sz) cnt++;
for(int i = ; i <= cnt; i++)
l[i] = (i - ) * sz + , r[i] = i * sz;
r[cnt] = n;
for(int i = ; i <= n; i++)
belong[i] = (i - ) / sz + ;
} void Update(int L, int R, int w) {
if(belong[L] == belong[R])
for(int i = L; i <= R; i++) every[i] += w;
else {
for(int i = L; i <= r[belong[L]]; i++) every[i] += w;
for(int i = belong[L] + ; i <= belong[R] - ; i++) block[i] += w;
for(int i = l[belong[R]]; i <= R; i++) every[i] += w;
}
} LL solve(int n) {
int tmp = sqrt(n); LL ans = ;
for(int i = ; i <= tmp; i++) {
if(n % i == ) {
ans += block[belong[i]] + every[i];
if(i != n / i) ans += block[belong[n/i]] + every[n/i];
}
}
return ans;
} int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = ; i <= n; i++) cin >> num[i];
Build();
cin >> q;
while(q--) {
int l, r, w, kind;
cin >> kind;
if(kind == ) {
cin >> w;
cout << solve(w) + num[w] << '\n';
cout.flush();
} else {
cin >> l >> r >> w;
Update(l, r, w);
}
}
}

树状数组:

 #include <bits/stdc++.h>
using namespace std;
#define N 300010
typedef long long LL;
LL bit[N], num[N];
int n, q;
// 区间更新,单点查询
int lowbit(int x) { return x & (-x); }
void Add(int x, int w) { for(int i = x; i <= n; i += lowbit(i)) bit[i] += w; }
LL Sum(int x) { LL ans = ; for(int i = x; i; i -= lowbit(i)) ans += bit[i]; return ans; }
LL solve(int n) {
int tmp = sqrt(n); LL ans = ;
for(int i = ; i <= tmp; i++) {
if(n % i == ) {
ans += Sum(i);
if(i != n / i) ans += Sum(n / i);
}
}
return ans;
} int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = ; i <= n; i++) cin >> num[i];
cin >> q;
while(q--) {
int kind, l, r, w;
cin >> kind;
if(kind == ) {
cin >> w;
cout << solve(w) + num[w] << '\n';
cout.flush();
} else {
cin >> l >> r >> w;
Add(l, w); Add(r + , -w);
}
}
return ;
}

Ural 2062:Ambitious Experiment(树状数组 || 分块)的更多相关文章

  1. ural Ambitious Experiment 树状数组

    During several decades, scientists from planet Nibiru are working to create an engine that would all ...

  2. BZOJ_2141_排队_树状数组+分块

    BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...

  3. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  4. ural 2062 Ambitious Experiment

    2062. Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scient ...

  5. bzoj 4765 普通计算姬(树状数组 + 分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4765 很nice的一道题啊(可能是因为卡了n久终于做出来了 题意就是给你一棵带点权的有根树,sum( ...

  6. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树状数组+分块)

    Given a rooted tree ( the root is node 1 ) of N nodes. Initially, each node has zero point. Then, yo ...

  8. 【BZOJ2141】排队 树状数组+分块

    [BZOJ2141]排队 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备 ...

  9. Codeforces Round #404 (Div. 2) A,B,C,D,E 暴力,暴力,二分,范德蒙恒等式,树状数组+分块

    题目链接:http://codeforces.com/contest/785 A. Anton and Polyhedrons time limit per test 2 seconds memory ...

随机推荐

  1. POJ读书笔记2.1 —— 鸡兔笼带

    http://blog.csdn.net/pipisorry/article/details/36433305 问题描写叙述  一个笼子里面关了鸡和兔子(鸡有2仅仅脚.兔子有4仅仅脚.没有例外). 已 ...

  2. mysql常见操作汇总 专题

    mysql中in多个字段 1. 基本用法 SELECT * FROM USER WHERE , , ); 2. 多个字段同时使用 SELECT * FROM USER WHERE (, ),(, ), ...

  3. WPF 4 开发Windows 7 跳转列表(JumpList)

    原文:WPF 4 开发Windows 7 跳转列表(JumpList)      在之前写过的<Windows 7 任务栏开发系列>中我们通过Visual Studio 2008 借助微软 ...

  4. C#调用C/C++ DLL 参数传递和回调函数的总结

    原文:C#调用C/C++ DLL 参数传递和回调函数的总结 Int型传入: Dll端: extern "C" __declspec(dllexport) int Add(int a ...

  5. 毕业设计之感悟 —— UML 与 ER 图

    今天毕业设计答辩,虽然我第一个上场,但是不是特别紧张,因为整个系统都是我写的.我以为自己天衣无缝,能应付所有老师的所有问题.事实上,我被老师教育了一番. 老师说我,毕业论文中没有一个类.我一开始比较懵 ...

  6. [原译]WPF绘制圆角多边形

    原文:[原译]WPF绘制圆角多边形 介绍 最近,我发现我需要个圆角多边形.而且是需要在运行时从用户界面来绘制.WPF有多边形.但是不支持圆角.我搜索了一下.也没找到可行的现成例子.于是就自己做吧.本文 ...

  7. WPF三维图形

    原文:WPF三维图形 wpf 三维图形基础生成三维图形的基本思想是能得到一个物体的三维立体模型(model).由于我们的屏幕只有二维,因而我们定义了一个用于给物体拍照的照相机(Camera).拍到的照 ...

  8. PySide——Python图形化界面入门教程(六)

    PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...

  9. Qt之自定义搜索框——QLineEdit里增加一个Layout,还不影响正常输入文字(好像是一种比较通吃的方法)

    简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...

  10. C# 获取当前月份天数的三种方法总结

    方法一: //最有含量的一种 int days = System.Threading.Thread.CurrentThread.CurrentUICulture.Calendar.GetDaysInM ...