题意:

n个数字

下面n个数字表示数列

2个操作

1 [u, v]  k  add

[u,v ]区间 (u点要计算)每隔k个位置,该数字+add

2 pos

询问 pos下标的值(下标从1开始)

思路:

因为k很小, 可以直接存 k[11]

注意查询时, 先找到 pos 所在的 叶子节点

再向上 添加 对应k位置的值

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<queue>
#include<string.h>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<math.h>
#define inf 10000000
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Mid(x,y) ((x+y)>>1)
#define ll __int64
using namespace std;
inline ll Min(ll a,ll b){return a>b?b:a;}
inline ll Max(ll a,ll b){return a<b?b:a;} #define N 51000
struct node{
ll l, r;
ll k[11];
}tree[N*16];
ll a[N]; void build(ll l, ll r, ll id){
memset(tree[id].k, 0, sizeof(tree[id].k));
tree[id].l = l, tree[id].r = r; if(l == r) return ; ll mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
} void updata(ll l, ll r, ll pos, ll add, ll id){
if(l > r)return ;
if(l == tree[id].l && tree[id].r == r)
{
tree[id].k[pos] += add;
return;
}
ll mid = Mid(tree[id].l, tree[id].r);
if(r<=mid)
updata(l, r, pos, add, L(id));
else if(mid<l)
updata(l, r, pos, add, R(id));
else
{
updata(l, mid, pos, add, L(id));
updata(l + ((mid-l)/pos+1)*pos,r,pos, add, R(id));
}
} ll find(ll pos){
ll id = 1;
while(1){
if(tree[id].l == tree[id].r) return id; ll mid = Mid(tree[id].l, tree[id].r);
if(pos <= mid) id = L(id);
else id = R(id);
}
} ll query(ll pos, ll id, ll num){
for(ll i =1;i<11 ;i++)
if((pos-tree[id].l) % i==0)
num += tree[id].k[i]; if(id == 1) return num;
return query(pos, id/2, num);
} int main(){
ll i, j, n, que;
ll u, v, mod, add;
while(~scanf("%I64d",&n)){ for(i=1;i<=n;i++)scanf("%I64d",&a[i]);
build(1, n, 1);
scanf("%I64d",&que);
while(que--){
scanf("%I64d",&i);
if(i==2)
{
scanf("%I64d",&j);
printf("%I64d\n",query(j ,find(j), a[j]));
}
else
{
scanf("%I64d %I64d %I64d %I64d",&u,&v,&mod,&add);
updata(u, v, mod, add, 1);
}
}
}
return 0;
}
/*
10
0 0 0 0 0 0 0 0 0 0
99
1 1 10 2 5
2 1
2 2
2 3
2 4
2 5
2 9
2 10
1 3 6 3 10
2 3
2 4
2 5
2 6 ans:
5
0
5
0
5
5
0
15
0
5
10 */

HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询的更多相关文章

  1. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdu 4267 线段树间隔更新

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. HDU 1556 Color the ball(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  4. hdu 1698:Just a Hook(线段树,区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. UVA 12436-Rip Van Winkle's Code(线段树的区间更新)

    题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...

  6. hdu1698线段树的区间更新区间查询

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. zoj3686(线段树的区间更新)

    对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a ...

  8. Color the ball (线段树的区间更新问题)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  9. ZOJ 2301 Color the Ball 线段树(区间更新+离散化)

    Color the Ball Time Limit: 2 Seconds      Memory Limit: 65536 KB There are infinite balls in a line ...

随机推荐

  1. OpenGL: 环境配置和图元的绘制

    前言 距离上一篇博客已经过去一个半月了,这段时间过得确实充实,虽然一大段时间泡在图书馆复习,但至少也能学到点东西.跨年晚和元旦一整天,全身心投入图形学小课设的编程,终于实现了老师要求的所有功能,回想起 ...

  2. python --appium搭建环境过程 ---新手总结(大牛勿喷,新手互相交流)

    首先安装python 安装包:https://yunpan.cn/cSdYZqjJ4xDZ3  访问密码 4bf9 1.安装pip   cd 到pip安装包  python setup.py inst ...

  3. Linux远程连接与常用命令

    要学linux ,一定得用命令界面的,怎么也得是shell语言,用就最难最原始的,用的人都是专家,历史最少也得30年,不管有三七二十一上来就敲ls ,先看看当前目录都有什么.一口专业的linux范儿, ...

  4. C++模板:ST算法

    //初始化 void init_rmq(int n){ for(int i=0;i<n;i++)d[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) ...

  5. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

  6. 网络收发之cycleBuf

    #pragma once #include <iostream> #include <string> class cyclebuffer { protected: volati ...

  7. js动画学习(四)

    七.多属性封装函数 前面分别介绍了单独改变单一属性值得动画,从本节起开始介绍多属性封装函数,一个函数搞定多种属性值的改变. 首先介绍一个很重要的函数getStyle(),这个函数返回一个元素的当前属性 ...

  8. Stack集合、queue集合、hashtable集合

    1.栈:Stack,先进后出,一个一个赋值,一个一个取值,按顺序. .count           取集合内元素的个数 .push()         将元素一个一个推入集合中//stack集合存入 ...

  9. .net EF中从数据添加表或视图时无法添加的问题

    .net 使用EF模式进行开发,添加实体时不能够正常添加 错误描述: .net中在EF文件中添加数据库中已有的表或视图时不能正常添加,在添加时没有任何的错误提示,但是表或视图就一直拉不过来,,保存也没 ...

  10. 五毛的cocos2d-x学习笔记04-触摸点

    Touch position是屏幕坐标系中的点,OpenGL position是cocos2d-x用到的OpenGL坐标系上的点坐标.所以就需要将touch的坐标转换成OpenGL坐标系中的点坐标. ...